You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python高效质数判定代码编写求助:需优化现有基础实现

高效质数判定的Python实现优化方案

你的基础实现虽然能正确判断质数,但效率太低——遍历到num-1完全没必要,针对不同场景,下面给你几种逐步优化的方案:

优化1:缩小遍历范围+奇偶过滤

核心思路

如果一个数num是合数,那它必然有一个不大于√num的因数,所以只需要遍历到√num就行;另外除了2以外,所有偶数都不是质数,可以直接跳过偶数遍历,减少一半循环次数。

实现代码

import math

num = int(input('Enter the number to check whether it is prime or not: '))

if num <= 1:
    print("Not Prime")
elif num == 2:
    print("Prime number")
elif num % 2 == 0:
    print("Not Prime")
else:
    is_prime = True
    # 用math.isqrt避免浮点精度问题,返回整数平方根
    sqrt_num = math.isqrt(num)
    # 从3开始,只遍历奇数,步长设为2
    for i in range(3, sqrt_num + 1, 2):
        if num % i == 0:
            is_prime = False
            break
    print("Prime number" if is_prime else "Not Prime")

优化2:米勒-拉宾素性检验(超大数专用)

如果需要判断几百位的超大质数,上面的方法还是不够快,这时候可以用米勒-拉宾素性检验——这是一种概率性算法,但对于小于2^64的数,用固定的几个测试底数就能得到100%准确的结果,性能碾压前两种方案。

实现代码

def is_prime(n):
    # 处理小数字的边界情况
    if n <= 1:
        return False
    elif n <= 3:
        return True
    elif n % 2 == 0:
        return False
    
    # 将n-1分解为d*2^s的形式
    d = n - 1
    s = 0
    while d % 2 == 0:
        d //= 2
        s += 1
    
    # 对于n < 2^64,这些底数可以保证判定准确
    test_bases = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
    for a in test_bases:
        if a >= n:
            continue
        # 快速幂取余,避免计算溢出
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        # 进行s-1次平方取余
        for _ in range(s - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                break
        else:
            # 所有循环都没触发break,说明是合数
            return False
    return True

num = int(input('Enter the number to check whether it is prime or not: '))
print("Prime number" if is_prime(num) else "Not Prime")

适用场景总结

  • 基础实现:仅适合教学演示,小数字(比如小于1000)用用还行
  • 平方根优化方案:日常开发中判断中小数字质数,足够高效
  • 米勒-拉宾:需要处理超大质数(比如密码学场景)时的首选

内容的提问来源于stack exchange,提问作者Jitesh Garg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:30:21