判断一个数是不是素数的最高效的算法

判断一个数是否是素数,有从简单到复杂多种方法。最高效的算法取决于输入规模(是几个亿以内的数,还是上百位的大整数),我会按实用场景分类讲解:


常规范围内(比如 ≤ 1e12)判断素数的最高效方法

使用试除法优化版 + 6k±1 检查法

import math

def is_prime(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False

    # 只检查 6k±1 的数(跳过能被2或3整除的数)
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True
  • 时间复杂度:O(√n),比普通的 i += 1 快大约 3 倍以上。
  • 在 64 位整数范围(最多约 1e18)内表现优良。

更高效但更复杂的方法:Miller-Rabin 素性测试(确定性/概率性)

适用于 更大的整数(如 64 位整数、甚至上百位)

✅ Python 中的 Miller-Rabin 判断(64位内确定性版本):

def is_prime_miller_rabin(n):
    if n < 2:
        return False
    for p in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]:
        if n % p == 0:
            return n == p

    d = n - 1
    r = 0
    while d % 2 == 0:
        d //= 2
        r += 1

    def try_composite(a):
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            return False
        for _ in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                return False
        return True  # composite

    for a in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]:
        if try_composite(a):
            return False
    return True
  • 时间复杂度:O(k * log n),其中 k 是轮数,pow() 是快速幂。
  • 经过这些 a 值验证,对于 n < 2^64 是确定性的

🧠 总结:选择最优算法依据规模

数值范围建议算法是否确定性Python 实现
≤ 10^126k±1 优化试除法✅ 是快速、简单
≤ 2^64Miller-Rabin(特定基底)✅ 是快速、安全
任意大整数Miller-Rabin(多轮)⚠️ 概率性可自定义轮数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值