判断一个数是不是素数的最高效的算法
判断一个数是否是素数,有从简单到复杂多种方法。最高效的算法取决于输入规模(是几个亿以内的数,还是上百位的大整数),我会按实用场景分类讲解:
✅ 常规范围内(比如 ≤ 1e12)判断素数的最高效方法
使用试除法优化版 + 6k±1 检查法:
import mathdef is_prime(n):if n <= 1:return Falseif n <= 3:return Trueif n % 2 == 0 or n % 3 == 0:return False# 只检查 6k±1 的数(跳过能被2或3整除的数)i = 5while i * i <= n:if n % i == 0 or n % (i + 2) == 0:return Falsei += 6return 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 Falsefor p in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]:if n % p == 0:return n == pd = n - 1r = 0while d % 2 == 0:d //= 2r += 1def try_composite(a):x = pow(a, d, n)if x == 1 or x == n - 1:return Falsefor _ in range(r - 1):x = pow(x, 2, n)if x == n - 1:return Falsereturn True # compositefor a in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]:if try_composite(a):return Falsereturn True
- 时间复杂度:
O(k * log n)
,其中 k 是轮数,pow()
是快速幂。 - 经过这些
a
值验证,对于 n < 2^64 是确定性的。
🧠 总结:选择最优算法依据规模
数值范围 | 建议算法 | 是否确定性 | Python 实现 |
---|---|---|---|
≤ 10^12 | 6k±1 优化试除法 | ✅ 是 | 快速、简单 |
≤ 2^64 | Miller-Rabin(特定基底) | ✅ 是 | 快速、安全 |
任意大整数 | Miller-Rabin(多轮) | ⚠️ 概率性 | 可自定义轮数 |