让我们从函数代码的前四行开始:
def isprime(n):
if n == 2: return True
if n == 3: return True
if n % 2 == 0: return False
if n % 3 == 0: return False
该函数首先测试是否n
等于 2 或 3。由于它们都是素数,因此True
如果n
等于其中一个,该函数将返回。
接下来,该函数测试是否n
可以被 2 或 3 整除,False
如果其中一个为真,则返回。这消除了极大数量的情况,因为大于 2 的所有数字中有一半不是素数 - 它们可以被 2 整除。同样的原因适用于测试可被 3 整除 - 它也消除了大量情况。
该函数更棘手的部分在接下来的几行中:
i = 5
w = 2
while i * i <= n:
if n % i == 0:
return False
i += w
w = 6 - w
return True
首先,i
(或索引)设置为 5。2 和 3 已经过测试,4 已经用n % 2
. 因此,从 5 开始是有意义的。
接下来,w
设置为2。w
似乎是一个“增量器”。到目前为止,该函数已经测试了所有偶数 ( n % 2
),因此增加 2 会更快。
该函数进入一个while
带有条件的循环i * i <= n
。使用此测试是因为每个合数都有一个小于或等于其平方根的适当因数。在平方根之后测试数字是没有意义的,因为它是多余的。
在while
循环中,如果n
能被 整除i
,则它不是素数,函数返回False
。如果不是,i
则由 "incrementer" 递增w
,这同样更快。
也许该函数最棘手的部分在于倒数第二行:w = 6 - w
. 这会导致“增量器”w
在每次通过循环时在值 2 和 4 之间切换。在 4 的情况下w
,我们绕过了一个可被 3 整除的数字。这比保持为 2 更快,因为该函数已经测试了可被 2 和 3 整除的能力。
最后,函数返回True
。如果该函数没有检测到任何n
可被某物整除的情况,则它必须是素数。