euler_s_totient_theorem_expmod.sf 351 B

12345678910111213141516171819
  1. #!/usr/bin/ruby
  2. # Euler's totient theorem:
  3. # a^φ(n) = 1 (mod n) with gcd(a, n) = 1
  4. # Additionally, given gcd(a, n) = 1, we have:
  5. # a^e (mod n) = a^(e mod φ(n)) (mod n)
  6. func expmod_euler (a, e, n) {
  7. if (a `is_coprime` n) {
  8. e %= n.euler_phi
  9. }
  10. powmod(a, e, n)
  11. }
  12. say expmod_euler(7, 143, 26) #=> 15 (7^11 mod 26)