complex_modular_multiplicative_inverse_2.sf 826 B

12345678910111213141516171819202122232425262728293031
  1. #!/usr/bin/ruby
  2. # Daniel "Trizen" Șuteu
  3. # Date: 23 June 2020
  4. # https://github.com/trizen
  5. # Formula for computing the modular multiplicative inverse of complex numbers:
  6. # 1/a mod n, with |gcd(a, n)| = 1.
  7. func complex_modular_inverse (x, y, m) {
  8. var r = (x*x + y*y)
  9. # gcd(r, m) must equal 1
  10. var i = invmod(r, m) || return Gauss(NaN, NaN)
  11. var a = ((i*x)%m)
  12. var b = (-i*y)%m
  13. Gauss(a, b)
  14. }
  15. say complex_modular_inverse(42, 0, 2017) #=> (1969, 0)
  16. say complex_modular_inverse( 3, 4, 2017) #=> (1291, 968)
  17. say complex_modular_inverse(91, 23, 2017) #=> (590, 405)
  18. say complex_modular_inverse(43, 99, 2017) #=> (1709, 1272)
  19. say complex_modular_inverse(43, 99, 1234567) #=> (1019551, 667302)
  20. # Non-existent inverses
  21. say complex_modular_inverse(43, 99, 1234) #=> (NaN, NaN)