Formula untuk menghitung bilangan prima dan mengoptimalkan pembagi brute force

Salam! Saya memutuskan pada waktu luang saya untuk meneliti masalah menemukan bilangan prima. Topiknya luas dan menarik. Saya ingin berbagi beberapa pemikiran tentang hal itu yang terlintas di benak saya. Pencarian di Internet tidak mengungkapkan hal itu, menunjukkan keasliannya.

Pertama, saya belum pernah menemukan rumus matematika untuk menghitung bilangan prima secara berurutan. Tetapi bagaimanapun juga, jika ada algoritma, maka dimungkinkan untuk membuat formula menggunakan fungsi logis atau operator. Saya berikan di bawah ini rumus paling ringkas yang ternyata.

Untuk beberapa urutan angka (xm)=x1,x2,x3,...xmaxkami memperkenalkan operator deteksi nomor pertama sama dengan:

\ mathbf {Dt_ {a}} (x_ {m}): = \ left \ {\ begin {matrix} m \ \ mathbf {jika} \ \ ada \ m: \ forall \, k <m \ x_ {k } \ neq a \ \ mathbf {dan} \ x_ {m} = a \\ 0 \ \ mathbf {jika tidak} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ end {matrix} \ benar.


Semua bilangan prima, dimulai dengan 5, dapat dihitung dengan rumus:

Pn=Pn−1+2 mathbfDt0i( mathbfDt0j((Pn−1+2i)modPj+1)),    foralln geqslant3 forallimax geqslant max fracP alpha−P alpha−12+10 ,,  2 leqslant alpha leqslantn−1;  jmax= pi( sqrtPn−1+2i)−1


Operator  mathbfDt0jberalih lagi jsisanya membagi masing-masing nomor kandidat dengan kesederhanaan dengan iangka (Pn−1+2i)untuk bilangan prima sudah ditemukan dalam kisaran hingga Pjmax+1. Nomor kandidat dipilih secara berurutan dari himpunan bilangan ganjil yang lebih besar dari bilangan prima sebelumnya Pn−1.  pi( sqrtPn−1+2i)Merupakan fungsi pi yang menunjukkan jumlah bilangan prima  leqslant sqrtPn−1+2i.
Operator  mathbfDt0iberalih lagi inilai output operator  mathbfDt0jsampai ditemukan 0. Karena rangkaian bilangan prima tak terbatas, ini akan terjadi cepat atau lambat. Di pintu keluar operator  mathbfDt0ijadi akan selalu ada beberapa nomor i. Batas bawah imaksditentukan oleh perbedaan maksimum bilangan prima yang berdekatan lebih kecil dari yang diinginkan. Peningkatan perbedaan ini terjadi secara logaritmik. Grafik di bawah ini menunjukkan ketergantungan pertumbuhan maksimum dan rata-rata  DeltaP alphadari n untuk 100.000 bilangan prima pertama. Nilai maksimum disampel dan dirata-rata untuk setiap seribu angka. gambar
Peningkatan maksimum dalam perbedaan bilangan prima  deltamax( DeltaP alpha)ke nilai maksimum sebelumnya max( DeltaP alpha)sama dengan 20 (untuk perbedaan bilangan prima 31397-31469 = 72 sehubungan dengan perbedaan 25523-25471 = 52). Itu adalah di wilayah di mana turunan dari logaritma amplop  DeltaP alphamasih cukup besar, dan bilangan prima tidak lagi terlalu kecil. Berdasarkan nilai ini, kondisi untuk imaks. Grafik  deltamax( DeltaP alpha)untuk 50.000 bilangan prima pertama yang diberikan di bawah ini. Nilai dihitung untuk setiap seribu. gambar
Puncaknya terlihat pada 20. Dengan meningkatnya n, grafik menjadi minus, menunjukkan penurunan tingkat pertumbuhan bilangan prima besar.

Pertimbangan kedua adalah mengoptimalkan perhitungan urutan bilangan prima.
Algoritma yang ditetapkan dalam rumus di atas adalah metode yang ditingkatkan untuk menghitung pembagi. Perbaikan adalah untuk mengecualikan angka genap dari pertimbangan dan memeriksa pembagian hanya bilangan prima lebih kecil dari sq. akar nomor kandidat. Bagian tersulit dari algoritma adalah perhitungan dari himpunan fungsi mod yang tersisa. Kompleksitas dapat dikurangi dengan mengoptimalkan fungsi ini. Namun, ada cara yang bahkan lebih efektif. Biarkan (rj+1n−1)=r2,r3,...r pi( sqrtPn−1)Adalah urutan residu dari membagi bilangan prima yang ditemukan terakhir menjadi bilangan prima dari 3 ke akar. Kami akan membuat urutan formulir

(ri,j+1n)=(r2+2i)modP2,(r3+2i)modP3,...(r pi( sqrtPn−1)+2i)modP pi( sqrtPn−1),(Pn−1+2i)modP pi( sqrtPn−1+2i)

dalam urutan mulai dari i=1. Istilah terakhir dihitung jika  pi( sqrtPn−1+2i) neq pi( sqrtPn−1). Ketika pada beberapa langkah perhitungan sisanya ri,j+1nmenjadi sama dengan 0, pergi ke urutan berikutnya. Ini dilakukan sampai saya ditemukan, di mana semua residu bukan nol. Ini berarti menemukan bilangan prima berikutnya. Urutan (rj+1n)itu harus disimpan sampai bilangan prima berikutnya ditemukan. Rumus berulang untuk menghitung bilangan prima dengan cara ini dikonversi menjadi:

Pn=Pn−1+2 mathbfDt0i( mathbfDt0j(ri,j+1n)),    foralln geqslant3


Dalam algoritma yang disajikan, mod operasi difasilitasi: habis dibagi oleh (rj+1+2i)/Pj+1kali lebih banyak pembagi. Satu-satunya pengecualian adalah terjadinya pembagi sederhana yang baru. Dalam memori komputer, ketika mengimplementasikan algoritma, perlu untuk menyimpan array bilangan prima ke root yang dicari, serta array variabel residual. Kompleksitas algoritma dalam pengertian umum (jumlah pekerjaan) mungkin kurang dari metode yang dikenal lainnya. Operasi paling kompleks di dalamnya adalah ekstraksi akar kuadrat, perhitungan residu dan penggandaan. Root dapat diekstraksi ke integer terdekat. Untuk mendapatkan residu, Anda dapat menggunakan algoritme yang efektif berdasarkan aturan umum pembagian. Perkalian hanya digunakan oleh 2 angka yang relatif kecil i . Kompleksitas waktu dari algoritma dapat dikurangi dengan mendistribusikan pekerjaan sesuai dengan nilai-nilai i . Saringan tersegmentasi yang diperoleh dengan cara ini harus bekerja lebih cepat pada komputer multi-utas. Namun, pekerjaan yang dilakukan akan lebih besar karena peningkatan dividen. Anda juga dapat "mengacaukan" faktorisasi roda ke algoritme. Dengan ukuran roda yang optimal, ini dapat mengurangi kerumitan dalam kisaran n - hingga perangkat keras "liar" memperlambatnya.

Mungkin seseorang akan berguna pikiran saya.

Source: https://habr.com/ru/post/id472036/


All Articles