确定数字是否为素数

时间:2013-02-05 14:22:51

标签: python python-2.7 nested-loops primality-test

我知道它已被多次讨论过;我读过它,但不知怎的,我无法得到它。 我想编写一个程序来确定输入的数字是否为素数。

我在互联网上找到的其中一个实现:

from math import *

def main():
    n = abs(input("Enter a number: "))
    i = 2
    msg = 'is a prime number.'
    while i <= sqrt(n):
        if n % i == 0:
            msg = 'is not a prime number.'
        i = i + 1
    print n, msg


main()

这里有几个问题:

  • 在上文中,i是什么,为什么它的起始值为2
  • i = i + 1在此计划中做了什么?
  • 解释器如何知道何时打印'is a prime number.'即使它不在身体循环中?

2 个答案:

答案 0 :(得分:4)

素数是一个只能被1整除的数字。它使用的方法是尝试将候选人编号n除以2之间的每个其他数字;但是,如果任何数字i是您的数字n的除数,那么n / i也是如此,并且其中至少有一个小于或等于sqrt(n)因此我们只需要测试最高为sqrt(n)。在实践中,我们只需要测试实际为素数的除数,但由于我们没有一个素数列表,我们将测试每一个。

  

上面的i是什么?为什么它有2个起始值?

i是我们正在测试n的潜在因素。它从2开始,因为我们不关心1是否将n除以(并且很简单),因为主要定义允许/期望。

  

在这个具体的例子中,i = i + 1语句是什么?无法在程序中看到它的使用。

它在i定义的循环结束时递增while i <= sqrt(n)值;这意味着我们提前i来测试n的下一个候选除数。

  

最后,python如何知道何时打印'是素数。'虽然它不在身体循环中?

我们将msg初始化为“是一个素数”,如果我们找到任何除数,那么我们将它改为循环内的“不是素数”。如果循环没有找到除数,或者循环从不运行,我们将使用我们设置的初始值,即“是素数”。顺便说一句,当你找到一个除数时,你可以break离开循环;之后没有必要进行测试。

另外,您可能希望在while和store之外计算sqrt(n)而不是在while中使用的变量 - 您可能会重新计算每次迭代的平方根,这相对较贵

答案 1 :(得分:1)

我在各方面添加了评论来解释每一行的作用:

from math import * # imports everything from the math module

def main():
    n = abs(input("Enter a number: ")) # gets input from the user
    i = 2 # starts off at 2 because all input is divisble by 1
    msg = 'is a prime number.' # the message is initially set
    while i <= sqrt(n):
        if n % i == 0: # if 'i' divides evenly into n
            msg = 'is not a prime number.' # only set if it isn't a prime
        i = i + 1 # increases 'i' by 1 so it can check every value up to the square-root of 'n' (to see if it divides evenly)
    print n, msg


main()

程序必须遍历i的每个值(最多为n的平方根),以便检查每个可能的因素。

这是一种粗略的素数检查器,对于不是素数的大数字效率低: 如果输入是1234567890之类的数字,它将遍历每个数字,直到该数字的平方根,即35147(向上舍入)。 使用return语句会中断循环,因此您检查的第一个数字2,它被声明为非素数,因为它可以被2整除。 通过使用return,它将停止该功能,并为您节省35,146次计算。这不是一个庞大的数字(至少对于计算机来说),但它的内存效率更高,耗时更短。

def isPrime(n):
    '''Checks if 'n' is prime.'''
    from math import sqrt
    if n == 0 or n == 1:
        return False
    else:
        for check in range(2, int(sqrt(n))+1):
            if n % check == 0: return False
    return True