Python 多项式素数结果的计数
有人能帮帮我,告诉我为什么这样不行吗?目标是计算给定多项式在指定范围[a,b]内为输入n生成的素数的数量:Python 多项式素数结果的计数,python,primes,polynomials,Python,Primes,Polynomials,有人能帮帮我,告诉我为什么这样不行吗?目标是计算给定多项式在指定范围[a,b]内为输入n生成的素数的数量: def count_primes(poly, a, b): primes = 0 if b >= a: for n in range(a, b): result = poly(n) if result > 1: for i in range(2, result
def count_primes(poly, a, b):
primes = 0
if b >= a:
for n in range(a, b):
result = poly(n)
if result > 1:
for i in range(2, result):
if (result % i) == 0:
break
else:
primes += 1
else:
break
return primes
def poly(n):
return n**2 + n + 41
print(count_primes(poly, 0, 39))
在这种情况下,结果应该返回40
[2] 问题解决方案
第一步。输入要检查的数字并将其存储在变量中。
第二步。将count变量初始化为0。
第三步。让for循环的范围从2到数字的一半(不包括1和数字本身)。
第四步。然后使用if语句查找除数的数目,并每次递增count变量。
第五步。如果除数小于或等于0,则该数为素数。
第六步。打印最终结果。
第7步。退出。这是计算素数的错误方法:
if result > 1:
for i in range(2, result):
if (result % i) == 0:
break
else:
primes += 1
应该是:
if result > 1:
isPrime = True
for i in range(2, result):
if (result % i) == 0:
isPrime = False
break
if isPrime:
primes += 1
而且,这是不言而喻的。质数检测的简单优化。您只需测试2和3与sqrt(结果)之间的所有奇数的可整除性。问题在于嵌套循环中的
else
子句引用if
,只有在循环结束时没有break
时才应激活该子句。只需将标识更改为:
if result > 1:
for i in range(2, result):
if (result % i) == 0:
break
else:
primes += 1
问题:
primes+=1
太早了。在你的方法中,你必须测试直到没有可能的除法发生,然后做加法[a,b]
端点都包含在内。然后你应该在你的中使用b+1
来表示范围(a,b+1)
中的n,这会产生40
您的代码认为7算作5个素数,每个测试的除数一个,它不能被除数整除。请注意,筛选适用于任何多项式同余。也就是说,如果p(x)是x中具有整系数的多项式,则p(x+kN)=p(x)mod N。如果b-a很大,或者a很大,利用这一点可以节省大量时间。顺便说一句,
用于。。。否则…
可能是一个更好的选择。请注意:在Python 3.8中,现在有math.isqrt()返回平方根的整数部分。
def count_primes(poly, a, b):
primes = 0
if b >= a:
for n in range(a, b+1):
result = poly(n)
if result > 1:
for i in range(2, result):
if (result % i) == 0:
break
else:
primes += 1
else:
break
return primes
def poly(n):
return n**2 + n + 41
print(count_primes(poly, 0, 39))