素性测试
gydF4y2Ba质数检验是<年代trong>确定的年代trong>如果输入的数字为质数时输出为True,输入的概率为1时输出为False。否则,质数检验为<年代trong>概率年代trong>.概率质数检验通常称为伪质数检验。
gydF4y2Ba在下面,<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是一个正整数,大于<年代p一个nclass="katex"> 1年代p一个n>年代p一个n>.
试除法
这是最简单的确定性质数检验之一,通过简单地检查一个数为质数的条件。它利用了质数不能被除自身之外的任何正整数整除的事实<年代p一个nclass="katex"> 1年代p一个n>年代p一个n>所以我们可以把它转化成它的逆命题:如果一个数能被除它自身之外的其他正整数整除<年代p一个nclass="katex"> 1年代p一个n>年代p一个n>,它是复合的。
1 2 3 4 5 6 |
|
但是,没有必要检查所有的数字<年代p一个nclass="katex"> 2年代p一个n>年代p一个n>来<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>.
你的朋友写了一个程序来检查是否有数字<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是质数。它非常简单,通过检查是否工作<年代p一个nclass="katex"> n年代p一个n>年代p一个n>能被从2一直到的每一个数整除吗<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>.当你看到这个,你诅咒你的朋友,告诉他他在浪费时间。
gydF4y2Ba如果你的朋友不想浪费时间,他需要检查的最大数字(大约)是什么,然后他才能确定任何数字<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是质数吗?
假设<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是综合的,所以<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">p年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03588em;">问年代p一个n>年代p一个n>为<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≤年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">p年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">问年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≤年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>.我们认为至少有一个<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">问年代p一个n>年代p一个n>不大于<年代p一个nclass="katex"> n年代p一个n>年代p一个n> .的确,如果两者都大于<年代p一个nclass="katex"> n年代p一个n>年代p一个n> ,然后<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03588em;">问年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">>年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">n年代p一个n>年代p一个n> ⋅年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">n年代p一个n>年代p一个n> =年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">n年代p一个n>年代p一个n>,一个矛盾。因此无论何时<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是不是合数,它的其中一个因数不大于<年代p一个nclass="katex"> n年代p一个n>年代p一个n> ,所以我们可以修改上面的范围端点:
1 2 3 4 5 6 7 |
|
我们遍历<年代p一个nclass="katex"> 我年代p一个n>年代p一个n>为<年代p一个nclass="katex"> n年代p一个n>年代p一个n> 时间,所以时间复杂度是<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mord sqrt">n年代p一个n>年代p一个n> )年代p一个n>年代p一个n>,乘以除法的时间复杂度(大约相当于乘法的时间复杂度)<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">lgydF4y2Bag年代p一个n>年代p一个n>lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,采用牛顿-拉夫森除法)。这将导致较大值的性能较差<年代p一个nclass="katex"> n年代p一个n>年代p一个n>.
威尔逊定理
一个正整数<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">>年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n>年代p一个n>质数是否当且仅当<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord mathdefault">n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mclose">!年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">−年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.<年代p一个nclass="katex"> □年代p一个n>年代p一个n>
因此,我们可以简单地计算<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord mathdefault">n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mclose">!年代p一个n><年代p一个nclass="mspace allowbreak">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n>年代p一个n>检查是否<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是质数。
1 2 3 4 5 5 |
|
然而,这是荒谬的缓慢;这需要<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mord mathdefault">n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>乘法,甚至比上面的试除法还要慢。(这可与未修改的试验划分相比较,检查到<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>而不是<年代p一个nclass="katex"> n年代p一个n>年代p一个n> .)
费马素数测试
这个质数检验采用了<一个href="//www.parkandroid.com/wiki/fermats-little-theorem/" class="wiki_link" title="费马小定理gydF4y2Ba" target="_blank">费马小定理一个>.
<!--end-米eta -->
让<年代p一个nclass="katex"> p年代p一个n>年代p一个n>是质数和<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>是一个不能被整除的整数<年代p一个nclass="katex"> p年代p一个n>年代p一个n>.然后<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="msupsub">p年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>总能被整除<年代p一个nclass="katex"> p年代p一个n>年代p一个n>,或<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="msupsub">p年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.<年代p一个nclass="katex"> □年代p一个n>年代p一个n>
费马质数检验的思想是使用反命题:如果对于某些<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>不整除<年代p一个nclass="katex"> n年代p一个n>年代p一个n>我们有<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="msupsub">n年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,然后<年代p一个nclass="katex"> n年代p一个n>年代p一个n>绝对是合成的。
gydF4y2Ba然而,如果<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是合数,那么有吗<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>作品!例如,考虑<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">5年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">一个年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">4年代p一个n>年代p一个n>.我们可以计算出来<年代p一个nclass="katex"> 4年代p一个n><年代p一个nclass="msupsub">1年代p一个n><年代p一个nclass="mord mtight">5年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">4年代p一个n><年代p一个nclass="msupsub">1年代p一个n><年代p一个nclass="mord mtight">4年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>1年代p一个n><年代p一个nclass="mord">5年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,所以如果我们有<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mord">5年代p一个n>年代p一个n>但是我们选择<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">4年代p一个n>年代p一个n>,我们不能得出这样的结论<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是合成的。所以我们需要做出选择<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>让测试通过,标记<年代p一个nclass="katex"> n年代p一个n>年代p一个n>复合。
gydF4y2Ba但我们如何选择<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>?解决办法很简单:让它具有概率性;也就是说,我们选择<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>随机。例如,为了提高可信度,我们将测试重复几次<年代p一个nclass="katex"> k年代p一个n>年代p一个n>次了。
1 2 3 4 5 6 7 8 |
|
如果<年代p一个nclass="katex">
一个年代p一个n><年代p一个nclass="msupsub">n年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>但<年代p一个nclass="katex">
n年代p一个n>年代p一个n>是复合,那么<年代p一个nclass="katex">
一个年代p一个n>年代p一个n>被称为
gydF4y2Ba更糟糕的是,有些数字是费马伪质数
gydF4y2Ba好的一面是,卡迈克尔数字非常罕见。糟糕的是它们的数量是无限的。这使得这个测试很少使用,因为简单地存储所有的Carmichael数是不可行的(因为它们有无限多)。另一件好事是<年代p一个nclass="katex"> n年代p一个n>年代p一个n>不是卡迈克尔数,那么范围内至少有一半的整数<年代p一个nclass="katex"> [年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mclose">]年代p一个n>年代p一个n>都是费马证人,所以我们能说出来吗<年代p一个nclass="katex"> n年代p一个n>年代p一个n>不是卡迈克尔数,每次迭代通过测试的概率是一半<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是合成的。合数的概率被错误地称为质数<年代p一个nclass="katex"> k年代p一个n>年代p一个n>迭代<年代p一个nclass="katex"> 2年代p一个n><年代p一个nclass="msupsub">−年代p一个n><年代p一个nclass="mord mathdefault mtight" style="margin-right:0.03148em;">k年代p一个n>年代p一个n>.
gydF4y2Ba上述算法的运行时间为<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03148em;">k年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>为<年代p一个nclass="katex"> k年代p一个n>年代p一个n>测试,乘以<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>对于模指数,乘上一段时间进行乘法运算(课本乘法使用)<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>2年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>时间)。尽管这个测试有缺陷(概率性和Carmichael数),但它运行在多对数时间内,这是很快的。
Miller-Rabin素性测试
Miller-Rabin质数检验在某种意义上是费马质数检验的一种高级形式。首先是算法,然后是解释。
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
为了理解这个算法,我们需要几个概念。
gydF4y2Ba首先,假设<年代p一个nclass="katex"> p年代p一个n>年代p一个n>是质数,考虑模方程<年代p一个nclass="katex"> x年代p一个n><年代p一个nclass="msupsub">2年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.这个方程的解是什么?我们知道<年代p一个nclass="katex"> x年代p一个n><年代p一个nclass="msupsub">2年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">0年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,或<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord mathdefault">x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mord mathdefault">x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">+年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">0年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.自<年代p一个nclass="katex"> p年代p一个n>年代p一个n>是'<年代p一个nclass="katex"> p年代p一个n>年代p一个n>两者都要除以<年代p一个nclass="katex"> x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>或<年代p一个nclass="katex"> x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">+年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>;这将导致<年代p一个nclass="katex"> x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">−年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.
gydF4y2Ba现在,假设<年代p一个nclass="katex"> p年代p一个n>年代p一个n>是奇素数吗<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>一个整数相对于质数是多少<年代p一个nclass="katex"> p年代p一个n>年代p一个n>.通过费马小定理,我们知道<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="msupsub">p年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.它的思想是,我们重复地将指数除以2只要指数是偶数,<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="msupsub">2年代p一个n><年代p一个nclass="mord mathdefault mtight">e年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>对于一些<年代p一个nclass="katex"> e年代p一个n>年代p一个n>,我们可以调用上面的结果,给予<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="msupsub">e年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">−年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>或<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="msupsub">e年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>p年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.在后一种情况下,我们可以再次调用结果,直到我们得到第一种情况或指数为奇数。
gydF4y2Ba换句话说,我们有以下定理
让<年代p一个nclass="katex"> p年代p一个n>年代p一个n>是奇数的质数<年代p一个nclass="katex"> p年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="msupsub">年代年代p一个n>年代p一个n>⋅年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">d年代p一个n><年代p一个nclass="mpunct">,年代p一个n>年代p一个n>在哪里<年代p一个nclass="katex"> d年代p一个n>年代p一个n>是奇数吗<年代p一个nclass="katex"> 年代年代p一个n>年代p一个n>为正整数。也让<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>是一个正整数的质数<年代p一个nclass="katex"> p年代p一个n>年代p一个n>.那么以下至少有一项必须成立:
米勒-拉宾质数检验利用了这个定理的逆命题。如果对某些人来说是这样的话<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>那么,上述两种说法都不成立<年代p一个nclass="katex"> p年代p一个n>年代p一个n>显然不是质数。这解释了算法的大部分内容:
1 2 3 4 5 6 7 |
|
在这里,我们计算<年代p一个nclass="katex">
x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">一个年代p一个n><年代p一个nclass="msupsub">d年代p一个n>年代p一个n>米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n>年代p一个n>.(在算法中,我们将这个整数命名为<年代p一个nclass="katex">
n年代p一个n>年代p一个n>而不是<年代p一个nclass="katex">
p年代p一个n>年代p一个n>因为我们还不知道它是不是质数。)如果<年代p一个nclass="katex">
x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,那么定理的第二点是正确的。否则,测试if<年代p一个nclass="katex">
x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">−年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,这意味着第一个点是正确的,否则我们平方<年代p一个nclass="katex">
x年代p一个n>年代p一个n>,给<年代p一个nclass="katex">
一个年代p一个n><年代p一个nclass="msupsub">2年代p一个n><年代p一个nclass="msupsub">1年代p一个n>年代p一个n>⋅年代p一个n><年代p一个nclass="mord mathdefault mtight">d年代p一个n>年代p一个n>.我们再重复一遍,检查它是否和<年代p一个nclass="katex">
−年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>;如果没有,我们把它平方成<年代p一个nclass="katex">
一个年代p一个n><年代p一个nclass="msupsub">2年代p一个n><年代p一个nclass="msupsub">2年代p一个n>年代p一个n>⋅年代p一个n><年代p一个nclass="mord mathdefault mtight">d年代p一个n>年代p一个n>,以此类推,直到<年代p一个nclass="katex">
一个年代p一个n><年代p一个nclass="msupsub">2年代p一个n><年代p一个nclass="msupsub">年代年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>⋅年代p一个n><年代p一个nclass="mord mathdefault mtight">d年代p一个n>年代p一个n>.因为我们知道<年代p一个nclass="katex">
一个年代p一个n><年代p一个nclass="msupsub">2年代p一个n><年代p一个nclass="msupsub">年代年代p一个n>年代p一个n>⋅年代p一个n><年代p一个nclass="mord mathdefault mtight">d年代p一个n>年代p一个n>=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">一个年代p一个n><年代p一个nclass="msupsub">n年代p一个n><年代p一个nclass="mbin mtight">−年代p一个n><年代p一个nclass="mord mtight">1年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">1年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>如果<年代p一个nclass="katex">
n年代p一个n>年代p一个n>是质数,不需要再检查一次。如果我们曾经遇到
gydF4y2Ba现在的问题是找出<年代p一个nclass="katex">
一个年代p一个n>年代p一个n>.我们如何选择它?没有一种好的方法可以确定地做到这一点,这意味着我们只是简单地选择<年代p一个nclass="katex">
一个年代p一个n>年代p一个n>随机地重复几次,<年代p一个nclass="katex">
k年代p一个n>年代p一个n>,乘以,就像费马的质数检验。就像费马的质数检验一样,对于合数有几个条件<年代p一个nclass="katex">
n年代p一个n>年代p一个n>,<年代p一个nclass="katex">
一个年代p一个n>年代p一个n>的组合检测失败<年代p一个nclass="katex">
n年代p一个n>年代p一个n>,然后<年代p一个nclass="katex">
一个年代p一个n>年代p一个n>被称为
gydF4y2Ba对于任何组合<年代p一个nclass="katex"> n年代p一个n>年代p一个n>,至少<年代p一个nclass="katex"> 3.年代p一个n><年代p一个nclass="mord">/年代p一个n><年代p一个nclass="mord">4年代p一个n>年代p一个n>在这个范围内的整数<年代p一个nclass="katex"> [年代p一个n><年代p一个nclass="mord">2年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">2年代p一个n><年代p一个nclass="mclose">]年代p一个n>年代p一个n>有目击者<年代p一个nclass="katex"> n年代p一个n>年代p一个n>,这比费马质数判别法要好:它有卡迈克尔数,其中没有整数是目击者,即使<年代p一个nclass="katex"> n年代p一个n>年代p一个n>不是卡迈克尔,只能保证有一半证人。对于Miller-Rabin质数检验,一个组合被错误地作为质数通过的概率<年代p一个nclass="katex"> k年代p一个n>年代p一个n>迭代<年代p一个nclass="katex"> 4年代p一个n><年代p一个nclass="msupsub">−年代p一个n><年代p一个nclass="mord mathdefault mtight" style="margin-right:0.03148em;">k年代p一个n>年代p一个n>.
gydF4y2Ba然而,不能保证质数仍然是一个缺陷。如果我们有一个上界<年代p一个nclass="katex"> n年代p一个n>年代p一个n>,解决方法就是简单地固定的值<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>.例如,通过简单的测试<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">3.年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">5年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">7年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">1年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">1年代p一个n><年代p一个nclass="mord">3.年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">1年代p一个n><年代p一个nclass="mord">7年代p一个n>年代p一个n>,保证测试正确,只要<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;"><年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">3.年代p一个n><年代p一个nclass="mord">4年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mord">5年代p一个n><年代p一个nclass="mord">5年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="mord">7年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mord">7年代p一个n><年代p一个nclass="mord">2年代p一个n><年代p一个nclass="mord">8年代p一个n><年代p一个nclass="mord">3.年代p一个n><年代p一个nclass="mord">2年代p一个n><年代p一个nclass="mord">1年代p一个n>年代p一个n>,所以如果我们能保证<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是否小于这个,检查这七个值<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>就足够了。有<一个target="_blank" rel="nofollow" href="http://primes.utm.edu/prove/prove2_3.html">许多这样的确定性变体一个>.
gydF4y2Ba该算法的运行时间由两部分组成:准备时间和计算时间<年代p一个nclass="katex"> n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">2年代p一个n><年代p一个nclass="msupsub">年代年代p一个n>年代p一个n>⋅年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">d年代p一个n>年代p一个n>和测试,当我们随机选择<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>.准备工作很简单<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>.测试是<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03148em;">k年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>为<年代p一个nclass="katex"> k年代p一个n>年代p一个n>试验,乘以<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>对于模幂,乘以时间进行乘法;这和费马质数检验的运行时间是一样的。
部素性测试
这一节需要更全面的解释,以及算法的代码。
<!--end-米eta -->
到目前为止,所讨论的质数检验要么非常慢(多项式)<年代p一个nclass="katex"> n年代p一个n>年代p一个n>而不是<年代p一个nclass="katex"> lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n>年代p一个n>的位数<年代p一个nclass="katex"> n年代p一个n>年代p一个n>),或者只是概率性的(不保证是正确的)。这使得人们在那时徘徊,这个问题是否质数,决定一个测试的质数,实际上是可“快速”解决的(在多项式时间内,在数字数量上);也就是说,它是否属于复杂类<年代p一个nclass="katex"> P年代p一个n>年代p一个n>与否。
1gydF4y2Ba976年,盖瑞·米勒(上面提到的米勒-拉宾质数检验的发明人,和迈克尔·罗宾)也写了“米勒检验”,米勒-拉宾质数检验的一个确定性变体(实际上是最初的版本)。这个检验在多项式时间内运行,但它的正确性取决于广义黎曼假设到目前为止尚未解决的问题,因此这个检验是不令人满意的。
gydF4y2Ba然而,在2002年,印度理工学院的Manindra Agrawal, Neeraj Kayal和Nitin Saxena通过构建这种不依赖于这些未经证实的假设的多项式时间运行的确定性测试,肯定地解决了这个问题。他们的测试被称为AKS测试,题目很简单<一个target="_blank" rel="nofollow" href="http://www.cse.iitk.ac.in/users/manindra/algebra/primality_v6.pdf">质数在P中一个>.
gydF4y2Ba算法的思想依赖于一个简单的事实<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord mathdefault">x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">一个年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">x年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">一个年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>对所有<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>coprime来<年代p一个nclass="katex"> n年代p一个n>年代p一个n>,当且仅当<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是质数。注意,两边是多项式;也就是说,每个系数都必须进行比较。证明只需用费马的小定理和费马的质数检验<年代p一个nclass="katex"> (年代p一个n>年代p一个n>k年代p一个n>年代p一个n>n年代p一个n>年代p一个n>)年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">0年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>对所有<年代p一个nclass="katex"> 1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≤年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">k年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">≤年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n>年代p一个n>当且仅当<年代p一个nclass="katex"> n年代p一个n>年代p一个n>是质数。
gydF4y2Ba上面的方法本身就是一个质数检验,但它在位数上花费的时间是指数级的,所以本文使用了一个类似的事实:<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord mathdefault">x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">一个年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>≡年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">x年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">一个年代p一个n><年代p一个nclass="mspace allowbreak">(年代p一个n><年代p一个nclass="mord">米年代p一个n><年代p一个nclass="mord mathrm">o年代p一个n><年代p一个nclass="mord mathrm">d年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mord mathdefault">n年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">x年代p一个n><年代p一个nclass="msupsub">r年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,这意味着<年代p一个nclass="katex"> (年代p一个n><年代p一个nclass="mord mathdefault">x年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">一个年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">(年代p一个n><年代p一个nclass="mord">x年代p一个n><年代p一个nclass="msupsub">n年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">一个年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">n年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.10764em;">f年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">+年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">(年代p一个n><年代p一个nclass="mord">x年代p一个n><年代p一个nclass="msupsub">r年代p一个n>年代p一个n>−年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mclose">)年代p一个n><年代p一个nclass="mord mathdefault" style="margin-right:0.03588em;">g年代p一个n>年代p一个n>对于某些多项式<年代p一个nclass="katex"> f年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">g年代p一个n>年代p一个n>.如果<年代p一个nclass="katex"> r年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">=年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>,这个事实可以用多项式时间来检验。所有质数都满足这个事实,但对于不同的值,一些合数也可以通过<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="mpunct">,年代p一个n><年代p一个nclass="mspace" style="margin-right:0.16666666666666666em;">r年代p一个n>年代p一个n>.证明了存在足够小的<年代p一个nclass="katex"> r年代p一个n>年代p一个n>足够小的集合<年代p一个nclass="katex"> 一个年代p一个n>年代p一个n>,这样,如果为所有<年代p一个nclass="katex"> 一个年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">∈年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2777777777777778em;">一个年代p一个n>年代p一个n>那么,这种关系是满足的<年代p一个nclass="katex"> n年代p一个n>年代p一个n>不能是合数,证明它是素数。
gydF4y2Ba目前,该算法的运行时间为<年代p一个nclass="katex"> O年代p一个n>年代p一个n>~年代p一个n>年代p一个n>(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>6年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>(即,<年代p一个nclass="katex"> O年代p一个n><年代p一个nclass="mopen">(年代p一个n><年代p一个nclass="mop">lgydF4y2Bag年代p一个n>年代p一个n>6年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">⋅年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">lgydF4y2Bag年代p一个n>年代p一个n>k年代p一个n>年代p一个n>lgydF4y2Bag年代p一个n>年代p一个n>n年代p一个n><年代p一个nclass="mclose">)年代p一个n>年代p一个n>对于一些<年代p一个nclass="katex"> k年代p一个n>年代p一个n>).这份报纸最初有<年代p一个nclass="katex"> 1年代p一个n><年代p一个nclass="mord">2年代p一个n>年代p一个n>在指数上,但这很快被不同作者的作品降低。这仍然比Miller-Rabin质数检验更慢,也更复杂,这就是为什么Miller-Rabin检验目前被更广泛地用于实际数字(比如,在那)<年代p一个nclass="katex"> 3.年代p一个n><年代p一个nclass="mord">4年代p一个n><年代p一个nclass="mord">1年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">⋅年代p一个n><年代p一个nclass="mspace" style="margin-right:0.2222222222222222em;">1年代p一个n><年代p一个nclass="mord">0年代p一个n><年代p一个nclass="msupsub">1年代p一个n><年代p一个nclass="mord mtight">2年代p一个n>年代p一个n>范围),但从理论上讲,这个算法是非常有趣的,因为它是第一个证明质数不是一个困难问题的算法。