271 Modular Cubes part 1.sf 737 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #!/usr/bin/ruby
  2. # Author: Trizen
  3. # Date: 13 October 2017
  4. # Translated: 16 November 2023
  5. # https://github.com/trizen
  6. # https://projecteuler.net/problem=271
  7. # Runtime: 0.347s
  8. func modular_cubes(n) {
  9. var table = Hash()
  10. for pp in (n.prime_power_divisors) {
  11. table{pp} = [[1, pp]]
  12. for x in (2 ..^ pp) {
  13. if (powmod(x, 3, pp) == 1) {
  14. table{pp} << [x, pp]
  15. }
  16. }
  17. }
  18. var sum = 0
  19. table.values.cartesian {|*a|
  20. var x = Math.chinese(a...)
  21. if ((x > 1) && (powmod(x, 3, n) == 1)) {
  22. sum += x
  23. }
  24. }
  25. return sum
  26. }
  27. assert_eq(modular_cubes(91), 363)
  28. assert_eq(modular_cubes(5040), 21608)
  29. say modular_cubes(13082761331670030)