先定義乙個有序列表,作為素數池,這樣多次操作的時候可以直接用裡面的素數作為取模的除數,以避免用冗餘的合數來運算和重複性的運算:
primepool = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,79,83,89,97,101,103,107,109,113]
定義素數判斷函式
def isprime(num):
if num in primepool:
return true
sq = math.sqrt(num)
p=2for m in primepool: #先從素數池中找
p = m
if math.fmod(num,m)==0:
print('divider:',m)
return false
if p > sq:
return true
p = p+2
while p<=sq:
if isprime(p):
if math.fmod(num,p)==0:
print('divider:',p)
return false
p = p+2 #以2為步長,避免無用的偶數判斷
'''如果此時的 num 是素數,暫時不將其放入有序素數池中,因為還要判斷並新增從p到num之間的所有素數。對於本函式而言是個較大的計算量。
'''return true
執行示例:
isprime(17947)
結果:
divider: 5 # p==115時,p被5整除
divider: 3 # p==117時,p被3整除
divider: 7 # p==119時,p被7整除
divider: 11 # p==121時,p被11整除
divider: 3 # p==123時,p被3整除
divider: 5 # p==125時,p被5整除
divider: 3 # p==127時,向素數池中新增127;然後判斷p==129時,被3整除
divider: 131 # p==131時,向素數池中新增131;
false # num被131整除
時間複雜度估算為:
它與素數的密度分布有關。而且隨著素數池primepool的逐漸積累,函式的效率也會顯著提公升。
整數的素因數權重分析
判斷乙個正整數是否素數
素數指的是只能被1和自身整除的大於1的整數 對於每個數num,並不需要從2判斷到num 1,這樣效率很低。假若乙個數可以進行因式分解,那麼分解得到的兩個數必將有乙個小於等於sqrt num 另乙個大於等於sqrt num 所以,我們只要遍歷sqrt num 即可,因為在sqrt num 左側找不到約...
使用Python判斷乙個正整數數是否為素數
判定乙個數是否為素數的基本思路 1 了解素數的定義,乙個正整數n若為素數,則它的約數只能是1和n本身,2 根據定義,我們需要將這個數除以從2到n 1之間的全部正整數,如果全部都不能整除,則這個數便是素數。若是其中有乙個數能被整除,則這個數是個合數,而不是素數。因此,用求餘演算法 不失為一種有效的方法...
PHP判斷乙個變數是否為整數 正整數的方法示例
在php中判斷乙個變數是否為整數 在寫php 的時候遇到這樣乙個小問題 如何判斷乙個變數是否為整數,於是在網上找到了兩個方法來解決,在此做乙個小小的記錄。方法1 num 12.1 返回false if is int num else 這裡用is int程式設計客棧 方法來判斷傳入的引數是否為整數形 ...