我是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列表中该范围内的数字。任何人都可以帮助我这样做,也许指出此代码中的任何其他内容?
答案 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
请注意,将p
和P
作为变量非常容易混淆。
答案 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
就其他观察而言:
upper_bound
,prime_list
,prime
等名称可以更轻松地减轻/发现变量混淆。另请检查PEP8以了解Python中的一般命名约定,这些约定将使您的代码对其他Python程序员更具可读性和一致性。答案 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检验素数。此外,常用除数的列表可能会派上用场!