Non-pembagi paling umum mungkin sebesar N log C, tetapi jika nomor N didistribusikan secara acak maka non-pembagi paling umum mungkin jauh lebih kecil, mungkin jauh lebih sedikit daripada N. Saya akan membuat tabel yang bilangan prima adalah pembagi nomor yang mana.
Untuk setiap bilangan prima p kita memiliki indeks yang berarti semua bilangan hingga indeks tersebut telah diperiksa untuk dapat dibagi oleh p, dan kami memiliki daftar semua bilangan tersebut yang dapat dibagi dengan.kp
Kemudian untuk d = 2, 3, 4, ... kami mencoba mencari angka yang dapat dibagi dengan d, atau menunjukkan tidak ada. Kami mengambil faktor prima p terbesar d. Kemudian kami memeriksa semua angka yang dapat dibagi dengan p apakah mereka juga dapat dibagi dengan d. Jika tidak ada yang ditemukan, maka kami memeriksa nomor lebih lanjut dengan indeks> untuk dapat dibagi dengan p, memperbarui dan daftar angka yang dapat dibagi dengan p, dan memeriksa apakah setiap nomor dapat dibagi oleh d.kpkp
Untuk memeriksa apakah ada nomor yang dapat dibagi dengan p, kami memeriksa rata-rata nomor p. Kemudian jika kita memeriksa apakah ada angka yang dapat dibagi 2p, ada kemungkinan 50% bahwa kita perlu memeriksa hanya satu nomor (yang bisa dibagi dengan p), dan peluang 50% untuk memeriksa rata-rata 2p lebih banyak angka. Menemukan nomor yang dapat dibagi dengan 3p kemungkinan besar cepat dan sebagainya, dan kami tidak pernah memeriksa lebih dari angka N untuk dapat dibagi dengan p, karena hanya ada nomor N.
Saya berharap ini berhasil dengan tentang pemeriksaan keterbagianN2/logN
PS. Seberapa besar hasilnya untuk angka acak?
Asumsikan saya memiliki nomor acak N. Probabilitas bahwa salah satu angka N dapat dibagi dengan d adalah 1 - (1 - 1 / d) ^ N. Saya berasumsi probabilitas bahwa masing-masing angka 1 ≤ d ≤ k adalah faktor dari salah satu angka acak dihitung dengan mengalikan probabilitas ini (Ok, itu agak cerdik, karena probabilitas ini kemungkinan tidak terlalu independen).
Dengan asumsi itu, dengan N = 1000, ada kemungkinan 50% bahwa salah satu angka 1..244 tidak membagi angka apa pun, dan satu dalam satu miliar bahwa setiap angka hingga 507 membagi salah satu angka. Dengan N = 10.000 ada kemungkinan 50% bahwa salah satu angka 1..1726 tidak membagi angka apa pun, dan satu dalam satu miliar bahwa setiap angka hingga 2979 membagi salah satu angka.
Saya akan mengusulkan bahwa untuk input acak N, ukuran hasilnya sedikit lebih besar dari N / ln N; mungkin sesuatu seperti N / ln N * (ln ln N) ^ 2. Inilah alasannya:
Probabilitas bahwa setidaknya salah satu dari angka acak N habis dibagi oleh d acak . Jika d adalah sekitar N, maka adalah sekitar 1 - exp (-1) ≈ 0,6321. Itu untuk pembagi tunggal; kemungkinan bahwa masing-masing dari beberapa angka d ≈ N adalah pembagi setidaknya satu dari angka N cukup tipis, sehingga maksimum d akan secara signifikan lebih kecil dari N. 1 - ( 1 - 1 / d ) N1−(1−1/d)N1−(1−1/d)N
Jika d << N, maka .1−(1−1/d)N≈1−exp(−N/d)
Jika d ≈ N / ln N kemudian .1−exp(−N/d)≈1−exp(−lnN)=1−1/N
Kami akan menambahkan probabilitas ini untuk sekitar N / ln N nilai d, tetapi untuk sebagian besar d hasilnya akan secara signifikan lebih besar, sehingga d terbesar akan entah bagaimana lebih besar dari N / ln N tetapi secara signifikan lebih kecil dari N.
PS. Menemukan nomor yang dapat dibagi oleh d:
Kami memilih faktor prima p terbesar dari d, dan kemudian kami pertama-tama memeriksa angka-angka yang sudah diketahui dapat habis dibagi oleh p. Katakan d = kp. Kemudian secara rata-rata kita hanya memeriksa k angka-angka yang dapat dibagi dengan p saat memeriksa d khusus ini, dan kami memeriksa paling banyak semua nilai N untuk dapat dibagi oleh p keseluruhan, untuk semua d habis dibagi dengan p. Sebenarnya, kami kemungkinan besar memeriksa kurang dari nilai N untuk sebagian besar bilangan prima, karena setelah memeriksa semua nilai N algoritma kemungkinan besar berakhir. Jadi jika hasilnya adalah R, maka saya berharap kurang dari nilai N yang dibagi oleh setiap prime kurang dari R. Dengan asumsi R ≤ N, itu tentang N ^ 2 / log N cek.
PS. Menjalankan beberapa tes
Saya menjalankan algoritma ini beberapa kali dengan N = 1.000.000 angka acak> 0. Non-pembagi paling umum adalah antara 68.000 dan 128.000 dengan mayoritas besar berjalan antara 100.000 dan 120.000. Jumlah divisi adalah antara 520 juta dan 1800 juta yang jauh lebih kecil dari (N / ln N) ^ 2; sebagian besar kasus digunakan antara 1000 dan 1500 juta divisi.