0

0

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

碧海醫心

碧海醫心

发布时间:2025-12-27 17:46:01

|

236人浏览过

|

来源于php中文网

原创

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²(...)) 的值:

MusicAI
MusicAI

AI音乐生成工具

下载

立即学习Python免费学习笔记(深入)”;

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 进行符号计算,避免浮点陷阱。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

594

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

177

2023.11.13

python求阶乘教程大全
python求阶乘教程大全

本专题整合了python求阶乘相关教程,阅读专题下面的文章了解更多详细内容。

13

2025.11.08

python语言求阶乘
python语言求阶乘

本专题整合了python中阶乘相关教程,阅读专题下面的文章了解更多详细步骤。

43

2025.12.06

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

605

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号