Untuk menguji apakah suatu bilangan prima atau tidak, mengapa kita harus menguji apakah bilangan hanya dapat dibagi hingga akar kuadrat dari bilangan itu?
algorithm
primes
primality-test
Panci
sumber
sumber
n = a*b
dana <= b
kemudiana*a <= a*b = n
.floor(sqrt(n))
.Jawaban:
Jika suatu bilangan
n
bukan bilangan prima, maka bilangan dapat diperhitungkan menjadi dua faktora
danb
:Sekarang
a
danb
tidak bisa keduanya lebih besar dari akar kuadratn
, karena itu produknyaa * b
akan lebih besar darisqrt(n) * sqrt(n) = n
. Jadi dalam faktorisasi apa punn
, setidaknya salah satu faktor harus lebih kecil dari akar kuadratn
, dan jika kita tidak dapat menemukan faktor apa pun yang kurang dari atau sama dengan akar kuadrat,n
harus menjadi prima.sumber
sqrt(n)
harus cukup tepat untuk menahan properti ini mengingat kami menggunakan floating point.i * i <= n
alih-alihi <= sqrt(n)
jika Anda ingin menghindari seluk-beluk angka floating-point.Katakanlah kalau
m = sqrt(n)
begitum × m = n
. Sekarang jikan
bukan bilangan prima makan
dapat ditulis sebagain = a × b
, jadim × m = a × b
. Perhatikan bahwa itum
adalah bilangan real sedangkann
,a
danb
merupakan bilangan alami.Sekarang ada 3 kasus:
Dalam semua 3 kasus
min(a, b) ≤ m
,. Karena itu jika kita mencari sampaim
, kita pasti menemukan setidaknya satu faktorn
, yang cukup untuk menunjukkan yangn
tidak prima.sumber
n is not a prime
, dan buktikan, kalau tidak itu adalah bilangan prima.Karena jika suatu faktor lebih besar dari akar kuadrat dari n, faktor lain yang akan berlipat ganda dengan itu menjadi n harus kurang dari akar kuadrat dari n.
sumber
Penjelasan yang lebih intuitif adalah: -
Akar kuadrat dari 100 adalah 10. Katakanlah axb = 100, untuk berbagai pasangan a dan b.
Jika a == b, maka keduanya sama, dan merupakan akar kuadrat dari 100, tepatnya. Yaitu 10.
Jika salah satu dari mereka kurang dari 10, yang lain harus lebih besar. Misalnya, 5 x 20 == 100. Yang satu lebih besar dari 10, yang lain kurang dari 10.
Memikirkan axb, jika salah satu turun, yang lain harus mendapatkan kompensasi lebih besar, sehingga produk tetap 100. Mereka berputar di sekitar akar kuadrat.
Akar kuadrat dari 101 adalah sekitar 10,049875621. Jadi, jika Anda menguji angka 101 untuk primality, Anda hanya perlu mencoba bilangan bulat hingga 10, termasuk 10. Tapi 8, 9, dan 10 bukan prima, jadi Anda hanya perlu menguji hingga 7, yaitu utama.
Karena jika ada sepasang faktor dengan salah satu angka lebih besar dari 10, yang lain dari pasangan harus kurang dari 10. Jika yang lebih kecil tidak ada, tidak ada faktor pencocokan yang lebih besar dari 101.
Jika Anda menguji 121, akar kuadratnya adalah 11. Anda harus menguji bilangan bulat utama 1 hingga 11 (inklusif) untuk melihat apakah bilangan masuknya merata. 11 masuk 11 kali, jadi 121 tidak prima. Jika Anda berhenti di 10, dan tidak menguji 11, Anda akan melewatkan 11.
Anda harus menguji setiap bilangan bulat utama lebih besar dari 2, tetapi kurang dari atau sama dengan akar kuadrat, dengan asumsi Anda hanya menguji angka ganjil.
`
sumber
Misalkan
n
bukan bilangan prima (lebih besar dari 1). Jadi ada angkaa
danb
semacamnyaDengan mengalikan relasi
a<=b
dengana
danb
kita mendapatkan:Oleh karena itu: (perhatikan itu
n=ab
)Oleh karena itu: (Catat itu
a
danb
positif)Jadi, jika angka (lebih dari 1) tidak prima dan kami menguji pembagian hingga akar kuadrat dari angka tersebut, kami akan menemukan salah satu faktor.
sumber
Misalkan bilangan bulat yang diberikan
N
tidak prima,Maka N dapat difaktorkan menjadi dua faktor
a
danb
,2 <= a, b < N
sedemikian rupaN = a*b
. Jelas, keduanya tidak bisa lebih besar daripadasqrt(N)
secara bersamaan.Mari kita asumsikan tanpa kehilangan keumuman yang
a
lebih kecil.Sekarang, jika Anda tidak dapat menemukan pembagi
N
kepemilikan di dalam rentang tersebut[2, sqrt(N)]
, apa artinya itu?Ini berarti bahwa
N
tidak memiliki pembagi[2, a]
sebagaia <= sqrt(N)
.Oleh karena itu,
a = 1
danb = n
karenanya definisi,N
adalah prima ....
Bacaan lebih lanjut jika Anda tidak puas:
Banyak kombinasi yang berbeda
(a, b)
dimungkinkan. Katakanlah mereka adalah:(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ....., (a k , b k ). Tanpa kehilangan umum, menganggap saya <b i ,
1<= i <=k
.Sekarang, untuk dapat menunjukkan yang
N
tidak prima itu cukup untuk menunjukkan bahwa tidak ada i yang dapat difaktorkan lebih lanjut. Dan kita juga tahu bahwa i <=sqrt(N)
dan dengan demikian Anda perlu memeriksa sampaisqrt(N)
mana yang akan mencakup semua i . Dan karenanya Anda akan dapat menyimpulkan apakahN
prima atau tidak ....
sumber
Itu semua benar-benar hanya penggunaan dasar Factorization dan Square Roots.
Ini mungkin tampak abstrak, tetapi dalam kenyataannya ia hanya terletak pada fakta bahwa faktorial maksimum yang mungkin bukan-bilangan prima harus menjadi akar kuadratnya karena:
sqrroot(n) * sqrroot(n) = n
.Mengingat bahwa, jika ada bilangan bulat di atas
1
dan di bawah atau di atas untuksqrroot(n)
membagi secara meratan
, makan
tidak bisa menjadi bilangan prima.Contoh kode semu:
sumber
guard
pernyataan di Swift bersama dengan stackoverflow.com/a/25555762/4475605 yang berguna ini untuk melakukan keluar awal dari perhitungan daripada membuang-buang daya komputasi. Terima kasih telah memposting.++i
menjadi angka 1, yang akan selalu menghasilkan false (karena 1 terbagi menjadi segalanya). Saya sudah mengoreksi jawaban di atas.Jadi untuk memeriksa apakah angka N adalah Prime atau bukan. Kita hanya perlu memeriksa apakah N dapat dibagi dengan angka <= SQROOT (N). Ini karena, jika kita memasukkan faktor N ke dalam 2 faktor, katakanlah X dan Y, yaitu. N = X Y. Setiap X dan Y tidak boleh kurang dari SQROOT (N) karena itu, X Y <N Masing-masing X dan Y tidak boleh lebih besar dari SQROOT (N) karena dengan begitu, X * Y> N
Oleh karena itu satu faktor harus kurang dari atau sama dengan SQROOT (N) (sedangkan faktor lainnya lebih besar dari atau sama dengan SQROOT (N)). Jadi untuk memeriksa apakah N adalah Prime, kita hanya perlu memeriksa angka-angka itu <= SQROOT (N).
sumber
Katakanlah kita memiliki angka "a", yang bukan bilangan prima [bukan bilangan prima / gabungan berarti - bilangan yang dapat dibagi secara merata dengan bilangan selain 1 atau itu sendiri. Misalnya, 6 dapat dibagi secara merata dengan 2, atau dengan 3, serta oleh 1 atau 6].
6 = 1 × 6 atau 6 = 2 × 3
Jadi sekarang jika "a" tidak prima maka dapat dibagi dengan dua angka lain dan katakanlah angka-angka itu adalah "b" dan "c". Yang berarti
a = b * c.
Sekarang jika "b" atau "c", salah satu dari mereka lebih besar dari akar kuadrat dari "a" dari perkalian "b" & "c" akan lebih besar dari "a".
Jadi, "b" atau "c" selalu <= akar kuadrat dari "a" untuk membuktikan persamaan "a = b * c".
Karena alasan di atas, ketika kami menguji apakah suatu bilangan prima atau tidak, kami hanya memeriksa sampai akar kuadrat dari angka tersebut.
sumber
Dengan diberi nomor berapa pun
n
, maka salah satu cara untuk menemukan faktor-faktornya adalah dengan mendapatkan akar kuadratnyap
:Tentu saja, jika kita mengalikannya
p
sendiri, maka kita kembalin
:Itu dapat ditulis ulang sebagai:
Mana
p = a = b
. Jikaa
meningkat, makab
berkurang untuk mempertahankana*b = n
. Karena itu,p
adalah batas atas.Pembaruan: Saya membaca lagi jawaban ini hari ini dan menjadi lebih jelas bagi saya. Nilai
p
tidak selalu berarti bilangan bulat karena jika itu, makan
tidak akan menjadi bilangan prima. Jadi,p
bisa berupa bilangan real (yaitu, dengan pecahan). Dan bukannya melalui seluruh jajarann
, sekarang kita hanya perlu melewati seluruh jajaranp
. Yang lainnyap
adalah salinan cermin sehingga efeknya kami membagi dua kisaran. Dan kemudian, sekarang saya melihat bahwa kita benar-benar dapat melanjutkan melakukan kembalisquare root
dan melakukannyap
untuk lebih jauh setengah kisaran.sumber
Biarkan n menjadi non-prima. Oleh karena itu, ia memiliki setidaknya dua faktor bilangan bulat lebih besar dari 1. Biarkan f menjadi yang terkecil dari faktor-faktor tersebut. Misalkan f> sqrt n. Maka n / f adalah integer LTE sqrt n, jadi lebih kecil dari f. Oleh karena itu, f tidak dapat menjadi faktor terkecil n. Reductio ad absurdum; Faktor terkecil n harus LTE sqrt n.
sumber
Setiap angka komposit adalah produk bilangan prima.
Katakanlah
n = p1 * p2
, di manap2 > p1
dan mereka adalah bilangan prima.Jika
n % p1 === 0
kemudian n adalah angka komposit.Jika
n % p2 === 0
kemudian tebak apan % p1 === 0
juga!Jadi tidak mungkin kalau
n % p2 === 0
tapin % p1 !== 0
pada saat bersamaan. Dengan kata lain, jika bilangan komposit n dapat dibagi rata dengan p2, p3 ... pi (faktor yang lebih besar), ia harus dibagi dengan faktor terendah p1 juga. Ternyata faktor terendahp1 <= Math.square(n)
selalu benar.sumber
Untuk menguji keutamaan angka, n , orang akan mengharapkan loop seperti berikut di tempat pertama:
Apa loop di atas tidak adalah ini: untuk diberikan 1 <i <n , itu memeriksa apakah n / i adalah bilangan bulat (meninggalkan sisa 0). Jika ada i di mana n / i adalah bilangan bulat, maka kita dapat yakin bahwa n bukan bilangan prima, pada saat mana loop berakhir. Jika tanpa i, n / i adalah bilangan bulat, maka n adalah bilangan prima.
Seperti halnya setiap algoritma, kami bertanya: Bisakah kita melakukan yang lebih baik?
Mari kita lihat apa yang terjadi di loop di atas.
Urutan i pergi: i = 2, 3, 4, ..., n-1
Dan urutan bilangan bulat cek: j = n / i, yaitu n / 2, n / 3, n / 4, ..., n / (n-1)
Jika untuk beberapa i = a, n / a adalah bilangan bulat, maka n / a = k (integer)
atau n = ak, jelas n> k> 1 (jika k = 1, maka a = n, tetapi saya tidak pernah mencapai n; dan jika k = n, maka a = 1, tetapi saya mulai dari bentuk 2)
Juga, n / k = a, dan seperti yang dinyatakan di atas, a adalah nilai i jadi n> a> 1.
Jadi, a dan k keduanya bilangan bulat antara 1 dan n (eksklusif). Karena, saya mencapai setiap bilangan bulat dalam rentang itu, pada beberapa iterasi i = a, dan pada beberapa iterasi lainnya i = k. Jika tes primality dari n gagal untuk min (a, k), itu juga akan gagal untuk maks (a, k). Jadi kita perlu memeriksa hanya satu dari dua kasus ini, kecuali min (a, k) = maks (a, k) (di mana dua cek dikurangi menjadi satu) yaitu, a = k, di mana titik a * a = n, yang menyiratkan a = sqrt (n).
Dengan kata lain, jika uji keutamaan n gagal untuk beberapa i> = sqrt (n) (yaitu, maks (a, k)), maka itu juga akan gagal untuk beberapa i <= n (yaitu, min (a , k)). Jadi, akan cukup jika kita menjalankan tes untuk i = 2 hingga sqrt (n).
sumber