费马素性测试和米勒—拉宾素性测试
chapter 1
Fermat's little theorem
?費馬小定理
?
費馬小定理說的是:如果p是一個素數,那么對于任意一個整數a,a?p???a?能被p整除,也可以用模運算表示如下:
(p是素數,a是整數)
這個定理又如下變式:如果p是一個素數,且整數a與p互素,那么?a?p?1???1 可以被p整除,用模運算表示如下
?(p是素數,a是整數,a與p互素)、
還有一種表述是:如果p是一個素數,a是一個整數且a不包含因數p,那么?a?p?1???1 可以被p整除。
?
費馬小定理是費馬素性測試的基礎。
費馬在給出此定理的時候未給出證明,第一個證明其的人是Gottfried Leibniz。
?
————<對于費馬小定理的證明>————
?
對于費馬小定理的證明十分多,大部分證明基于兩個簡化:
1.我們可以假設0 ≤?a?≤?p?? 1或1 ≤?a?≤?p?,這可以由以下同余定理簡單推出
若,則
且有特別的? 若,則
2.事實上我們只要證明:
???????? 在1 ≤?a?≤?p?? 1有
?
***關于費馬小定理的一個奇妙而偉大的組合證明!!!***
?
這是關于費馬小定理最淺顯易懂的,也是最奇妙的一個證明,叫做Proof by counting bracelets,創始人是Golomb,以下是完整的證明。
已知:p是素數,a是整數且1≤?a?≤?p
求證:a?p???a 能被p整除
證明:假設又一種由p個珠子組成的項鏈,項鏈中珠子的種數為最多為a,那么所有可能的不重復的排列為a?p,其中種數為1的情況有a種,那么去除這些情況后一共就有a?p??a種。現在吧所有情況的項鏈首尾相接,那么就有可能出現重復的情況了。因為p是素數,所以一個包含著p個珠子的環旋轉后會出現p種不同的情況(這里就不證明了,即使不是像1+1=2那么顯而易見,但也是很容易證明的),亦即,這a?p??a種情況可以分為一些類,每類有p中情況,亦即,a?p???a 能被p整除。???????????? 證畢
補充:一下是a=2,p=5的情況
????????AAABB, AABBA, ABBAA, BBAAA, BAAAB,?
??????? AABAB, ABABA, BABAA, ABAAB, BAABA,?
??????? AABBB, ABBBA, BBBAA, BBAAB, BAABB,?
??????? ABABB, BABBA, ABBAB, BBABA, BABAB,?
??????? ABBBB, BBBBA, BBBAB, BBABB, BABBB,?
??????? AAAAA,?
??????? BBBBB.
??????? 以及,當p不為素數,比如當a=2,p=12時旋轉后的一個反例
??????? ABBABBABBABB,?
??????? BBABBABBABBA,?
??????? BABBABBABBAB. ——>事實情況是3種而不是12種
~~~~~~~~~~費馬小定理的一個拓展~~~~~~~~~~
費馬小定理在歐拉定理上得到了很好的拓展,那就是:
?
其中φ(n)表示歐拉函數,表示在1到n之間(包括1和n)與n互素的數的個數,這是一個更普遍的情況,當n=p時,其實就是費馬小定理的變式了,因為此時φ(p)為p-1.
chapter 2
Fermat's primality test
?費馬素性測試
費馬素性測試是判斷一個數是否為素數的一個基于概率的測試。
事實上,費馬小定理的逆否定理成立,而費馬小定理的逆定理是不成立的,
而費馬素性測試就是基于費馬小定理的“逆定理”的。
大概的算法描述是,當p為奇數時(偶數特判一下就行啦,不就一個2嘛)讓a在1-p之間(包括1和p)選取隨機值,如果等式不成立,那么p肯定不是素數,如果成立,那么p就有較大可能是素數,我們稱他為偽素數。
<<<<Carmichael numbers>>>>
當然,費馬素性測試是有極大缺陷的,因而基本上平時沒有多大用武之地。一個缺陷就是Carmichael數的存在,
Carmichael數是指如果一個數n可以通過所有‘a’值的費馬素性測試卻并非為素數,那么就叫n為Carmichael數。
這樣的數隨著n的增大而越來越少的,這些數中,最小的一個是561.
chapter 3
Miller–Rabin primality test
米勒-拉賓素性測試
?
/***今天的重頭戲來啦!!!*/
米勒-拉賓素性測試和費馬素性測試一樣是一個基于概率的,判斷一個數是否為素數的測試。?但是作為費馬素性測試的升級產品,在速度上,米勒-拉賓測試有了質的飛躍,這也就是費馬素性測試當前毫無用武之地的原因了。
米勒-拉賓素性測試是當前運用最廣泛的素性測試,且加上限制條件完全可以作為確定性算法。
?
######要討論米勒-拉賓素性測試,首先得證明一條引理(lamma)#######
?
若p是一個大于2的素數,那么如果一個數與1或者-1模n同余,那么它就叫做1模n的一個非平凡的平方根。
而事實上,沒有1模p的非平凡的平方根存在。
證明:假設x是一個1模p的非平凡的平方根,那么就有:
因為x是非平凡的,就有(x+1)與(x-1)和x互質,就是說(x+1)和(x-1)都不能被p整除,因此(x+1)(x-1)不能被p整除,引出矛盾。
因此,沒有1模p的非平凡的平方根存在。??????????????????? 證畢
?
————————關鍵的要來啦————————————
現在我們讓n為一個奇質數,而(n-1)可以表示為2s·d的形式其中s與d都為正整數,那么根據費馬小定理
、費馬素性測試的原理,以及上面已經證明的引理可知,這個問題的關鍵就是,若x的平方模p為1,那么x模p得為-1或1,p才有可能為素數,否則必為合數。若x的平方模p為-1,那么x模p不作要求,那么對于任何一個 ,2r·d在r不斷變化得過程中必須遵循上述的規則。這樣就得出了米勒-拉賓素性測試的算法:
?
%%%%%%%%米勒-拉賓素性測試的算法%%%%%%%%%%
判斷一個數p是否為素數(p首先得為大于等于2的正整數才有可能為素數),首先判奇偶,若為偶數只有2為素數,若為奇數(這里可以考慮去掉 3甚至5的倍數),則先求出d。對于每一個底a,讓d不斷乘以2直到為(p-1)/2,在此過程中(包括原本的d與d=(p-1)/2時的情況),設t為 a的d次方模p的余數,(1)當t=-1時跳出,聲明p有可能為素數(2)當t=1時,若d為奇數,跳出聲明p有可能為素數,否則跳出聲明p必為合數 (3)當d=(p-1)/2時跳出,聲明p必為合數。、
?
————————重要的要來啦————————————
?
要判斷n是否為素數,對于一定范圍內的n,只要以一定范圍內a為底就可以保證這是一個確定性算法了。下面詳細:
- if?n?< 1,373,653, it is enough to test?a?= 2 and 3.
- if?n?< 9,080,191, it is enough to test?a?= 31 and 73.
- if?n?< 4,759,123,141, it is enough to test?a?= 2, 7, and 61.
- if?n?< 2,152,302,898,747, it is enough to test?a?= 2, 3, 5, 7, and 11.
其中前三條應該是比較用的著的,尤其是第三條,和longint是一個數量級的!非常好用!!!?
總結
以上是生活随笔為你收集整理的费马素性测试和米勒—拉宾素性测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jeewx-Boot 1.0.3 版本发
- 下一篇: 微信小程序的出现会给前端开发带来什么