Algoritma pengujian primitas deterministik (asimtotik) yang paling efisien adalah karena Lenstra dan Pomerance , berjalan dalam waktu . Jika Anda yakin dengan Hipotesis Riemann yang Diperpanjang, maka algoritma Miller berjalan dalam waktu . Ada banyak algoritma pengujian primality deterministik lainnya, misalnya kertas Miller memiliki algoritma , dan algoritma terkenal lainnya adalah Adleman-Pomerance-Rumley, berjalan dalam waktu .O~(log6n)O~(log4n)O~(n1/7)O(lognO(logloglogn))
Pada kenyataannya, tidak ada yang menggunakan algoritma ini, karena terlalu lambat. Alih-alih, algoritma pengujian primality probabilistik digunakan, terutama Miller-Rabin, yang merupakan modifikasi dari algoritma Miller yang disebutkan di atas (algoritma penting lainnya adalah Solovay-Strassen). Setiap iterasi Miller – Rabin berjalan dalam waktu , dan untuk probabilitas kesalahan konstan (katakanlah ) seluruh algoritma berjalan dalam waktu , yang jauh lebih cepat daripada Lenstra – Pomerance.O~(log2n)2−80O~(log2n)
Dalam semua tes ini, memori tidak menjadi masalah.
Dalam komentar mereka, jbapple mengangkat masalah memutuskan tes primality mana yang akan digunakan dalam praktik. Ini adalah pertanyaan implementasi dan pembandingan: menerapkan dan mengoptimalkan beberapa algoritma, dan secara eksperimental menentukan mana yang tercepat di kisaran mana. Bagi yang penasaran, para pembuat kode PARI melakukan hal itu, dan mereka datang dengan fungsi deterministik isprime
dan fungsi probabilistik ispseudoprime
, yang keduanya dapat ditemukan di sini . Uji probabilistik yang digunakan adalah Miller-Rabin. Yang deterministik adalah BPSW.
Berikut ini informasi lebih lanjut dari Dana Jacobsen :
Pari sejak versi 2.3 menggunakan bukti primitifitas APR-CL untuk isprime(x)
, dan kemungkinan uji BPSW (dengan uji Lucas "hampir ekstra kuat") untuk ispseudoprime(x)
.
Mereka memang mengambil argumen yang mengubah perilaku:
isprime(x,0)
(standar.) Menggunakan kombinasi (BPSW, teorema 5 Pocklington atau BLS75 cepat, April-CL).
isprime(x,1)
Menggunakan uji Pocklington-Lehmer (sederhana ).n−1
isprime(x,2)
Menggunakan APR-CL.
ispseudoprime(x,0)
(standar.) Menggunakan BPSW (MR dengan basis 2, Lucas "hampir ekstra kuat").
ispseudoprime(x,k)
(untuk ) Apakah MR menguji dengan basis acak. RNG diunggulkan secara identik di setiap run Pari (jadi urutannya deterministik) tetapi tidak diulang di antara panggilan seperti yang dilakukan GMP (Basis acak GMP sebenarnya adalah basis yang sama setiap panggilan jadi jika salah satu kali maka selalu salah).k≥1kmpz_is_probab_prime_p(x,k)
Pari 2.1.7 menggunakan pengaturan yang jauh lebih buruk. isprime(x)
hanya tes MR (default 10), yang menyebabkan hal-hal menyenangkan seperti isprime(9)
kembali benar cukup sering. Menggunakan isprime(x,1)
akan melakukan bukti Pocklington, yang baik untuk sekitar 80 digit dan kemudian menjadi terlalu lambat untuk berguna secara umum.
Anda juga menulis Pada kenyataannya, tidak ada yang menggunakan algoritma ini, karena terlalu lambat. Saya yakin saya tahu apa yang Anda maksud, tetapi saya pikir ini terlalu kuat tergantung pada audiens Anda. AKS tentu saja, sangat lambat, tetapi APR-CL dan ECPP cukup cepat sehingga beberapa orang menggunakannya. Mereka berguna untuk kripto paranoid, dan berguna bagi orang yang melakukan hal-hal seperti primegaps
atau di factordb
mana seseorang memiliki cukup waktu untuk menginginkan bilangan prima yang terbukti.
[Komentar saya tentang itu: ketika mencari bilangan prima dalam rentang tertentu, kami menggunakan beberapa pendekatan penyaringan diikuti oleh beberapa tes probabilitas yang relatif cepat. Hanya kemudian, jika sama sekali, kami menjalankan tes deterministik.]
Dalam semua tes ini, memori tidak menjadi masalah. Ini masalah bagi AKS. Lihat, misalnya, eprint ini . Beberapa di antaranya tergantung pada implementasinya. Jika seseorang mengimplementasikan apa yang disebut video numberphile AKS (yang sebenarnya merupakan generalisasi dari Teorema Kecil Fermat), penggunaan memori akan sangat tinggi. Menggunakan implementasi NTL dari algoritma v1 atau v6 seperti kertas yang direferensikan akan menghasilkan sejumlah besar memori. Implementasi GMP v6 yang baik masih akan menggunakan ~ 2GB untuk prime 1024-bit, yang banyakmemori untuk sejumlah kecil. Menggunakan beberapa perbaikan Bernstein dan segmentasi biner GMP menghasilkan pertumbuhan yang jauh lebih baik (misalnya ~ 120MB untuk 1024-bit). Ini masih jauh lebih besar dari yang dibutuhkan oleh metode lain, dan tidak mengherankan, akan jutaan kali lebih lambat daripada APR-CL atau ECPP.