大数素性检测
大数素性检测的数学理论基础分析
大数的素性检测可以分为确定性的素性检测和概率性的素性检测
确定性的素性检测在小整数的素性检测中虽然已经够用,但是在大整数的素性检测中,这些算法明显复杂度大大增加,所以人们又寻找到了更加高效的概率性素性检测来寻找大素数。
这里仅仅举出比较常见或者比较著名的素性检测方法。
确定性素性检测
1.广义欧几里得定理素性检测
\[\forall n\in N^{+},如果对所有i\le\sqrt{n},i\in N^{+},满足i\not\mid n,则n为素数。。 \]想法
对于这个素性检测的一种优化是i可以换作小于n的平方根的素数,因为小于n的平方根的数都有素因子,所以可以优化,但是这种优化仅仅对于小整数而言好用。
这里的时间复杂度仍然是指数级的,但是我们期望能够有多项式级的算法,帮助我们高效进行素性检测。
时间复杂度
\[O(2^{(logN)/2}) \]2.Lucas–Lehmer素性检验(用于梅森数的检验)
\[梅森数是形如2^{n}-1的数,记为M_n;若其为素数,则称之为梅森素数。 \]并且当n为合数时,梅森数也为合数;当n为素数是,梅森数不一定都是素数
\[\begin{align*} &1.定义序列 S_{i},i>0\\ &2.S_i=4,i=0;\\ &3.S_i=S_{i-1}^2-2,i>0\\ &4.那么M_n为素数当且仅当S_{n-2} \equiv0(modM_n)\\ &5.否则M_p为合数\\ &6.时间复杂度O(n^{3}) \end{align*} \]想法
这里的确定性算法虽然时间复杂度很低,但是仅仅适用于梅森数的检验,十分具有局限性,但是对于大素数的寻找很有帮助,最近几个最大素数便是该算法寻找到的。
在这个结论的证明中,因为这是个序列,所以自然而然想到用数学归纳法,但是其中构造的方法颇为巧妙,构造一对
\[{\displaystyle \omega {\bar {\omega }}=(2+{\sqrt {3}})(2-{\sqrt {3}})=1} \]用于证明每个Si都满足
\[{\displaystyle s_{i}=\omega ^{2^{i}}+{\bar {\omega }}^{2^{i}}} \]证明充分性时,运用了反证法,再引入群的概念,通过群元素的阶和素因子的性质导出矛盾。
证明必要性时,运用了二次剩余,欧拉准则,费马小定理以及初等群论等来证明。
同样的,也有同类型的素性检测,Pepin测试,但是它也仅适用于费马数,这样的局限性过于致命。
3.AKS素性测试(仅了解)
想法
这是最为著名的确定性素性测试,因为它的出世成功使素数判定的时间复杂度降到了多项式复杂度,并且没有依赖任何未得到证明的猜想。
该证明涉及费马小定理,群、环和域等知识,中间具体内容本人难以理解。
AKS素性测试主要是基于以下定理
\[(x+a)^n\equiv(x^n+a)(mod x^{r-1},n) \]具体计算中可以使用贝祖定理进行公约数的计算。
算法操作:
\[\begin{align*} &1.输入:整数 n > 1\\ &2.若存在整数a > 0 且b > 1 ,令 n = ab ;则输出合数\\ &3.找出最小的 r 令 ordr(n) > log2(n).\\ &4.若对某些a ≤ r,1 < gcd(a,n) < n,输出合数。(gcd是指最大公约数)。\\ &5.若 n ≤ r, 输出素数。\\ &6.对 a = 1 到 {\displaystyle \scriptstyle \lfloor \scriptstyle {\sqrt {\varphi (r)}}\log(n)\scriptstyle \rfloor }\scriptstyle \lfloor \scriptstyle {\sqrt {\varphi (r)}}\log(n)\scriptstyle \rfloor 的所有数, 如果 (X+a)n≠ Xn+a (mod Xr ? 1,n), 输出合数。\\ &7.输出素数。 \end{align*} \]概率性素性检测
1.费马素性检验(主要找课外知识)
想法
这个素性检验是根据费马小定理的逆定理来筛选大素数的。
\[如果p是素数,{\displaystyle 1\leq a\leq p-1},那么a^{{p-1}}\equiv 1{\pmod {p}} \]但是由于其逆定理并不正确,对于卡迈克尔数即满足费马小定理的逆定理但是不为素数的数,虽然卡迈克尔数很少,在1~100000000范围内的整数中,只有255个卡迈克尔数,但是已经使他的效果落后于Miller-Rabin和Solovay-Strassen素性检验。
\[\begin{align*} &1.输入:n\ge3;k:参数之一来决定检验需要进行的次数。\\ &2.输出:当n是合数时,否则可能是素数:\\ &3.重复k次:\\ &在[2, n ? 2]范围内随机选取a\\ &如果a^{n ? 1} mod n ≠ 1那么返回合数\\ &返回可能是素数 \end{align*} \]出错的概率
在选取底数a时,有二分之一的概率出错,但是可以通过多次选取底数来使出错概率降下期望值。
\[在重复k次成立的情况下,n为合数的可能性小于\frac{1}{2^k} \]突破
2016年,我国物流工人提出了卡迈克尔数判别准则,
\[\begin{align*} &n=(6k+1)(18k+1)(54k^2+12k+1)=5832^4+2592k^3+450k^2+36k+1\\ &(n-1)/(6k)=972k^3+432k^2+75k+6\\ &(n-1)/(18k)=324k^3+144k^2+25k+2\\ &(n-1)/(54k^2+12k)=108k^2+24k+3 \end{align*} \]如果6k+1,18k+1,54k^2+12k+1都是素数(比如k=1,2),那么n必然是卡迈克尔数,与先前的判别法相比,这个公式的亮点就是新发现的二次式也可以作为卡迈克尔数因子。
时间复杂度
\[O(k×log3n) \]2.欧拉-雅克比伪素数和Solovay-Stassen素性检验(主要找课外知识)
想法
在模平方剩余判别时,欧拉判别法则要求模为奇素数,但是雅克比符号弱化了这样的条件,只要求模为奇整数,这样的变化可以用于判断模平方剩余,但是和欧拉定理不能等价,于是会存在伪素数。
欧拉伪素数:
设n为正奇合数,设整数b与n互素。如果整数n和b满足条件
\[b^{\frac{n-1}{2}}\equiv(\frac{b}{n})(modn) \]则n叫做对于基b的欧拉-雅克比伪素数。
Solovay-Stassen算法:
\[\begin{align*} &1.输入:n,一个值以测试素性 k,其确定测试的准确性的参数\\ &2.输出:n是合数,否则可能是素数\\ &3.重复k次:在 [2, n ? 1]\\ &范围内随机选择一个{\displaystyle x\gets \left({\tfrac {a}{n}}\right)} \\ &如果 x = 0 或 {\displaystyle a^{(n-1)/2}\not \equiv x{\pmod {n}}} \\ &然后返回合数\\ &否则返回可能是素数 \end{align*} \]出错的概率
所有欧拉-雅克比伪素数同时是费马伪素数,这个判别公式对所有素数都成立,因而可以用于概率素性检验,他的可靠性是费马素性检验的两倍多。
时间复杂度
\[O(k·log3 n) \]3. Miller-Rabin素性检验(主要找课外知识)
想法
素性检测首先利用了因数分解式,将幂次n-1降低为以2为阶的各次幂,再利用中国剩余定理,推出强伪素数的满足条件,在算法优化中,采用模平方算法降低复杂度,这也是该算法的优势之一,大大提高了效率。
\[\begin{align*} &给定奇整数n\ge3和安全参数k\\ &写n-1=2^st,其中t为奇整数\\ &1.随机选取整数b,2\le b \le n-2\\ &2.计算r_0\equiv b^t(modn)\\ &3.\\&(1)如果r_0=1或r_0=n-1,则通过检验,回到第一步,重选b\\ &(2)否则有r_0\neq1以及r_0\neq n-1,计算r_1\equiv r_0^2(modn)\\ &以此类推,直到n-2为止,通过检验则输出可能为素数,否则为合数 \end{align*} \]出错的概率
\[在k次检测通过的情况下,n为合数的概率小于\frac{1}{4^k} \]相比之下,这样的出错概率遥遥领先与费马素性检测和Solovay-Stassen素性检测。
时间复杂度
模平方算法下
\[{\displaystyle O(k\log ^{3}n)} \]转载请注明出处:https://www.cnblogs.com/merk11/
总结感悟
大数素性检测的发展,从最初的基于单一定理进行穷举检测,到特殊素数的检测,再到一般素数的综合检测,一步一步从复杂到简单,从特殊到一般;不仅如此,由于素数的重要性,人们更追求在更短时间内判定出素数,通过弱化某些条件或者寻找某些定理逆命题的可靠性,来概率性地判别素数,在概率性素数检测发展中,Miller-Rabin最为著名,也是由于他能够采用更加优良的模平方算法,大大降低了算法复杂度,使大数素数的判定速率有了质的飞跃。
数学家们至今仍然在素性检测的山峰上攀登,在学习过程中,我寻找到了不少基于黎曼猜想的素性检测,由于黎曼猜想并未完全被证明,这些素性检测便仍然有很大的局限性。
各个素性检测各有优势,对待不同的检测要求,大数范围,选取的素性检测也不同。素性检测在对应的场景,经过人工的调试,能够发挥更大的作用,比如概率性检测的安全参数k便可以根据要求而改变。
转载请注明出处:https://www.cnblogs.com/merk11/