質數的費馬檢查

2021-10-02 09:47:47 字數 2430 閱讀 9790

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...