先定义一个有序列表,作为素数池,这样多次操作的时候可以直接用里面的素数作为取模的除数,以避免用合数作冗余的计算:
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=2
for 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):
primePool.append(p)#素数池维护
if math.fmod(num,p)==0:
print('Divider:',p)
return False
p = p+2 #以2为步长,避免无用的偶数判断
#primePool.append(num)
''&#