最近我发现一个难题,需要我列出一个数字下面的所有循环素数。 在这种情况下,循环意味着如果我们旋转数字,它仍然是素数: 例如。 1193是素数 1931年是黄金 9311是素数 3119是素数Python代码优化
这是我origanly代码中写道:
a=[]
upto=1000000
for x in range(upto):
a.append([x,0])
print('generated table')
a[1][1]=1
a[0][1]=1
for n in range(2,int(math.sqrt(upto))):
for k in range(2,(int(upto/n)+2)):
try:
a[n*k][1]=1
except IndexError:
pass
print('sive complete')
p=[]
for e in a:
if (e[1]==0):
p.append(e[0])
print('primes generated')
s=[]
for e in p:
pr=True
w=str(e)
if all(c not in w for c in ['2','4','6','8','5','0']):
for x in (w[i:]+w[:i] for i in range(len(w))):
if int(x) not in p:
pr=False
if pr==True:
s.append(e)
print('found',e)
print(s)
那是相当的慢! (大约12s)我知道,总理一代并不完美,但最后一点是最慢的。我知道,对于高达= 10E6这个过程可以在一秒之内完成,所以经过一番研究,我赞成这个功能去掉任何字符串操作:
def rotate(n):
prev=[]
for l in range(6,0,-1):
if(n<10**l):
length=l
while(n not in prev):
prev.append(n)
n=(n // 10) + (n % 10) * 10**(length-1)
yield n
我也删除了5,0,2,4 ,6,8测试,因为我不知道如何实现它。结果?它运行速度更慢! (超过10分钟,我猜测5,0,2,4,6,8测试是一个好主意)
我试过使用time.time(),但我没有发现任何非常低效的东西(在第一个码)。如何改进这些代码?我目前正在使用哪些不良做法?
这个问题似乎是题外话,因为它属于上http://codereview.stackexchange.com – jonrsharpe
好,消除了即使数字和5肯定是有价值的,因为它会消除你需要测试的绝大多数数字。任何2+数字循环素数必须只包含[1,3,7,9]的某个子集。我认为你也许可以用合理的长度对它进行暴力破解 - 对于一个N位解决方案,最大可能有4^N个可能性(对于各种对称性来说更少),对于任何肯定的可能性,4^N <10^N ñ... – twalberg
我怎么可能在那里迁移它?编码SE的数量令人困惑 – Michal