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
kami 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:
Operator
beralih lagi
sisanya membagi masing-masing nomor kandidat dengan kesederhanaan dengan
angka
untuk bilangan prima sudah ditemukan dalam kisaran hingga
. Nomor kandidat dipilih secara berurutan dari himpunan bilangan ganjil yang lebih besar dari bilangan prima sebelumnya
.
Merupakan fungsi pi yang menunjukkan jumlah bilangan prima
.
Operator
beralih lagi
nilai output operator
sampai ditemukan 0. Karena rangkaian bilangan prima tak terbatas, ini akan terjadi cepat atau lambat. Di pintu keluar operator
jadi akan selalu ada beberapa nomor
. Batas bawah
ditentukan 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
dari
n untuk 100.000 bilangan prima pertama. Nilai maksimum disampel dan dirata-rata untuk setiap seribu angka.

Peningkatan maksimum dalam perbedaan bilangan prima
ke nilai maksimum sebelumnya
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
masih cukup besar, dan bilangan prima tidak lagi terlalu kecil. Berdasarkan nilai ini, kondisi untuk
. Grafik
untuk 50.000 bilangan prima pertama yang diberikan di bawah ini. Nilai dihitung untuk setiap seribu.

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
Adalah urutan residu dari membagi bilangan prima yang ditemukan terakhir menjadi bilangan prima dari 3 ke akar. Kami akan membuat urutan formulir
dalam urutan mulai dari
. Istilah terakhir dihitung jika
. Ketika pada beberapa langkah perhitungan sisanya
menjadi 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
itu harus disimpan sampai bilangan prima berikutnya ditemukan. Rumus berulang untuk menghitung bilangan prima dengan cara ini dikonversi menjadi:
Dalam algoritma yang disajikan,
mod operasi difasilitasi: habis dibagi oleh
kali 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.