sicp 1.2.6 介紹了一種對數複雜度的素數檢查方法。
參考資料
質數又稱素數。對於大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫質數;否則稱合數。1既不是質數也不是合數。
如何程式設計檢查乙個數是不是質數?我所知道的方法有:
其中,費馬檢查是一種概率演算法,有一定的錯誤率。
費馬小定理描述了質數的乙個性質,滿足此性質的卻不都是質數。
此定理指導我們程式設計如下,
def
fermat_test
(n):
import random
a = random.randint(
1, n -1)
return a**
(n -1)
% n ==
1
然而,carmichael數很可能騙過費馬檢查。carmichael數不是質數,但是很可能通過費馬檢查。
使用下列實驗**:
carmichaels =
561,
1105
,1729
,2465
,2821
,6601
normal_numbers =
563,
1107
,1727
,3465
,4821
,6607
ns = carmichaels
for n in ns:
t =[i**
(n -1)
% n ==
1for i in
range(1
, n)
]print
('%-5d%8.2f'
%(n,
sum(t)
/len
(t))
)
上面這段**計算carmichael數通過費馬檢查的概率,結果如下:
carmichael
通過費馬檢查的概率
5610.57
1105
0.70
1729
0.75
2465
0.73
2821
0.77
6601
0.80
通過率都高於50%!與此相對,一般合數的費馬通過率都接近於0.
只要在檢驗an−
1≡1(
modn
)a^\equiv 1(mod\ n)
an−1≡1
(mod
n),即計算an−
1mod
na^mod\ n
an−1mo
dn時,檢查中間平方步驟的得數。如果遇到「1
11取模n
nn的非平凡平方根」,即1
11與n−1
n-1n−
1之外的x
xx滿足x2≡
1(mo
dn
)x^2\equiv1(mod\ n)
x2≡1(m
odn)
,那麼n
nn就不是質數。
def
miller_rabin_test
(n):
defnon_trival_sqrt
(n, m)
:if n ==
1or n == m -1:
return
false
return n**
2% m ==
1def
expmod
(base, exp, m)
:if exp ==0:
return
1elif exp %2==
0:x = expmod(base, exp //
2, m)
if non_trival_sqrt(x, m)
:return
0else
:return x**
2% m
else
:return base * expmod(base, exp -
1, m)
% m a = random.randint(
1, n -1)
return expmod(a, n -
1, n)
==1
這就是miller-rabin檢查。經實驗,miller-rabin檢查能大大降低carmichael數的通過率。
carmichael
miller-rabin通過率
5610.02
1105
0.03
1729
0.09
2465
0.03
2821
0.10
6601
0.05
sicp
非遞迴實現
費馬素數(費馬質數)
費馬素數也叫費馬質數。其中 n 為非負整數。法國數學家費馬於1640年提出了以下猜想 可以看出,前4個是質數,因為第5個數實在太大了,費馬認為是質數。由此提出 費馬沒給出證明 形如 1732年,尤拉算出第五個費馬數 4294967297 641 6700417 不是質數,宣布了費馬的這個猜想不成立,...
費馬大定理與費馬小定理
費馬大定理,又被稱為 費馬最後的定理 由17世紀法國數學家皮耶 德 費瑪提出。他斷言當整數n 2時,關於x,y,z的方程 xn yn zn 沒有正整數解。德國佛爾夫斯克曾宣布以10萬馬克作為獎金獎給在他逝世後一百年內,第乙個證明該定理的人,吸引了不少人嘗試並遞交他們的 證明 被提出後,經歷多人猜想辯...
費馬小定理
選自 數論妙趣 數學女王的盛情款待 第六章 開門咒 數論中充斥著許多易於觀察到的事實,誘使人們用普通歸納推理的辦法去進行推廣。對此,必須慎之又慎,以免誤入陷阱。設想你偶而把 2自乘7次,再減去2,得2 7 2 126,隨後發現,126恰好能被2的冪指數7整除。接著又發現,25 2 30,30也能被2...