初等数学瞎扯Ⅱ:辅助工具
1|00. 前置知识
-
质数与合数:对于一个数
,若其因子只有 和 ,则称 为质数,否则为合数。 -
一些基础的数论函数知识,可以参见初等数学瞎扯Ⅲ:数论函数与筛法
2|01. 乘方运算
2|11-0. 问题简述
求
2|21-1. 普通快速幂
快速求
朴素算法是
设
2|31-2. 光速幂
适用于
我们令
注意到预处理部分复杂度是
3|02. 素性检验与质因数分解
3|12-0. 问题简述
判定一个数
3|22-1. 素性检验
2-1-1. 试除法
即枚举
2-1-2. 优化的试除法
上面的做法看起来非常呆,我们考虑优化这一过程。
首先给出定理
若
为合数,则其最小素因子 一定不大于 。
证明:反证,若其最小素因子
也可以考虑另一种证明,若最小素因子
那我们直接在
2-1-3. Miller-Rabin 算法
2-1-3-1. Miller-Rabin 算法思想
上述的算法效率太低,我们考察一个更高效的算法。
首先用到费马小定理,可以参见初等数学瞎扯Ⅰ:同余相关1-1。
若
为质数, ,则 。
我们写出其逆反命题
若
,则 不是质数。
那么我们可以取一组
但是这并不等价于若
然后可以考虑多随机几组
但是这并不等价于对于若干个
对于一类卡迈尔数,它满足对于所有
所以单上费马小定理是肯定不行的,接下来需要二次探测定理。
若
为质数,则 有且仅有解 。
同理写出逆反命题
若
的解不只有 ,则 不为质数。
具体证明在二次剩余里提到,关于二次剩余的知识可以参见初等数学瞎扯Ⅰ:同余相关二次剩余。
我们不妨令
将这两种做法结合起来后,我们可以发现此时对合数误判的概率相当低,同时我们可以随机多组数据,以保证正确性。
Miller-Rabin
算法的复杂度与随机次数息息相关,若我们把单次乘法的复杂度记为 Miller-Rabin
算法的复杂度为
但对于 OI 而言,Miller-Rabin
算法是可被视作确定性算法的,具体原因是我们要判断的数一般值域在
对于
内的数字检测,使用 即可。 对于
内的数字检测,使用 即可,但这种 抽象东西我们一般不会去背,所以使用前个质数即可完成检测。 关于更详细的信息,可以参见 OEIS。
朴素实现的复杂度是
注意到其实仍有优化空间,复杂度瓶颈在二次探测。我们考虑把二次探测的过程翻过来,把
注意
2-1-3-2. Miller-Rabin 代码实现
__EOF__

本文链接:https://www.cnblogs.com/-Complex-/p/17352441.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)