费马素性测试和米勒—拉宾素性测试
chapter 1
Fermat's little theorem
?費馬小定理
?
費馬小定理說的是:如果p是一個素數(shù),那么對于任意一個整數(shù)a,a?p???a?能被p整除,也可以用模運算表示如下:
(p是素數(shù),a是整數(shù))
這個定理又如下變式:如果p是一個素數(shù),且整數(shù)a與p互素,那么?a?p?1???1 可以被p整除,用模運算表示如下
?(p是素數(shù),a是整數(shù),a與p互素)、
還有一種表述是:如果p是一個素數(shù),a是一個整數(shù)且a不包含因數(shù)p,那么?a?p?1???1 可以被p整除。
?
費馬小定理是費馬素性測試的基礎(chǔ)。
費馬在給出此定理的時候未給出證明,第一個證明其的人是Gottfried Leibniz。
?
————<對于費馬小定理的證明>————
?
對于費馬小定理的證明十分多,大部分證明基于兩個簡化:
1.我們可以假設(shè)0 ≤?a?≤?p?? 1或1 ≤?a?≤?p?,這可以由以下同余定理簡單推出
若,則
且有特別的? 若,則
2.事實上我們只要證明:
???????? 在1 ≤?a?≤?p?? 1有
?
***關(guān)于費馬小定理的一個奇妙而偉大的組合證明!!!***
?
這是關(guān)于費馬小定理最淺顯易懂的,也是最奇妙的一個證明,叫做Proof by counting bracelets,創(chuàng)始人是Golomb,以下是完整的證明。
已知:p是素數(shù),a是整數(shù)且1≤?a?≤?p
求證:a?p???a 能被p整除
證明:假設(shè)又一種由p個珠子組成的項鏈,項鏈中珠子的種數(shù)為最多為a,那么所有可能的不重復(fù)的排列為a?p,其中種數(shù)為1的情況有a種,那么去除這些情況后一共就有a?p??a種。現(xiàn)在吧所有情況的項鏈首尾相接,那么就有可能出現(xiàn)重復(fù)的情況了。因為p是素數(shù),所以一個包含著p個珠子的環(huán)旋轉(zhuǎn)后會出現(xiàn)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.
??????? 以及,當(dāng)p不為素數(shù),比如當(dāng)a=2,p=12時旋轉(zhuǎn)后的一個反例
??????? ABBABBABBABB,?
??????? BBABBABBABBA,?
??????? BABBABBABBAB. ——>事實情況是3種而不是12種
~~~~~~~~~~費馬小定理的一個拓展~~~~~~~~~~
費馬小定理在歐拉定理上得到了很好的拓展,那就是:
?
其中φ(n)表示歐拉函數(shù),表示在1到n之間(包括1和n)與n互素的數(shù)的個數(shù),這是一個更普遍的情況,當(dāng)n=p時,其實就是費馬小定理的變式了,因為此時φ(p)為p-1.
chapter 2
Fermat's primality test
?費馬素性測試
費馬素性測試是判斷一個數(shù)是否為素數(shù)的一個基于概率的測試。
事實上,費馬小定理的逆否定理成立,而費馬小定理的逆定理是不成立的,
而費馬素性測試就是基于費馬小定理的“逆定理”的。
大概的算法描述是,當(dāng)p為奇數(shù)時(偶數(shù)特判一下就行啦,不就一個2嘛)讓a在1-p之間(包括1和p)選取隨機值,如果等式不成立,那么p肯定不是素數(shù),如果成立,那么p就有較大可能是素數(shù),我們稱他為偽素數(shù)。
<<<<Carmichael numbers>>>>
當(dāng)然,費馬素性測試是有極大缺陷的,因而基本上平時沒有多大用武之地。一個缺陷就是Carmichael數(shù)的存在,
Carmichael數(shù)是指如果一個數(shù)n可以通過所有‘a(chǎn)’值的費馬素性測試卻并非為素數(shù),那么就叫n為Carmichael數(shù)。
這樣的數(shù)隨著n的增大而越來越少的,這些數(shù)中,最小的一個是561.
chapter 3
Miller–Rabin primality test
米勒-拉賓素性測試
?
/***今天的重頭戲來啦!!!*/
米勒-拉賓素性測試和費馬素性測試一樣是一個基于概率的,判斷一個數(shù)是否為素數(shù)的測試。?但是作為費馬素性測試的升級產(chǎn)品,在速度上,米勒-拉賓測試有了質(zhì)的飛躍,這也就是費馬素性測試當(dāng)前毫無用武之地的原因了。
米勒-拉賓素性測試是當(dāng)前運用最廣泛的素性測試,且加上限制條件完全可以作為確定性算法。
?
######要討論米勒-拉賓素性測試,首先得證明一條引理(lamma)#######
?
若p是一個大于2的素數(shù),那么如果一個數(shù)與1或者-1模n同余,那么它就叫做1模n的一個非平凡的平方根。
而事實上,沒有1模p的非平凡的平方根存在。
證明:假設(shè)x是一個1模p的非平凡的平方根,那么就有:
因為x是非平凡的,就有(x+1)與(x-1)和x互質(zhì),就是說(x+1)和(x-1)都不能被p整除,因此(x+1)(x-1)不能被p整除,引出矛盾。
因此,沒有1模p的非平凡的平方根存在。??????????????????? 證畢
?
————————關(guān)鍵的要來啦————————————
現(xiàn)在我們讓n為一個奇質(zhì)數(shù),而(n-1)可以表示為2s·d的形式其中s與d都為正整數(shù),那么根據(jù)費馬小定理
、費馬素性測試的原理,以及上面已經(jīng)證明的引理可知,這個問題的關(guān)鍵就是,若x的平方模p為1,那么x模p得為-1或1,p才有可能為素數(shù),否則必為合數(shù)。若x的平方模p為-1,那么x模p不作要求,那么對于任何一個 ,2r·d在r不斷變化得過程中必須遵循上述的規(guī)則。這樣就得出了米勒-拉賓素性測試的算法:
?
%%%%%%%%米勒-拉賓素性測試的算法%%%%%%%%%%
判斷一個數(shù)p是否為素數(shù)(p首先得為大于等于2的正整數(shù)才有可能為素數(shù)),首先判奇偶,若為偶數(shù)只有2為素數(shù),若為奇數(shù)(這里可以考慮去掉 3甚至5的倍數(shù)),則先求出d。對于每一個底a,讓d不斷乘以2直到為(p-1)/2,在此過程中(包括原本的d與d=(p-1)/2時的情況),設(shè)t為 a的d次方模p的余數(shù),(1)當(dāng)t=-1時跳出,聲明p有可能為素數(shù)(2)當(dāng)t=1時,若d為奇數(shù),跳出聲明p有可能為素數(shù),否則跳出聲明p必為合數(shù) (3)當(dāng)d=(p-1)/2時跳出,聲明p必為合數(shù)。、
?
————————重要的要來啦————————————
?
要判斷n是否為素數(shù),對于一定范圍內(nèi)的n,只要以一定范圍內(nèi)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.
其中前三條應(yīng)該是比較用的著的,尤其是第三條,和longint是一個數(shù)量級的!非常好用!!!?
總結(jié)
以上是生活随笔為你收集整理的费马素性测试和米勒—拉宾素性测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jeewx-Boot 1.0.3 版本发
- 下一篇: hdu 1255(线段树+离散化)