modular_inverse.sf 317 B

12345678910111213141516171819
  1. #!/usr/bin/ruby
  2. func invmod(a, n) {
  3. var (t, nt, r, nr) = (0, 1, n, a % n)
  4. while (nr != 0) {
  5. var quot = int((r - (r % nr)) / nr);
  6. (nt, t) = (t - quot*nt, nt);
  7. (nr, r) = (r - quot*nr, nr);
  8. }
  9. r > 1 && return()
  10. t < 0 && (t += n)
  11. t
  12. }
  13. var n = invmod(42, 2017)
  14. say n
  15. assert_eq(42.invmod(2017), n)