最近我發現一個難題,需要我列出一個數字下面的所有循環素數。 在這種情況下,循環意味着如果我們旋轉數字,它仍然是素數: 例如。 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