[英]Find a prime number?
為了找出N是素數,我們只需要查找小於或等於sqrt(N)的所有數。 這是為什么? 我正在編寫一個C代碼,試圖理解它背后的原因。
N是素數,如果它是一個正整數,它可以被正整數兩個正整數1和N整除。由於數的除數不能大於這個數,這就產生了一個簡單的素數測試:
[2, N-1]
范圍內的任何整數整除,則N是素數。 否則,N不是素數。 但是,修改此測試以使其更快會很好。 所以讓我們調查吧。
注意,N的除數成對出現。 如果N可以被數字M整除,那么它也可以被N / M整除。 例如,12可以除以6,因此也可以除以2.此外,如果M >= sqrt(N)
,則N/M <= sqrt(N)
。
這意味着如果沒有小於或等於sqrt(N)的數字除N,則沒有大於sqrt(N)的數字除以N(除了1和N本身),否則會產生矛盾。
所以我們有一個更好的測試:
[2, sqrt(N)]
范圍內的任何整數整除,則N為素數。 否則,N不是素數。 如果你考慮上面的推理,你應該看到通過這個測試的數字也通過了第一次測試,並且未通過這個測試的數字也沒有通過第一次測試。 因此測試是等效的。
一個復合數(一個非素數,或1)至少有一對因子,並保證每對中的一個數字小於或等於數字的平方根(這就是你正在詢問)。
如果你對數字的平方根進行平方,你得到數字本身( sqrt(n) * sqrt(n) = n
),所以如果你把一個數字做得更大(比sqrt(n)
)你必須要做另一個較小。 如果您只檢查數字2到sqrt(n)
您將檢查所有可能的因素,因為每個因素都將與一個大於sqrt(n)
的數字配對(當然,如果數字是實際上是一個其他數字的正方形,如4,9,16等......但這並不重要,因為你知道它們不是素數;它們很容易被sqrt(n)
本身考慮在內。
原因很簡單,任何大於sqrt的數字都會導致另一個乘數小於sqrt。 在這種情況下,您應該已經檢查過它。
設n = a × b是復合的。
假定一個 > SQRT(n)和B> SQRT(N)。
a × b > sqrt( n )×sqrt( n )
a × b > n
但是我們知道a × b = n ,因此是 <sqrt( n )或b <sqrt( n )。
由於您只需要知道a或b來顯示n是復合的,您只需要檢查最多為sqrt( n )的數字以找到這樣的數字。
因為在最壞的情況下,數字n
可以表示為2 。
如果數字可以不同地表示,那么除數之一將小於a = sqrt(n)
,但另一個可以更大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.