Kapan tes primitif AKS sebenarnya lebih cepat dari tes lain?


24

Saya mencoba untuk mendapatkan ide tentang bagaimana uji primitif AKS harus ditafsirkan ketika saya mempelajarinya, misalnya konsekuensi wajar untuk membuktikan bahwa PRIMES ⊆ P, atau algoritma yang sebenarnya praktis untuk pengujian primality pada komputer.

Tes ini memiliki runtime polinomial tetapi dengan derajat tinggi dan konstanta tinggi yang mungkin. Jadi, dalam praktiknya, di mana apakah itu melampaui tes primality lainnya? Di sini, adalah jumlah digit prima, dan "melampaui" mengacu pada perkiraan runtime dari tes pada arsitektur komputer yang khas.nnn

Saya tertarik pada algoritma yang sebanding secara fungsional, yaitu yang deterministik yang tidak memerlukan dugaan untuk kebenaran.

Selain itu, apakah menggunakan tes seperti itu di atas yang lain praktis mengingat persyaratan memori tes?

Jawaban:


23

Jawaban cepat: Tidak pernah, untuk tujuan praktis. Saat ini tidak ada penggunaan praktis.

Mengukur waktu primality

Pertama, mari kita pisahkan pengujian komposit "praktis" dari bukti primitif. Yang pertama cukup baik untuk hampir semua tujuan, meskipun ada berbagai tingkat pengujian yang orang merasa memadai. Untuk angka di bawah 2 ^ 64, tidak lebih dari 7 tes Miller-Rabin, atau satu tes BPSW diperlukan untuk jawaban deterministik. Ini akan jauh lebih cepat daripada AKS dan sama benarnya dalam semua kasus. Untuk angka lebih dari 2 ^ 64, BPSW adalah pilihan yang baik, dengan beberapa tes Miller-Rabin tambahan acak menambahkan beberapa kepercayaan ekstra untuk biaya yang sangat sedikit. Hampir semua metode pembuktian akan dimulai (atau seharusnya) dengan tes seperti ini karena murah dan artinya kita hanya melakukan kerja keras pada angka yang hampir pasti prima.

Pindah ke bukti. Dalam setiap kasus, bukti yang dihasilkan tidak memerlukan dugaan, jadi ini dapat dibandingkan secara fungsional. "Gotcha" dari APR-CL adalah bahwa itu tidak cukup polinomial, dan "gotcha" dari ECPP / fastECPP adalah bahwa mungkin ada angka yang membutuhkan waktu lebih lama dari yang diharapkan.

Dalam grafik, kita melihat dua implementasi AKS open source - yang pertama dari kertas v6, yang kedua termasuk perbaikan dari Bernstein dan Voloch dan heuristik yang bagus dari Bornemann. Ini menggunakan segmentasi biner dalam GMP untuk perkalian polinomial sehingga cukup efisien, dan penggunaan memori bukan masalah untuk ukuran yang dipertimbangkan di sini. Mereka menghasilkan garis lurus yang bagus dengan kemiringan ~ 6.4 pada grafik log-log, yang bagus. Tetapi ekstrapolasi hingga 1000 digit tiba pada waktu yang diperkirakan dalam ratusan ribu hingga jutaan tahun, vs beberapa menit untuk APR-CL dan ECPP. Ada optimisasi lebih lanjut yang dapat dilakukan dari makalah Bernstein tahun 2002, tetapi saya tidak berpikir ini akan secara material mengubah situasi (meskipun sampai diimplementasikan ini tidak terbukti).

Akhirnya AKS mengalahkan divisi percobaan. Metode BLS75 theorem 5 (misalnya bukti n-1) membutuhkan pemfaktoran parsial n-1. Ini berfungsi baik pada ukuran kecil, dan juga ketika kita beruntung dan n-1 mudah untuk difaktorkan, tetapi pada akhirnya kita akan terjebak karena harus memfaktorkan beberapa semi-prime besar. Ada implementasi yang lebih efisien, tetapi sebenarnya tidak mengurangi skala 100 digit. Kita dapat melihat bahwa AKS akan melewati metode ini. Jadi jika Anda mengajukan pertanyaan pada tahun 1975 (dan memiliki algoritma AKS saat itu) kita bisa menghitung crossover untuk di mana AKS adalah algoritma yang paling praktis. Tetapi pada akhir 1980-an, APR-CL dan metode cyclotomic lainnya adalah perbandingan yang benar, dan pada pertengahan 1990-an kita harus memasukkan ECPP.

Metode APR-CL dan ECPP keduanya merupakan implementasi open source. Primo (ECPP open source tetapi tidak open source) akan lebih cepat untuk ukuran digit yang lebih besar dan saya yakin memiliki kurva yang lebih bagus (saya belum melakukan benchmarking baru). APR-CL adalah non-polinomial tetapi eksponen memiliki faktor yang ketika seseorang menyindir "masuk ke infinity tetapi tidak pernah diamati melakukannya". Hal ini membuat kita percaya bahwa secara teori garis-garis tidak akan menyeberang untuk nilai n di mana AKS akan selesai sebelum matahari kita terbakar. ECPP adalah algoritma Las Vegas, ketika kami mendapat jawaban 100% benar, kami mengharapkan hasil dalam dugaan (ECPP) ataulogloglognO(log5+ϵ(n))O(log4+ϵ(n))("fastECPP") waktu, tetapi mungkin ada nomor yang lebih lama. Jadi harapan kami adalah bahwa AKS standar akan selalu lebih lambat daripada ECPP untuk hampir semua angka (sudah pasti telah menunjukkan dirinya sendiri sehingga untuk angka hingga 25 ribu angka).

