Python列表(带素数)

时间:2015-01-06 20:19:07

标签: python primes

我是Python的初学者,我需要帮助修复我创建的这段代码。 Bassicaly,我的代码如下。

import math

def generate_p(p, Count, X, List):
    while Count <= X:
        isprime = True
        for x in range(2, int(math.sqrt(p)) + 1):
            if p % x == 0:
                isprime = False
        if isprime:
            Count += 1
            print p
            P.append(p)
        p += 1

if __name__ == "__main__":
    p = 2
    count = 1
    X = int(raw_input('number: '))
    List = []
    generate_p(p, count, X, List)

基本上,该功能确实有效,但它不能发挥我想要的功能。首先,我将说明函数的逻辑如何工作,因为代码的第二部分只是变量并声明函数。
当变量count小于或等于X时,prime为真,只要p(被测试的数字)可以进入每个x而没有余数(x在2的范围内通过p的平方根)。如果是素数,则在计数中加1,打印素数,将其添加到列表中,然后将1到p,即被测试的数字。如果它不是素数,那么只需将p加1即可。这一直持续到Count大于X,然后代码停止 正如您现在可能已经注意到的那样,有一个收集素数的列表,但是,这大部分都未被使用。我想做什么,但我不知道该怎么做,是修复这部分代码,

for x in range(2, int(math.sqrt(p)) + 1):
    if p % x == 0:
        isprime = False

所以x在2和p + 1的平方根的范围内,但是,我只希望x是P列表中该范围内的数字。任何人都可以帮助我这样做,也许指出此代码中的任何其他内容?

6 个答案:

答案 0 :(得分:2)

您可以使用List Comprehension,如下所示:

for x in [prime in P if prime<=math.sqrt(p)]:
    ...

答案 1 :(得分:2)

如果您想迭代P中小于或等于p平方根的数字:

for x in (i for i in P if i <= math.sqrt(p)):
    if p % x == 0:
        isprime = False
        break # can stop here

请注意,将pP作为变量非常容易混淆。

答案 2 :(得分:0)

虽然其他答案在逻辑方面是正确的,但他们会评估P中每个项目的大小。如果P按大小的升序排序,并且P足够大,则循环P并在循环顶部包含break子句可能更有效。

编辑实际上要执行此操作,您需要将此部分拆分为自己的函数,以便不终止顶级while循环。然后你只需在每个点返回True / False

def is_prime(x, P):
    sqrt_p = int(math.sqrt(p)) + 1
    for x in P:
        if x > sqrt_p:
            return True
        if p % x == 0:
            return False
    return True

就其他观察而言:

  1. 尝试使用更好的名字。 X,List,P,p等使得难以调试和修改代码。实际上,你正在将List发送到函数中但不对它做任何事情 - 我猜P和List应该是同一个东西。使用upper_boundprime_listprime等名称可以更轻松地减轻/发现变量混淆。另请检查PEP8以了解Python中的一般命名约定,这些约定将使您的代码对其他Python程序员更具可读性和一致性。
  2. 不是在函数外部创建一个空列表然后作为参数发送它,最好在函数中创建列表,追加找到的所有素数,并让函数返回列表 - 它倾向于提高可读性并减少错误的范围。

答案 3 :(得分:0)

我认为你正在寻找sieve of Eratosthenes algorythm。 python实现可能如下所示:

 def erato(n):
    "Compute all prime numbers less than or equal to n"
    # utility functions in order to work only with numbers starting at 2
    def prime(i):
        return isprime[i - 2]
    def setprime(i, val):
        isprime[i - 2] = val
    # suppose all numbers may be primes until we find divisors
    isprime = [ True for i in range(2, n+1) ]
    for i in range(2, int(math.sqrt(n)) + 1):
        # do not process non prime numbers
        if prime(i):
            # if i is prime, all its multiples are not
            j = 2 * i
            while j <= n :
                setprime(j, False)
                j += i
    # return the list of prime numbers
    return [ i for i in range(2, n + 1) if prime(i) ]

答案 4 :(得分:0)

看看你是否可以把你的面包裹在这个发电机周围......最快的那个。

def isprime(value):
    stack = [0 for i in xrange(value*2)]
    for jump in xrange(2,value,1):
        for i in xrange(jump,value*2,jump):
            stack[i] += 1
    if stack[value] > 1:
        return False
    else:
        return True

至少是我最快的方法。比检查每个数字快得多

答案 5 :(得分:0)

如果要在p很大时根据时间复杂度优化函数,我建议您研究Fermats素数检验或Soloway strausse检验素数。此外,常用除数的列表可能会派上用场!