2011-01-20 38 views
20

Sử dụng phiên bản xác suất của phép thử Miller-Rabin, tôi đã tạo danh sách các số nguyên tố có thể có kích thước trung bình (200-300 chữ số). Nhưng có thể xảy ra không đủ tốt! Tôi cần phải biết những số này là số nguyên tố. Có một thư viện nào đó - tốt nhất là gói hoặc bọc trong Python - mà thực hiện một trong các thuật toán chứng minh nguyên thủy hiệu quả hơn?Chứng minh tính nguyên thủy của các số nguyên tố có thể xảy ra mạnh mẽ

Ngoài ra, không ai biết nơi tôi có thể tìm thấy một rõ ràng, chi tiết, và hoàn mô tả về ECPP (hoặc một thuật toán nhanh tương tự) mà không giả định rất nhiều kiến ​​thức trước?

Cập nhật: Tôi đã tìm thấy một Java implementation của một thử nghiệm khác, APRT-CLE, chứng minh hoàn toàn tính nguyên thủy. Nó đã xác minh một ứng cử viên chính gồm 291 chữ số trong vòng chưa đầy 10 phút trên một bộ xử lý nguyên tử. Vẫn hy vọng điều gì đó nhanh hơn, nhưng điều này có vẻ như là một khởi đầu đầy hứa hẹn.

+0

Mô tả ECPP nào bạn đã đọc không rõ ràng, chi tiết hoặc hoàn chỉnh hoặc giả định quá nhiều kiến ​​thức trước? Chúng tôi không biết tiêu chuẩn của bạn về "kiến thức trước" có thể là gì. Vui lòng cung cấp một số thông tin cơ bản về những gì bạn đã thử cho đến thời điểm này. –

+1

Tôi thấy bạn muốn có một thư viện python, nhưng bạn đã xem xét việc kiểm tra phương thức Java http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html#isProbablePrime(int) ? Tôi nghĩ rằng họ cũng thực hiện các thuật toán Miller-Rabin, và từ kinh nghiệm cá nhân của tôi cho đến 500 chữ số, nó khá chính xác. –

+0

Thực ra, tôi đã có thuật toán Miller-Rabin được thực hiện trong python - dễ dàng, và nhanh chóng đáng kinh ngạc. Nhưng tôi muốn chắc chắn hơn một chút. (Hoặc vô cùng nhiều hơn, tùy thuộc vào cách bạn nhìn vào nó.) – senderle

Trả lời

9

Là một thuật toán cung cấp thử nghiệm nguyên sinh đa thức đáng tin cậy, hãy xem xét AKS. Có older SO article tham chiếu các triển khai và bản trình bày thuật toán.

+0

Thú vị, tôi sẽ xem xét điều đó. Sự hiểu biết của tôi là nó không phải là thử nghiệm nhanh nhất, nhưng có lẽ nó đủ nhanh cho các con số trong phạm vi kích thước của tôi. Cảm ơn! – senderle

+0

@senderle: nó cũng là sự hiểu biết của tôi rằng đây là thử nghiệm duy nhất hoàn toàn đáng tin cậy, theo nghĩa nó không phải là xấp xỉ và nó không dựa vào giả định chưa được chứng minh nhưng được tin tưởng rộng rãi (như giả thuyết Riemann)). –

+0

@Martin v. Löwis: Không được tranh cãi, nhưng [wikipedia dường như không đồng ý] (http://en.wikipedia.org/wiki/AKS_primality_test): "ECPP và APR kết luận chứng minh hoặc bác bỏ một số cho trước là số nguyên tố, nhưng không được biết là có giới hạn thời gian đa thức cho tất cả các yếu tố đầu vào. " Tuy nhiên, wikipedia đã được biết là sai. – senderle

6

Tôi nhận thấy rằng thư viện Pari/GP và ngôn ngữ sử dụng APR-CL để chứng minh tính nguyên thủy, vốn thực sự là thuật toán ưu tiên cho các số trong phạm vi kích thước này. GP chứng minh một ứng cử viên 291 chữ số chính trong dưới 20 giây trên một bộ vi xử lý nguyên tử, đó là đủ cho nhu cầu của tôi, và nó đi kèm với một thư viện c mà tôi có thể truy cập bằng cách sử dụng ctypes.

import ctypes 

def pari_isprime(self, n): 
    try: pari = ctypes.cdll.LoadLibrary("libpari.so") 
    except OSError: 
     print "pari_isprime: couldn't load libpari!" 
     exit() 
    int(n) 
    pari.pari_init(4000000, 2) 
    ret = bool(pari.isprime(pari.gp_read_str(str(n)))) 
    pari.pari_close() 
    return ret 

Tôi cũng có thể sử dụng mô-đun instant. Đây là hàm c đơn giản chạy chuỗi thông qua trình phân tích cú pháp của pari và trả về kết quả dưới dạng chuỗi:

from instant import inline 

runpari_code = """ 
PyObject* runpari(PyObject *args) { 
    pari_init(40000000, 2); 
    char *pari_code; 
    char *outstr; 

    if (!PyArg_Parse(args, "s", &pari_code)) { return NULL; } // instant uses old-style args; for a module, use PyArg_ParseTuple 
    outstr = GENtostr(gp_read_str(pari_code)); 
    pari_close(); 
    return Py_BuildValue("s", outstr); 
} 
""" 
runpari = inline(runpari_code, system_headers=['pari/pari.h'], libraries=['pari']) 

Ở trên cũng có thể được sử dụng làm cơ sở cho phần mở rộng CPython thích hợp.

Các vấn đề liên quan