我的SICP習(xí)題答案(1.24~1.28)
1.24
對于Fermat檢查,因為具有l(wèi)og n 的增長階,所以對于 n^2 和 n 的檢查的時間比 理論上應(yīng)該是 2:1, 實際上,經(jīng)過測試也比較接近,當(dāng)n比較大時。
若與預(yù)計不符,可能因為 n 比較小,或者字長發(fā)生變化,比如 n > 2^32 (參見下題)
1.25
僅從理論分析,Alyssa 的改動不會引起增長階的變化,但實際上當(dāng) Fermat 檢查的 n 稍微大一點,速度就會很慢。主要原因 就是 base^exp 是一個非常大的數(shù),可能遠(yuǎn)遠(yuǎn)超過 一個32位機(jī)字的表示范圍 2^32 ,在 scheme 里可能用若干個 32-bit 靠軟件實現(xiàn)運算,這將導(dǎo)致計算急速增長。無論是傳遞、運算還是求模。
實際上 1.22、1.23、1.24 的幾個題目可能都會遇到字長變化引起的計算速度突變。
1.26
Fermat 檢查正是因為 連續(xù)求平方的求冪方法,使得的增長階變?yōu)?log n, 而這均來源于 b^(2n) = (b^n)^2,Louis 的方法讓求冪又變成了連乘,b^(2n) = b^n*b^n = (b*b*...*b)*(b*b*...*b),求冪的增長階變成了 O(n),F(xiàn)ermat 檢查的增長階自然也變成了 O(n)。
1.27
1.28
首先來看,F(xiàn)ermat 小定理的一個變形:
p 是素數(shù), 1<a<p, 有 a^p % p = a
==> a^p = kp + a ==> a^p - a = kp ==> a(a^(p-1)-1) = kp ==> a^(p-1) -1 = k'p
==> a^(p-1) % p = 1
這個變形就是題目中提到的,這個形式和費馬小定理是等價的(但是奇怪的是,我沒有發(fā)現(xiàn)已知的幾個Carmichael數(shù)能夠躲過這個變形的檢查,有待研究①)
再來看,miller-rabin 素性測試的原理:
p 是素數(shù), 1<a<p, 且 a^2 % p = 1
==> (a^2-1) % p = 0 ==> (a+1)(a-1) % p =0
那么 a+1 % p = 0 或者 a-1 % p =0,
又 a<p 且 p 是素數(shù),所以
a = 1 或者 a = p-1 (這兩個叫做 1模n的平凡平方根)
代碼如下:
① 對于 Carmichael 數(shù) n ,實際上不能完全通過 a^(n-1)%n = 1 的檢查,除非 a 與 n 互素,當(dāng) a 為 n 的素因子時,不能通過,比如 Carmichael 第一個 561 = 3*11*17, 而 3^560%561 = 375 ≠ 1 。可以程序驗證這個。 所以我認(rèn)為,a^(n-1)%n = 1 的檢查比 a^n%n = a 的檢查更嚴(yán)格,是不是不存在合數(shù)通過完全的 a^(n-1)%n = 1 的檢查呢?我不敢說。但把這個結(jié)論暫時記在這里,希望能得到幫助或者反駁。2008-04-02 23:56
對于Fermat檢查,因為具有l(wèi)og n 的增長階,所以對于 n^2 和 n 的檢查的時間比 理論上應(yīng)該是 2:1, 實際上,經(jīng)過測試也比較接近,當(dāng)n比較大時。
若與預(yù)計不符,可能因為 n 比較小,或者字長發(fā)生變化,比如 n > 2^32 (參見下題)
1.25
僅從理論分析,Alyssa 的改動不會引起增長階的變化,但實際上當(dāng) Fermat 檢查的 n 稍微大一點,速度就會很慢。主要原因 就是 base^exp 是一個非常大的數(shù),可能遠(yuǎn)遠(yuǎn)超過 一個32位機(jī)字的表示范圍 2^32 ,在 scheme 里可能用若干個 32-bit 靠軟件實現(xiàn)運算,這將導(dǎo)致計算急速增長。無論是傳遞、運算還是求模。
實際上 1.22、1.23、1.24 的幾個題目可能都會遇到字長變化引起的計算速度突變。
1.26
Fermat 檢查正是因為 連續(xù)求平方的求冪方法,使得的增長階變?yōu)?log n, 而這均來源于 b^(2n) = (b^n)^2,Louis 的方法讓求冪又變成了連乘,b^(2n) = b^n*b^n = (b*b*...*b)*(b*b*...*b),求冪的增長階變成了 O(n),F(xiàn)ermat 檢查的增長階自然也變成了 O(n)。
1.27
(define (fermat-test n)
(fermat-iter (- n 1) n))
(define (fermat-iter a n)
(cond ((= a 0) #t)
((= (expmod a n n) a) (fermat-iter (- a 1) n))
(else #f)))
(fermat-iter (- n 1) n))
(define (fermat-iter a n)
(cond ((= a 0) #t)
((= (expmod a n n) a) (fermat-iter (- a 1) n))
(else #f)))
1.28
首先來看,F(xiàn)ermat 小定理的一個變形:
p 是素數(shù), 1<a<p, 有 a^p % p = a
==> a^p = kp + a ==> a^p - a = kp ==> a(a^(p-1)-1) = kp ==> a^(p-1) -1 = k'p
==> a^(p-1) % p = 1
這個變形就是題目中提到的,這個形式和費馬小定理是等價的(但是奇怪的是,我沒有發(fā)現(xiàn)已知的幾個Carmichael數(shù)能夠躲過這個變形的檢查,有待研究①)
再來看,miller-rabin 素性測試的原理:
p 是素數(shù), 1<a<p, 且 a^2 % p = 1
==> (a^2-1) % p = 0 ==> (a+1)(a-1) % p =0
那么 a+1 % p = 0 或者 a-1 % p =0,
又 a<p 且 p 是素數(shù),所以
a = 1 或者 a = p-1 (這兩個叫做 1模n的平凡平方根)
代碼如下:
(define (check-nontrivial-sqrt-of-one a n)
(define (check-1? t)
(if (and (> a 1)
(< a (- n 1))
(= t 1))
0 t))
(check-1? (remainder (square a) n)))
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
;(remainder (square (expmod base (/ exp 2) m)) m))
(check-nontrivial-sqrt-of-one (expmod base (/ exp 2) m) m))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
(define (miller-rabin-test n)
(define (iter x n)
(cond ((= x 0) #t)
((= (expmod x (- n 1) n) 1) (iter (- x 1) n))
(else #f)))
(iter (- n 1) n))
(define (check-1? t)
(if (and (> a 1)
(< a (- n 1))
(= t 1))
0 t))
(check-1? (remainder (square a) n)))
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
;(remainder (square (expmod base (/ exp 2) m)) m))
(check-nontrivial-sqrt-of-one (expmod base (/ exp 2) m) m))
(else
(remainder (* base (expmod base (- exp 1) m)) m))))
(define (miller-rabin-test n)
(define (iter x n)
(cond ((= x 0) #t)
((= (expmod x (- n 1) n) 1) (iter (- x 1) n))
(else #f)))
(iter (- n 1) n))
① 對于 Carmichael 數(shù) n ,實際上不能完全通過 a^(n-1)%n = 1 的檢查,除非 a 與 n 互素,當(dāng) a 為 n 的素因子時,不能通過,比如 Carmichael 第一個 561 = 3*11*17, 而 3^560%561 = 375 ≠ 1 。可以程序驗證這個。 所以我認(rèn)為,a^(n-1)%n = 1 的檢查比 a^n%n = a 的檢查更嚴(yán)格,是不是不存在合數(shù)通過完全的 a^(n-1)%n = 1 的檢查呢?我不敢說。但把這個結(jié)論暫時記在這里,希望能得到幫助或者反駁。2008-04-02 23:56
posted on 2008-03-31 00:21 cuigang 閱讀(1565) 評論(2) 編輯 收藏 引用 所屬分類: Lisp/Scheme 、我的SICP答案