Python中的检查数字是否为素数,为什么要检查到int(sqrt(n)-1))而不是int(sqrt(n))

2024-09-28 21:29:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是Python新手。我试图了解这个函数如何检查质数:

from itertools import count, islice
from math import sqrt
def is_prime(n):
    if n < 2: return False
    return all(n%i for i in islice(count(2), int(sqrt(n)-1)))

据我所知,你可以检查因子直到和包括n的平方根,那么为什么这只测试sqrt(n)-1?我也不清楚函数的return all部分。n%i返回一个整数,余数。为什么这个表达式的计算结果是bool?任何关于这方面的建议都会很好。谢谢!在


Tags: 函数fromimportreturnisdefcountmath
2条回答

因为islice的第二个参数是一个计数,而不是要停止的值。在

xrange(2, int(sqrt(n))+1)编写这篇文章会更好

这里的范围不包括两端,通常都是1。在

  1. 该函数用于正确检查sqrt(n)。因为islice(count(2),sqrt(n)-1意味着count sqrt(n)-1从2开始的数字。在检查素数时,从2到它的平方根就足够了,因为即使有一个因子大于平方根,它也会有一个小于平方根的相应因子。在这里使用int(sqrt(n)),意味着我们要检查一个额外的数字-没有危害,但没有必要。使用int(sqrt(n)-1)意味着我们只进行必要的比较。

  2. 如果迭代的所有元素的计算结果都为true,则all()将返回true。在python中,0的计算结果为false。这意味着,如果对于2和sqrt(n)之间的任何数字,整数除法的余数为0,则all()将返回false。这是正确的,因为如果有一个因子,这个数不是素数。如果对于2到sqrt(n),整数除法的余数永远不是0,那么数字是素数-all()将返回true,因为迭代中没有零。

https://docs.python.org/2/library/itertools.html#itertools.islice

相关问题 更多 >