为什么这个素数算法对于 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))):
我很乐意收到关于为什么会这样的数学解释。
对于 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))):
我很乐意收到关于为什么会这样的数学解释。