Je suis nouveau à Scheme. J'ai essayé et mis en œuvre la variante probabiliste de l'algorithme de Rabin-Miller en utilisant PLT Scheme. Je sais que c'est probabiliste et tout, mais je reçois les mauvais résultats la plupart du temps. J'ai mis en œuvre la même chose en utilisant C, et cela a bien fonctionné (jamais échoué un essai). Je reçois la sortie attendue pendant le débogage, mais quand je cours, il revient presque toujours avec un résultat incorrect. J'ai utilisé l'algorithme de Wikipedia.Implémentation du schéma de Miller-Rabin sortie imprévisible
(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))))
De même, est-ce que je programme la bonne façon dans Scheme? (Je ne suis pas sûr de la rupture de la partie boucle où j'utilise call/cc
. Je l'ai trouvé sur un site et l'utilise depuis.)
Merci d'avance.
Vous n'avez pas besoin d'appel/cc pour sortir d'une boucle! Reviens juste. Je réécrirais rab avec moins de mutation, en passant la variable comme arguments à boucler plutôt que de les muter. –
Merci Charles. Mais comment puis-je sortir d'une boucle? Je ne pouvais pas un mot-clé "retour" ou un équivalent dans le schéma plt. – user270207
Cet extrait de code n'est pas Scheme. C'est C avec une syntaxe semblable à Scheme. – Svante