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

基于C.P. Willans公式的Python质数生成代码溢出问题求助

解决Willans质数公式的OverflowError问题

问题根源

你遇到的OverflowError是因为计算第8个质数时,循环中的j会达到255,此时factorial(254)是一个极其庞大的整数。将这个整数转换为浮点数时,超出了Python浮点数的表示范围,导致溢出错误。原代码中通过余弦函数计算的部分,本质上是利用威尔逊定理判断j是否为质数,完全可以用整数运算替代浮点数操作来避免这个问题。

核心原理:威尔逊定理

威尔逊定理指出:当且仅当j是质数时,(j-1)! ≡ -1 mod j(即(j-1)! % j == j-1)。基于这个定理,我们可以直接用整数模运算替代原代码中的余弦函数计算,彻底规避浮点数溢出。

修改后的代码

def nth_prime(n):
    if isinstance(n, int) and n > 0:
        end_sum = 0
        max_i = 2 ** n
        for i in range(1, max_i + 1):
            count = 0
            for j in range(1, i + 1):
                if j == 1:
                    # 对应原公式中j=1的情况,结果为1
                    count += 1
                else:
                    # 计算(j-1)! mod j,避免生成超大整数
                    wilson_mod = 1
                    for k in range(1, j):
                        wilson_mod = (wilson_mod * k) % j
                    # 威尔逊定理判断j是否为质数
                    if wilson_mod == j - 1:
                        count += 1
            # 简化原公式中的pow和floor操作,用逻辑判断替代
            end_sum += 1 if count <= n else 0
        return end_sum + 1
    else:
        raise ValueError("请输入正整数")

print(nth_prime(8))  # 输出19,即第8个质数

额外说明

  • 该代码完全使用整数运算,彻底解决了浮点数溢出问题。
  • 对于n=8,代码需要遍历到2^8=256,运行速度较慢(这是Willans公式本身的理论特性,并非代码优化问题)。若需要更高效的质数生成,可使用埃氏筛法等实用算法。

内容的提问来源于stack exchange,提问作者Jan Rojek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:14:54