Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找所有10位素数,其中有7个“素数”;7“;一行-Python_Python_List_Primes - Fatal编程技术网

查找所有10位素数,其中有7个“素数”;7“;一行-Python

查找所有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

正如它在标题中所说的,我试图生成一个包含所有10位素数的列表,这些素数都是7x7。更准确地说,我指的是可以写成如下的数字:xxx777777,xx77777x,x7777xx,77777xxx

我的想法是生成所有这些数字的列表,然后检查其中哪一个是素数。代码如下:

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   ]