全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Willans 公式生成第 n 个素数的 Python 实现与溢出修复指南

本文详解 willans 公式在 python 中的实际应用,分析 `factorial(j-1)` 导致的浮点溢出根本原因,并提供基于模 2π 化简、高精度计算和数学优化的完整解决方案,使公式可稳定计算至第 10 个素数及以上。

Willans 公式是一类纯数学构造的素数生成公式,其核心思想是利用三角函数(如余弦)的取值特性编码 Wilson 定理:当且仅当 $ j $ 是素数时,$ (j-1)! \equiv -1 \pmod{j} $,即 $ \frac{(j-1)! + 1}{j} $ 为整数,此时 $ \cos\left(\pi \cdot \frac{(j-1)! + 1}{j}\right) = \pm 1 $,其平方为 1;否则结果落在 $ (-1,1) $ 内,平方后小于 1,向下取整为 0。因此内层求和 sum 实际统计了区间 $[1,i]$ 内的素数个数 $ \pi(i) $。

但原始实现存在严重缺陷:当 j 增大(例如 $ j \geq 18 $),factorial(j-1) 迅速突破 $10^{15}$ 量级,而 math.cos() 要求输入为 float——Python float 仅能精确表示约 $2^{53} \approx 9 \times 10^{15}$ 以内的整数,超出后转 float 即丢失精度,且对极大数取模 2π 时,浮点误差被急剧放大,最终触发 OverflowError 或返回无意义值。

✅ 正确解法不是强行用 Decimal 替换 float(math.cos 不支持 Decimal),而是数学化简:利用余弦函数周期性
$$ \cos(\pi x) = \cos\big(\pi \cdot (x \bmod 2)\big) $$
因为 $ \cos(\theta) = \cos(\theta \bmod 2\pi) $,而此处角度为 $ \pi x $,故只需将 $ x = \frac{(j-1)! + 1}{j} $ 对 2 取模,即计算 $ x \bmod 2 $。注意:$ x $ 是有理数,但 $ (j-1)! + 1 $ 除以 $ j $ 的整数部分不影响模 2 结果——关键在于判断该商是奇数还是偶数(因 $ \cos(k\pi) = (-1)^k $)。

更进一步,由 Wilson 定理:

  • 若 $ j $ 是素数,则 $ (j-1)! \equiv -1 \pmod{j} \Rightarrow (j-1)! + 1 \equiv 0 \pmod{j} $,商为整数;
  • 若 $ j $ 是合数且 $ j > 4 $,则 $ j \mid (j-1)! $,故 $ (j-1)! + 1 \equiv 1 \pmod{j} $,商非整数 → $ \cos^2 $ 值
  • 特殊小合数 $ j=1,4 $ 需单独处理($ j=1 $ 无定义,$ j=4 $:$ 3!+1 = 7 $,$ 7/4 = 1.75 $,$ \cos^2(\pi \cdot 1.75) = \cos^2(1.75\pi) = \sin^2(0.25\pi) = 0.5 $ → floor 为 0)。

因此,无需计算超大阶乘!只需判断 $ j $ 是否为素数(用试除法),即可直接得到 floor(cos²(...)) 的值:

def is_prime(x):
    if x < 2:
        return False
    if x == 2:
        return True
    if x % 2 == 0:
        return False
    for i in range(3, int(x**0.5) + 1, 2):
        if x % i == 0:
            return False
    return True

def nth_prime(n):
    if not isinstance(n, int) or n < 1:
        raise ValueError("n must be a positive integer")

    # 估算上界:第 n 个素数 < n*(log n + log log n) (n≥6),保守取 2**n 不必要且低效
    # 改用动态扩展搜索范围
    candidate = 2
    count = 0
    while count < n:
        if is_prime(candidate):
            count += 1
            if count == n:
                return candidate
        candidate += 1
    return candidate

⚠️ 注意事项:

  • Willans 公式本质是“存在性证明”,非实用算法:时间复杂度为 $ O(2^n \cdot n!) $,比朴素试除慢数个数量级;
  • 原始代码中 2**n 上界过于宽松(第 8 个素数是 19,却遍历到 256),应改用素数定理估算或动态增长;
  • pow(n / sum, 1/n) 在 sum=0 时会报错(如 i=1 时无素数),需加保护;
  • math.floor(pow(...)) 可简化为 int(...),但逻辑不变。

? 总结:面对数学公式的编程实现,优先考虑符号化约简而非数值硬算。Willans 公式的价值在于理论趣味性,工程中请始终选用筛法(如埃氏筛、分段筛)或优化试除。若坚持公式验证,建议用 SymPy 进行符号计算,避免浮点陷阱。


# python  # 编码  # app  # ai  # cos  # overflow  # 三角函数 


相关文章: 网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  网站制作知乎推荐,想做自己的网站用什么工具比较好?  如何用VPS主机快速搭建个人网站?  如何有效防御Web建站篡改攻击?  如何通过商城自助建站源码实现零基础高效建站?  如何在阿里云虚拟主机上快速搭建个人网站?  建站之星免费模板:自助建站系统与智能响应式一键生成  ui设计制作网站有哪些,手机UI设计网址吗?  建站主机SSH密钥生成步骤及常见问题解答?  安徽网站建设与外贸建站服务专业定制方案  如何快速搭建安全的FTP站点?  建站之星如何通过成品分离优化网站效率?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站之星好吗?新手能否轻松上手建站?  制作网站的模板软件,网站怎么建设?  建站之星如何快速更换网站模板?  如何通过cPanel快速搭建网站?  行程制作网站有哪些,第三方机票电子行程单怎么开?  外贸公司网站制作哪家好,maersk船公司官网?  javascript中对象的定义、使用以及对象和原型链操作小结  学校为何禁止电信移动建设网站?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  Swift中swift中的switch 语句  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  Android自定义listview布局实现上拉加载下拉刷新功能  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何在阿里云虚拟服务器快速搭建网站?  制作证书网站有哪些,全国城建培训中心证书查询官网?  盘锦网站制作公司,盘锦大洼有多少5G网站?  建站之星代理如何优化在线客服效率?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  网站制作说明怎么写,简述网页设计的流程并说明原因?  山东网站制作公司有哪些,山东大源集团官网?  如何用IIS7快速搭建并优化网站站点?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何在建站主机中优化服务器配置?  如何设置并定期更换建站之星安全管理员密码?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  建站主机选购指南与交易推荐:核心配置解析  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  中山网站制作网页,中山新生登记系统登记流程?  广东企业建站网站优化与SEO营销核心策略指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。