fork(20) download
  1. ; baby steps, giant steps
  2.  
  3. (define (expm b e m)
  4. (define (m* x y) (modulo (* x y) m))
  5. (cond ((zero? e) 1)
  6. ((even? e) (expm (m* b b) (/ e 2) m))
  7. (else (m* b (expm (m* b b) (/ (- e 1) 2) m)))))
  8.  
  9. (define (inverse x p) ; inverse of x mod prime p
  10. (expm x (- p 2) p)) ; by fermat's little theorem
  11.  
  12. (define (baby-step-giant-step x n m)
  13. (let* ((b (inexact->exact (ceiling (sqrt m))))
  14. (h (expm (inverse x m) b m))
  15. (a (make-hash-table)))
  16. (do ((i 0 (+ i 1)) ; giant steps
  17. (xi 1 (modulo (* xi x) m)))
  18. ((= i b))
  19. (hash-set! a xi i))
  20. (do ((j 0 (+ j 1)) ; baby steps
  21. (nhj n (modulo (* nhj h) m)))
  22. ((hash-ref a nhj #f)
  23. (+ (hash-ref a nhj #f) (* j b))))))
  24.  
  25. (display (baby-step-giant-step 3 13 17)) (newline)
  26. (display (expm 3 4 17)) (newline)
Success #stdin #stdout 0.04s 8616KB
stdin
Standard input is empty
stdout
4
13