費馬小定理:如果n是一個素數,a是一個小于n的正整數,那么a的n次方與a模n同余
這是一個充分條件,但是反之是一個很強的理由,也就是說對于任意的數n,在1到n之間隨機的選擇一個數,若(a^n) mod n == a mod n,那么就可以有很強的理由相信n是一個素數,在100 000 000之內僅有255個素數,不滿足費馬定理的逆命題。相比于時間復雜度為O(sqrt(n))樸素檢測素數法,在有限次的測試中能極大概率的判斷一個素數是極其有吸引力的。
( define (expmod base exp m )
( cond ( ( = exp 0 ) 1 )
( ( even? exp )
( remainder (square ( expmod base ( / exp 2 ) m ) )
m ) )
( else
(remainder ( * base (expmod base ( - exp 1 ) m ) ) m ) ) ) )
( define ( fermat-test n )
( define ( try-it a )
( = ( expmod a n n ) a ) )
( try-it ( + 1 ( random ( - n 1 ) ) ) ) )
( define ( fast-prime? n times )
( cond ( ( = times 0 ) true )
( ( fermat-test n )
( fast-prime? n ( - times 1 ) ) )
( else false ) ) )
圖片發自簡書App