如果一个数字是Python的主要测试的最快方法

时间:2017-10-20 03:24:17

标签: python math primes

我正试图通过Python快速确定数字是否为素数。

我有两个功能可以做到这一点。两者都返回True或False。

函数isPrime1返回非常快False是一个数字不是素数。例如,有一个很大的数字。但是对于大素数来说,测试True的速度很慢。

函数isPrime2在为素数返回True时速度更快。但是如果一个数字很大并且它不是素数,则返回一个值需要很长时间。第一个功能更好用。

我怎样才能找到一个可以快速返回False的解决方案,这个解决方案可以快速返回一个不是素数的大数字,并且可以快速使用一个很大的数字?

`

def isPrime1(number): #Works well with big numbers that are not prime
    state = True
    if number <= 0:
        state = False
        return state
    else:          
        for i in range(2,number):
            if number % i == 0:
                state = False
                break
        return state

def isPrime2(number): #Works well with big numbers that are prime   
    d = 2
    while d*d <= number:
        while (number % d) == 0:            
            number //= d
        d += 1
    if number > 1:       
        return True
    else:
        return False`

3 个答案:

答案 0 :(得分:2)

彻底划分,直到平方根是你能想到的最简单的。最糟糕的情况是素数,因为必须执行所有的划分。无论如何,直到十亿,几乎没有可测量的时间(1000000007约1.2毫秒)。

def Prime(n):
    if n & 1 == 0:
        return 2
    d= 3
    while d * d <= n:
        if n % d == 0:
            return d
        d= d + 2
    return 0

请注意,此版本返回最小的除数或0而不是布尔值。

一些微观优化是可能的(例如使用增量表),但我认为它们不会产生大的收益。

有更复杂,更快捷的方法,但我不确定这些小n是否值得大惊小怪。

答案 1 :(得分:1)

这是我提出的

def is_prime(number):
    # if number is equal to or less than 1, return False
    if number <= 1:
        return False

    for x in range(2, number):
        # if number is divisble by x, return False
        if not number % x:
            return False
    return True

答案 2 :(得分:0)

原始性测试是一个非常棘手的话题。

在尝试加速代码之前,请尝试确保其按预期工作。 我建议你从非常简单的算法开始,然后从那里构建。

有趣的是,isPrime2存在缺陷。它返回True为6,10,12,......

第3到第6行非常有说服力

while d*d <= number:
    while (number % d) == 0:            
        number //= d
    d += 1

当找到number d因子时,数字会更新为number = number // d,并且在while循环结束时,如果数字&gt; 1您返回True

使用number = 6

处理代码
isPrime2(6)
initialise> number := 6
initialise> d := 2
line3> check (2 * 2 < 6)     :True
line4> check (6 % 2 == 0)    :True
line5> update (number := 6//2) -> number = 3
line6> update (d : d + 1) -> d = 3
jump to line3
line3> check (3 * 3 < 3)      :False -> GOTO line7
line7> check(number > 1) -> check(3 > 1) :True
line8> return True -> 6 is prime