首页 > 编程语言 >数学:素性测试算法

数学:素性测试算法

时间:2024-08-13 23:04:44浏览次数:12  
标签:费马 定理 算法 测试 逆定理 素性

算法简介

对一个数的素性测试有很多种做法,有确定性测试的算法,也有概率性测试的算法。

确定性素性测试算法

确定性素性测试这里介绍两种:

  1. 线性筛法:利用线性筛在 \(O(n)\) 的时间复杂度内,将一个范围内的数素性全部求出,然后 \(O(1)\) 查询。

  2. 试除法:在 \(\sqrt{n}\) 内试商,判定是否存在 \(> 1\) 的约数,时间复杂度 \(O(\sqrt{n})\)。

概率性素性测试算法

费马小定理的逆定理

费马小定理:对于一个素数 \(p\),\(a^{p - 1} \equiv 1 \pmod p\)。

看到费马小定理,我们会想它的逆定理是否存在,如果存在,我们只需要随便选择一个 \(\le p\) 的数,然后进行判定即可。

但是,费马小定理的逆定理并不成立。素数一定满足费马小定理,但是有的合数也满足,如 \(341 = 31 \times 11,2^{341} \equiv 1 \pmod{341}\)。所以我们只能随机多个 \(\le p\) 的底数判定,才能有较高的概率得到正确的结果。

Miller-Rabin 素性测试

二次探测定理

对于奇素数 \(p\),当 \(x\) 满足 \(x^2 \equiv 1 \pmod{p}\),\(x\) 的解为 \(1,p - 1\),我们将其称为平凡平方根。

这个结论的证明很简单,我们将 \(1\) 移项,然后用平方差公式展开,得到 \((x + 1)(x - 1) \equiv 0 \pmod{p}\),我们发现要么 \(x - 1 = 0\),要么 \(x = (-1) \bmod p = (p - 1) \bmod p\)。

二次探测定理的逆定理也是成立的。

Miller-Rabin

我们的 Miller-Rabin 算法就是结合费马小定理的逆定理和二次探测定理的逆定理进行素性测试。

设我们随机的底数为 \(a\),我们先对 \(n \le 3\) 和 \(n\) 为偶数的情况特判掉。

对于奇数的 \(n\),我们发现费马小定理的指数为 \(k = n - 1\),此时 \(k\) 一定为偶数。我们改写为 \(k = 2^tv\),先将 \(a\) 变为 \(a^v\),如果此时 \(a = 1\),我们可以认为 \(n\) 直接通过了本轮测试,原因显然。

然后我们把 \(a\) 进行 \(t\) 轮相乘,每次相乘,我们会得到一个结果 \(v\)。如果 \(v = n - 1\),根据二次探测定理,我们找到了一个平凡平方根,可以通过测试。但是,如果我们在得到 \(n - 1\) 之前得到了 \(1\),则说明我们找到了非平凡平方根,不符合二次探测定理的逆定理,测试失败。

如果我们进行了 \(t\) 轮相乘,仍然没有得到 \(n - 1\),说明 \(n\) 一定为合数。至此,Miller-Rabin 算法结束。

标签:费马,定理,算法,测试,逆定理,素性
From: https://www.cnblogs.com/Feel-Good/p/18357910

相关文章

  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......
  • Java数组06:常见排序算法
    1.冒泡排序冒泡排序(BubbleSort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完......
  • 字符串算法
    KMP算法前言update2024.7.31今天重写了一篇KMP板子,之前是蒟蒻(现在也是),写的都是什么鬼,甚至没过模板题。感觉KMP优化没什么用,但是暂时保留吧。简介用模式串匹配文本串(主串)。对于一个模式串,找出每个位置的border(最长相等的前缀后缀),即为\(next\)数组。失陪时就跳到bord......
  • 8.13日测试内容
    8.13日测试内容T1:P1571眼红的Medusa题目传送门一遍过实现方法用陈老师二分函数,找到陈老师目标数字再按照科技创新奖的顺序输出\(AC\)\(Code:\)#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+7;inta[maxn],b[maxn];intn,m;intchenlao......
  • 最短路算法
    存在最短路的前提不存在负环。链接还是OIWiki好啊~~Floyd算法两两间最短路,可判负环。时间复杂度\(O(n^3)\)。像DP的思路一样。设\(f_{k,x,y}\)表示允许经过\(1\simk\)的点,\(x\toy\)的最短距离。\(O(n^3)\)的DP即可。按照\(k,x,y\)的顺序循环,每次与\(......
  • Python实现PID算法
    目录1.PID算法简介2.PID控制器的数学表达式3.Python实现PID算法场景:温度控制4.代码解释5.场景说明6.总结1.PID算法简介PID算法(Proportional-Integral-DerivativeControl)是经典的控制算法之一,广泛应用于自动控制系统中。PID控制器通过调节控制对象的输入,来实现对......
  • Python实现基因遗传算法
    目录基因遗传算法简介基因遗传算法的基本步骤Python实现基因遗传算法场景:优化二次函数Python代码实现代码解释场景说明总结基因遗传算法简介基因遗传算法(GeneticAlgorithm,GA)是一种基于自然选择和遗传学原理的优化算法,适用于求解复杂的组合优化问题。它通过模拟......
  • STL heap 算法库 堆操作
    算法库-堆操作基本操作make_heap()(1)从一个元素范围创建出一个最大堆(2)将区间内的元素转化为heap.--传比较器push_heap()对heap增加一个元素.将一个元素加入到一个最大堆pop_heap()对heap取出下一个元素.从最大堆中移除最大元素sort_heap()对heap转化为一......
  • 小白怎样理解AI大模型与传统算法?
    面对当前的AI大模型技术大潮的冲击,任何事情不提一提AI大模型,都会觉得自己落伍了,被时代所抛弃了。那AI大模型与传统算法到底有什么不同,是否会完全取代传统技术?我们有一个形象的类比,可以帮助大家更容易理解。这个类比的对象就是中医和西医。首先,我们来看看AI大模型与传统算法......
  • ChatGPT 大模型核心算法深度分析 2024
    在分析核心算法之前,我们先了解chatGPT相关技术发展进程首先介绍自然语言处理、大规模预训练语言模型以及ChatGPT技术的发展历程,接着就ChatGPT的技术优点和不足进行分析,然后讨论核心算法。1.1自然语言处理的发展历史人类语言(又称自然语言)具有无处不在的歧义性、高度......