我寫了下面的功能,找到一個給定的自然數的所有約數,並返回它們作爲一個列表進行了一些優化的所有除數:尋找
def FindAllDivisors(x):
divList = []
y = 1
while y <= math.sqrt(x):
if x % y == 0:
divList.append(y)
divList.append(int(x/y))
y += 1
return divList
它的作品真的很好,不同的是它真的很慢當輸入是一個18位數字時。你對我如何加快速度有什麼建議嗎?
更新:
我有以下方法基於費馬小定理來檢查素性:
def CheckIfProbablyPrime(x):
return (2 << x - 2) % x == 1
檢查單號時,此方法是非常有效的,但是我不確定我是否應該用它來編譯所有素數達到某個邊界。
您是否使用'CheckIfPrime'來查看是否可以跳過某個x的分區?你應該小心這一點,因爲你可以得到誤報:'CheckIfPrime'過濾大部分數字,但一些複合仍然會產生'真'! –
@BenRuijl請給我一個例子,非常感謝! –
由於[Fermat pseudoprimes](http://en.wikipedia.org/wiki/Fermat_pseudoprime),您的'CheckIfPrime'函數不起作用。例如,'CheckIfPrime(341)'爲True,但是341 = 11 * 31。如果'CheckIfPrime'爲False,那麼這個數字肯定是複合的,但是反過來並不成立。 [對不起,我錯過了BenRuijl先前的評論。不過,如果僅將它用作「CheckIfProbablyPrime」,它仍可能有用。 – DSM