Python 多项式素数结果的计数

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

有人能帮帮我,告诉我为什么这样不行吗?目标是计算给定多项式在指定范围[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):
                    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))