首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python测试数字是否为质数的最快方法

使用Python测试数字是否为质数的最快方法
EN

Stack Overflow用户
提问于 2017-10-20 11:24:17
回答 3查看 17.7K关注 0票数 2

我正在尝试使用Python快速确定一个数字是否为质数。

我有两个函数来做这件事。两者都返回True或False。

函数isPrime1返回False非常快,是一个不是质数的数字。例如,使用一个大数字。但它在测试大质数的True时速度很慢。

对于质数,函数isPrime2返回True的速度更快。但是如果一个数字很大并且不是质数,那么返回值的时间就太长了。第一个函数在这方面效果更好。

我怎么才能想出一个解决方案,对于一个不是质数的大数,可以快速返回False,并且对一个大数是质数,可以快速工作呢?

`

代码语言:javascript
复制
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`
EN

回答 3

Stack Overflow用户

发布于 2017-10-20 15:42:17

穷尽除法,直到平方根是你能想到的最简单的。它最坏的情况是质数,因为所有的除法都必须执行。无论如何,在十亿之前,几乎没有可测量的时间(对于1000000007,大约是1.2ms)。

代码语言:javascript
复制
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而大惊小怪。

票数 8
EN

Stack Overflow用户

发布于 2017-10-20 11:56:32

素数测试是一个非常棘手的话题。

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

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

第3到6行很能说明问题

代码语言:javascript
复制
while d*d <= number:
    while (number % d) == 0:            
        number //= d
    d += 1

当找到number d的因子时,number被更新为number = number // d,并且在while循环结束时,如果number >1,则返回True

使用number = 6完成代码

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2017-10-20 13:48:46

这是我想出来的

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46841968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档