在python中检查数字是素数,为什么检查int(sqrt(n)-1))而不是int(sqrt(n))

时间:2015-08-29 08:28:55

标签: 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返回一个int,余数。那么为什么这个表达式会被评价为bool?对此的任何指示都会很棒。谢谢!

2 个答案:

答案 0 :(得分:4)

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

使用xrange(2, int(sqrt(n))+1)

写得好得多

这里的加号是使两端的范围包含在内,xrange通常不是。

答案 1 :(得分:1)

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

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

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