inverse_of_uphi_function.sf 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/usr/bin/ruby
  2. # Computing the inverse of the uphi(n) function.
  3. # See also:
  4. # https://home.gwu.edu/~maxal/gpscripts/
  5. func inverse_uphi (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_uphi(n) || next
  25. say "uphi−¹(#{n}) = [#{arr.join(', ')}]";
  26. }
  27. __END__
  28. uphi−¹(1) = [1, 2]
  29. uphi−¹(2) = [3, 6]
  30. uphi−¹(3) = [4]
  31. uphi−¹(4) = [5, 10]
  32. uphi−¹(6) = [7, 12, 14]
  33. uphi−¹(7) = [8]
  34. uphi−¹(8) = [9, 15, 18, 30]
  35. uphi−¹(10) = [11, 22]
  36. uphi−¹(12) = [13, 20, 21, 26, 42]
  37. uphi−¹(14) = [24]
  38. uphi−¹(15) = [16]
  39. uphi−¹(16) = [17, 34]
  40. uphi−¹(18) = [19, 28, 38]
  41. uphi−¹(20) = [33, 66]
  42. uphi−¹(22) = [23, 46]
  43. uphi−¹(24) = [25, 35, 36, 39, 50, 60, 70, 78]
  44. uphi−¹(26) = [27, 54]
  45. uphi−¹(28) = [29, 40, 58]
  46. uphi−¹(30) = [31, 44, 48, 62]
  47. uphi−¹(31) = [32]
  48. uphi−¹(32) = [45, 51, 90, 102]
  49. uphi−¹(36) = [37, 52, 57, 74, 84, 114]
  50. uphi−¹(40) = [41, 55, 82, 110]
  51. uphi−¹(42) = [43, 56, 86]
  52. uphi−¹(44) = [69, 138]
  53. uphi−¹(46) = [47, 94]
  54. uphi−¹(48) = [49, 63, 65, 68, 75, 98, 105, 126, 130, 150, 210]