AKS mungkin memiliki lebih banyak perbaikan yang menunggu untuk ditemukan yang membuatnya praktis. Kertas Quartic Bernstein membahas algoritma acak berbasis AKS , dan makalah FastECPP Morain merujuk pada metode berbasis AKS non-deterministik lainnya. Ini adalah perubahan mendasar, tetapi menunjukkan bagaimana AKS membuka beberapa area penelitian baru. Namun, hampir 10 tahun kemudian saya belum melihat orang menggunakan metode ini (atau bahkan implementasi apa pun). Dia menulis dalam pengantar, "Apakah waktu untuk algoritma baru lebih kecil dari waktu untuk menemukan elliptic- sertifikat kurva? Kesan saya saat ini adalah bahwa jawabannya tidak, tetapi hasil lebih lanjut [...] dapat mengubah jawabannya. "O(log4+ϵ(n))(lgn)4+o(1)(lgn)4+o(1)

Beberapa algoritma ini dapat dengan mudah diparalelkan atau didistribusikan. AKS sangat mudah (masing-masing tes independen). ECPP tidak terlalu sulit. Saya tidak yakin tentang APR-CL.

Metode ECPP dan BLS75 menghasilkan sertifikat yang dapat diverifikasi secara independen dan cepat. Ini adalah keuntungan besar dibandingkan AKS dan APR-CL, di mana kita hanya harus mempercayai implementasi dan komputer yang memproduksinya.


18

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)280O~(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 isprimedan 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 ).n1
  • 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).k1kmpz_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 primegapsatau di factordbmana 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.


2
Saya tidak percaya ini menjawab pertanyaan yang diajukan, yang akan membutuhkan perhitungan konstanta dari tes ini.
jbapple

1
Gunakan downvotes Anda setiap kali Anda menemukan posting yang ceroboh, tidak ada upaya dikeluarkan, atau jawaban yang jelas salah dan mungkin salah. - Saya tidak dapat melihat bagaimana orang yang menolak jawaban ini membenarkan pemungutan suara.
Pål GD

2
@ PålGD: Mungkin karena itu tidak menjawab pertanyaan (sebelum edit, yaitu). Juga, apakah Anda menggunakan sama dengan OP, Yuval? n
Raphael

@ Raphael Anda benar, mereka adalah saya . nlogn
Yuval Filmus

Posting yang bagus, tetapi definisi Anda tentang "tidak ada" sedikit pun kurang. Karena penasaran, saya menguji berapa lama waktu yang dibutuhkan untuk memverifikasi kemungkinan primer 2048 bit DSA yang dihasilkan dengan OpenSSL (menggunakan openssl pkeyparam -textuntuk mengekstrak string hex) menggunakan PARI isprime(APR-CL sebagaimana dinyatakan): sekitar 80-an pada notebook cepat. Sebagai referensi, Chromium membutuhkan sedikit lebih dari 0,25 untuk setiap iterasi implementasi demo JavaScript saya dari tes Frobenius (yang jauh lebih kuat dari MR), jadi APR-CL tentu saja paranoid tetapi dapat dilakukan.
Arne Vogel

2

ini adalah pertanyaan yang rumit karena apa yang dikenal sebagai "konstanta besar / galaksi" yang terkait dengan infleksi antara efisiensi dari algoritma yang berbeda. dengan kata lain terkait dengan setiap algoritma yang berbeda dapat menyembunyikan konstanta yang sangat besar sehingga lebih efisien atas lainnya berdasarkan pada kompleksitas fungsi asimptotik / fungsi saja " tendangan" untuk sangat besar . pemahaman saya adalah bahwa AKS adalah "lebih efisien" (dari algoritma bersaing) hanya untuk "jauh lebih besar " di luar jangkauan penggunaan praktis saat ini (dan yang tepatO ( f ( n ) ) O ( g ( n ) ) n n nO(f(n))O(f(n))O(g(n))nnn sebenarnya sangat sulit untuk menghitung dengan tepat), tetapi perbaikan teoritis pada implementasi algoritma (secara aktif dicari oleh beberapa orang) dapat mengubah hal itu di masa depan.

melihat makalah baru-baru ini tentang arxiv yang menganalisis topik ini secara mendalam / terperinci, tidak yakin apa yang dipikirkan orang, belum mendengar reaksi sejauh ini, tampaknya mungkin tesis yang dibuat oleh siswa, tetapi mungkin salah satu analisis paling terperinci / komprehensif dari penggunaan praktis dari algoritma yang tersedia.


AKS lebih efisien daripada apa? Apa kompetisinya?
Yuval Filmus

semua algoritma lainnya. terutama probabilistc? rincian di koran
vzn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.