我正在Project Euler's problem 35我的代码失败,最大值超过999,但在此之前工作正常。
“计数”在22处停止,不计算999以上的任何素数。
import itertools
import time
def isPrime(n):
if n % 2 == 0:
return n == 2
d = 3
while d * d <= n:
if n % d == 0:
return False
d += 2
return True
t=time.time()
count=0
Range=1000000
for a in range(2,Range):
if isPrime(a):
alist=[]
perms=[]
for n in str(a):
alist.append(n)
for n in itertools.permutations(alist):
num=int("".join(n))
perms.append(num)
if all(isPrime(l) for l in perms):
count+=1
print("there are ", count, " circular primes")
print("time=",time.time()-t,"s")
任何人都可以解释为什么会这样吗?
答案 0 :(得分:4)
前四位循环素数是(我认为)1193.最简单的排除故障的方法就是看看这个数字会发生什么。问题是itertools.permutations
生成所有排列,而不是循环旋转。 1193的循环旋转是
[1193, 3119, 9311, 1931]
您的代码生成了一个更大的列表:
[1931, 1913, 1391, 1319, 1193, 1139, 9131, 9113, 9311, 9311, 9113, 9131, 3191, 3119, 3911, 3911, 3119, 3191, 1193, 1139, 1913, 1931, 1319, 1391]
例如,1391不是素数。
答案 1 :(得分:2)
你没有看到这个问题。你只想要轮换,而不是所有的排列。
这将生成要测试的旋转:
a_str = str(a)
perms = [ int(a_str[i:] + a_str[0:i]) for i in range(1,len(a_str)) ]