modular_multiplicative_inverse.sf 523 B

123456789101112131415161718192021222324252627282930
  1. #!/usr/bin/ruby
  2. # Algorithm for computing the modular multiplicative inverse: 1/a mod n, with gcd(a, n) = 1.
  3. # Algorithm presented in the book:
  4. #
  5. # Modern Computer Arithmetic
  6. # - by Richard P. Brent and Paul Zimmermann
  7. #
  8. func modular_inverse (a, n) {
  9. var (u, w) = (1, 0)
  10. var (q, r) = (0, 0)
  11. var c = n
  12. while (c != 0) {
  13. (q, r) = divmod(a, c)
  14. (a, c) = (c, r)
  15. (u, w) = (w, u - q*w)
  16. }
  17. u += n if (u < 0)
  18. return u
  19. }
  20. say modular_inverse(42, 2017) #=> 1969