簡體   English   中英

用平方根法求素數

[英]finding prime number using the square root method

我可以用這種方式為素數寫一個函數

def isprime(num):
    if num > 1:
        for i in range(2, num):
            if num % i == 0:
                return False
        return True

%timeit [i for i in range(1000) if isprime(i)]
7.94 ms ± 273 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

然后,我發現有一種甚至更快的方法來使用平方根來編寫此代碼,但我無法理解其工作原理。 任何人都可以用更簡單的術語來解釋此代碼,以及為什么它起作用嗎?

def isprime(num):
    if num > 1:
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                return False
        return True

%timeit [i for i in range(1000) if isprime(i)]    
1.94 ms ± 54.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

如果這是重復的郵件,請告訴我,我將立即刪除它。

最好通過示例來解釋。 假設您想知道143是否為質數。 您是否真的需要嘗試除以142、141、140、139等? 顯然,這些分隔都沒有143。 他們太大了。

但請參閱:

  • 143%2 == 1
  • 143%3 == 2
  • 143%5 == 3
  • 143%7 == 3
  • 143%11 == 0

顯然,11除以143。

現在讓我們嘗試145。145是素數嗎?

  • 145%2 == 1
  • 145%3 == 1
  • 145%5 == 0

顯然,5除以145。 現在考慮,我們本來可以嘗試

  • 145%29 == 0

那本來可以用,因為145 == 5 * 29,但是沒有必要嘗試高達29的因數。5就足夠了。

因此,請考慮一下。 如果一個復合數n == a * b有兩個因子a和b,則假定b> sqrt(n)。 在那種情況下,一定是<sqrt(n),如果不是這樣,則a * b不能等於n。 確實,如果不是這樣,則a * b會大於 n,這意味着a * b不是n的適當因式分解。

您需要做的就是找到較小因子的值。 較小的因子小於或最大等於平方根。 如果沒有發現小於或等於平方根的因子,則說明所研究的數字為質數。

您只需要檢查直至數字平方根的因數即可確定數字是否為質數-任何大於其平方根的因數都必須與小於其平方根的因數配對,並且您已經檢查了它們。

這使得第二實施完成其循環得多 (例如,你只需要測試2..31確定997為素數,而不是2..996在第一次執行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM