为什么这个素数算法对于 323 会失败?

Why does this primes algorithm fail for 323?

对于 323,以下代码应该 return 为假,这不是质数。

import math as m
    def isprime(a):
        if a < 2 or a != 2 and a % 2 == 0 or str(a)[-1] == "5" and a != 5 or sum([int(i) for i in list(str(a))]) % 3 == 0 and a != 3:
            return(False)
        elif a == 2:
            return(True)
        else:
            for divisor in range(3, m.floor(m.sqrt(a))):
                if a % divisor == 0:
                    return(False)
            return(True)     # So far, fails ONLY for 323!
    print(isprime(323))   # prints "True" when this should not be!

然而,return是正确的。

Range是从右边开的,所以需要增加它的上界:

for divisor in range(3, 1 + m.floor(m.sqrt(a))):

如前所述,错误是排除了平方根本身。在某些情况下,数字本身之后的最高因数比平方根多一。同样,在尝试了两种方法后,我补充说,限制平方根与简单地加 1 的效果不同。 仅添加作品。

以下有效。

for divisor in range(3, m.ceil(m.sqrt(a))):

请改用:

for divisor in range(3, 1 + m.floor(m.sqrt(a))):

我很乐意收到关于为什么会这样的数学解释。