查找所有10位素数,其中有7个“素数”;7“;一行-Python
正如它在标题中所说的,我试图生成一个包含所有10位素数的列表,这些素数都是7x7。更准确地说,我指的是可以写成如下的数字:xxx777777,xx77777x,x7777xx,77777xxx 我的想法是生成所有这些数字的列表,然后检查其中哪一个是素数。代码如下:查找所有10位素数,其中有7个“素数”;7“;一行-Python,python,list,primes,Python,List,Primes,正如它在标题中所说的,我试图生成一个包含所有10位素数的列表,这些素数都是7x7。更准确地说,我指的是可以写成如下的数字:xxx777777,xx77777x,x7777xx,77777xxx 我的想法是生成所有这些数字的列表,然后检查其中哪一个是素数。代码如下: import time def GeneratingTable(): A = [] for i in range (1,10): for j in range (0,10): f
import time
def GeneratingTable():
A = []
for i in range (1,10):
for j in range (0,10):
for k in range (0,10):
A.append(i*1000000000+j*100000000+k*10000000+7777777)
for i in range (1,10):
for j in range (0,10):
for k in range (1,10):
A.append(i*1000000000+j*100000000+77777770+k)
for i in range (1,10):
for j in range (0,10):
for k in range (1,10):
A.append(i*1000000000+777777700+10*j+k)
for i in range (0,10):
for j in range (0,10):
for k in range (1,10):
A.append(7777777000+i*100+j*10+k)
A = list(set(A)) # I want to get rid of duplicats here
print(len(A))
return A
def ifPrime(n): # Maybe I can use more efficient algorithm?
Prime = 1
i = 2
while i * i <= n:
if n%i == 0:
Prime = 0
break
i += 2
if Prime == 1:
return 1
else:
return 0
def HowMany():
counter = 0
A = GeneratingTable()
for i in range (len(A)):
if ifPrime(A[i]):
print(A[i])
counter += 1
return counter
start = time.clock()
print(HowMany())
end = time.clock()
time = end - start
print(time)
导入时间
def GeneratingTable():
A=[]
对于范围(1,10)内的i:
对于范围(0,10)内的j:
对于范围(0,10)内的k:
附加(i*100000000+j*100000000+k*10000000+777)
对于范围(1,10)内的i:
对于范围(0,10)内的j:
对于范围(1,10)内的k:
A.追加(i*100000000+j*100000000+777 0+k)
对于范围(1,10)内的i:
对于范围(0,10)内的j:
对于范围(1,10)内的k:
A.追加(i*100000000+77700+10*j+k)
对于范围(0,10)内的i:
对于范围(0,10)内的j:
对于范围(1,10)内的k:
附加(777000+i*100+j*10+k)
A=列表(set(A))#我想在这里去掉重复的内容
印刷品(透镜(A))
归还
def ifPrime(n):#也许我可以使用更有效的算法?
素数=1
i=2
当i*i你的函数ifPrime
认为所有奇数都是素数,因为你从i=2
开始,然后在每个循环上以2
的方式递增它。因此,只检查偶数除数。将i=2
更改为i=3
,过滤后将得到327个结果。我不确定这是否是正确的答案,但以上至少是问题的一部分。你的素数函数是错误的,它应该将I增加1,而不是2,或者你缺少一些素数
然后您应该直接添加到集合
,而不是在生成表时创建列表,这样可以节省内存和CPU时间(正如Chris所评论的,您正在执行从0或1开始的循环,这会使您错过值,我在上一篇文章中忽略了这一点,现在所有索引都从0开始)。在这种情况下,您可以使用集合理解来进一步简化,使用5个公式可以在1,0,0处开始索引,并且不会忘记777777 0xX
的索引
(通过与B.M.answer的合作,这被调整为正确的解决方案,这更有效,但一开始也遗漏了案例)
(还请注意,散列整数不会花费太多CPU时间,因为通常散列就是整数本身)
其余的似乎没问题。以下是我的修改:
import time
def GeneratingTable():
A = {v for i in range (1,10) for j in range (0,10) for k in range (0,10)
for v in [i*1000000000+j*100000000+k*10000000+7777777,i*1000000000+j*100000000+77777770+k,i*1000000000+777777700+10*j+k,7777777000+i*100+j*10+k,7777777000+j*10+k]}
print(len(A))
return A
def ifPrime(n):
i = 2
while i * i <= n:
if n%i == 0:
return False
i += 1
return True
def check():
return sorted([p for p in GeneratingTable() if ifPrime(p)])
start = time.clock()
x = check()
print(len(x),x)
end = time.clock()
time = end - start
print(time)
导入时间
def GeneratingTable():
A={v表示范围(1,10)中的i,表示范围(0,10)中的j,表示范围(0,10)中的k
对于[i*100000000+j*100000000+k*10000000+77777,i*100000000+j*100000000+77777 0+k,i*100000000+77777 00+10*j+k,7777777 000+i*100+j*10+k,7777777 000+j*10+k]]
印刷品(透镜(A))
归还
def ifPrime(n):
i=2
而i*i是一种具有高效工具的方法,并且为了更高的复杂性:
from itertools import *
def p77():
S=set()
for triple in combinations_with_replacement('0123456789',3):
quadruple=triple+('7777777',)
for perm in permutations(quadruple):
if perm[0]!='0': # ensure 10 digits
s=''.join(perm)
S.add(int(s))
A=np.array(list(S))
[eratosthene][1]=np.arange(10**5) # sqrt(10**10)
for i in range(2,317): # sqrt(10**5)
if eratosthene[i]>0:
eratosthene[i*i::i]=0
little_primes=eratosthene[eratosthene>1]
for p in little_primes:
A=A[A%p>0]
return A
这将在0.1秒内给出203个素数:(-对于777)
您也可以使用跳过一组,范围为(1,10,2)的k
表示一位数。谢谢,现在一切都好了。你能告诉我更多有关直接向集合中添加数字的信息吗?这种方法比有列表的方法快吗?没有理由分别在i、j和k上循环4次——将所有a.add调用移到一组嵌套循环中。@ChrisJohnson我必须承认我没有尝试过对OP算法进行太多改进。但检查边界,有时从1开始,有时从0开始。@Paweł检查我的编辑。简化循环也有助于发现bug。您从0或1开始,缺少值。编辑文章,解释直接集合加法和性能。@ChrisJohnson,它遗漏了一些值。现在使用集合理解重写。很好的方法,但与“bruteforce”解决方案相比,我认为您缺少了一些素数。仍然缺少一些[1277777771, 1577777771, 1777777741, 1777777751, 1777777777, 2027777777, 2777777711, 2777777777, 3037777777, 3137777777, 3377777773, 3377777779, 3557777777, 3777777793, 3937777777, 3977777773, 4177777771, 4447777777, 4747777777, 4777777799, 4997777777, 5527777777, 5567777777, 6637777777, 6767777777, 7727777777, 7777777199, 7777777211, 7777777229, 777777777777777777777777777777777777777777577777777777777783877777778777777777777777778777777777778807777777779197777794777777777997777799988777777777993777777799777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777987777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
谢谢,我用替换的方式在组合中更改组合。我不考虑9位数的解决方案,所以我只有203个。多亏了你,我在公式中也找到了缺失的一个。
['124--, 12--1, 12--3, 145--, 148--, 15--1, 15--7, ',
'165--, 1--41, 1--51, 1--77, 178--, 18--3, 18--7, ',
'18--9, 192--, 195--, 201--, 202--, 20--1, 23--1, ',
'243--, 246--, 250--, 256--, 264--, 26--1, 2--07, ',
'2--11, 2--19, 2--41, 2--59, 2--77, 2--97, 291--, ',
'303--, 30--7, 313--, 319--, 324--, 325--, 33--3, ',
'33--9, 340--, 342--, 352--, 355--, 35--1, 3--01, ',
'3--67, 3--93, 382--, 393--, 39--3, 39--7, 402--, ',
'409--, 41--1, 42--3, 429--, 430--, 432--, 444--, ',
'456--, 468--, 474--, 4--03, 4--17, 4--27, 4--29, ',
'4--59, 4--69, 4--89, 4--93, 4--99, 486--, 493--, ',
'499--, 51--7, 523--, 538--, 54--7, 552--, 556--, ',
'561--, 562--, 564--, 5--01, 5--71, 5--91, 58--9, ',
'603--, 60--3, 60--7, 61--3, 62--7, 631--, 65--1, ',
'65--7, 663--, 675--, 676--, 6--31, 6--37, 6--57, ',
'6--91, 684--, 685--, 694--, 69--1, 69--3, 703--, ',
'708--, 732--, 738--, 748--, 753--, 754--, 759--, ',
'760--, 772--, --019, --027, --057, --069, --081, ',
'--103, --127, --169, --199, --207, --211, --229, ',
'--237, --261, --327, --361, --369, --379, --391, ',
'--421, --429, --453, --493, --517, --549, --577, ',
'--597, --633, --639, --649, --663, --669, --691, ',
'--703, --741, --781, --783, --789, --823, --849, ',
'--853, --871, --937, --963, --993, 783--, 795--, ',
'808--, 811--, 822--, 82--3, 834--, 838--, 84--1, ',
'85--3, 862--, 873--, 8--13, 8--17, 8--59, 8--77, ',
'880--, 894--, 89--7, 906--, 913--, 91--3, 919--, ',
'925--, 946--, 94--3, 94--9, 954--, 961--, 96--1, ',
'9--67, 9--87, 9--99, 981--, 988--, 993--, 99--3 ]