私はSchemeが初めてです。PLTスキームを使用して、ラビンミラーアルゴリズムの確率的バリアントを試して実装しました。私はそれが確率的であることを知っていますが、ほとんどの場合、間違った結果を得ています。私は C を使用して同じことを実装しましたが、うまくいきました (試行に失敗したことはありません)。デバッグ中に期待どおりの出力が得られますが、実行すると、ほとんどの場合、間違った結果が返されます。Wikipediaのアルゴリズムを使用しました。
(define expmod( lambda(b e m)
;(define result 1)
(define r 1)
(let loop()
(if (bitwise-and e 1)
(set! r (remainder (* r b) m)))
(set! e (arithmetic-shift e -1))
(set! b (remainder (* b b) m))
(if (> e 0)
(loop)))r))
(define rab_mil( lambda(n k)
(call/cc (lambda(breakout)
(define s 0)
(define d 0)
(define a 0)
(define n1 (- n 1))
(define x 0)
(let loop((count 0))
(if (=(remainder n1 2) 0)
(begin
(set! count (+ count 1))
(set! s count)
(set! n1 (/ n1 2))
(loop count))
(set! d n1)))
(let loop((count k))
(set! a (random (- n 3)))
(set! a (+ a 2))
(set! x (expmod a d n))
(set! count (- count 1))
(if (or (= x 1) (= x (- n 1)))
(begin
(if (> count 0)(loop count))))
(let innerloop((r 0))
(set! r (+ r 1))
(if (< r (- s 1)) (innerloop r))
(set! x (expmod x 2 n))
(if (= x 1)
(begin
(breakout #f)))
(if (= x (- n 1))
(if (> count 0)(loop count)))
)
(if (= x (- s 1))
(breakout #f))(if (> count 0) (loop count)))#t))))
また、Scheme で正しい方法でプログラミングしていますか? (私が使用するループ部分の抜け出しについてはよくわかりませんcall/cc
。あるサイトで見つけて以来、それを使用しています。)
前もって感謝します。