inverse_of_usigma_function.sf 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #!/usr/bin/ruby
  2. # Computing the inverse of the usigma(n) function.
  3. # See also:
  4. # https://home.gwu.edu/~maxal/gpscripts/
  5. func inverse_usigma (n) {
  6. var r = Hash(
  7. 1 => [1]
  8. )
  9. n.divisors.each { |d|
  10. is_prime_power(d-1) || next
  11. var t = Hash()
  12. var v = d-1
  13. (n/d).divisors.each {|f|
  14. t{f*d} := [] << r{f}.grep { .is_coprime(v) }.map{ _ * v }... if r.has(f)
  15. }
  16. t.each { |i,v|
  17. r{i} := [] << v...
  18. }
  19. }
  20. return [] if !r.contains(n)
  21. return r{n}.sort
  22. }
  23. for n in (1..50) {
  24. var arr = inverse_usigma(n) || next
  25. say "usigma−¹(#{n}) = [#{arr.join(', ')}]";
  26. }
  27. __END__
  28. usigma−¹(1) = [1]
  29. usigma−¹(3) = [2]
  30. usigma−¹(4) = [3]
  31. usigma−¹(5) = [4]
  32. usigma−¹(6) = [5]
  33. usigma−¹(8) = [7]
  34. usigma−¹(9) = [8]
  35. usigma−¹(10) = [9]
  36. usigma−¹(12) = [6, 11]
  37. usigma−¹(14) = [13]
  38. usigma−¹(17) = [16]
  39. usigma−¹(18) = [10, 17]
  40. usigma−¹(20) = [12, 19]
  41. usigma−¹(24) = [14, 15, 23]
  42. usigma−¹(26) = [25]
  43. usigma−¹(28) = [27]
  44. usigma−¹(30) = [18, 20, 29]
  45. usigma−¹(32) = [21, 31]
  46. usigma−¹(33) = [32]
  47. usigma−¹(36) = [22, 24]
  48. usigma−¹(38) = [37]
  49. usigma−¹(40) = [28]
  50. usigma−¹(42) = [26, 41]
  51. usigma−¹(44) = [43]
  52. usigma−¹(48) = [33, 35, 47]
  53. usigma−¹(50) = [36, 49]