881 Divisor Graph Width.sf 803 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/ruby
  2. # Divisor Graph Width
  3. # https://projecteuler.net/problem=881
  4. # Too slow...
  5. func g(n) {
  6. var D = [n]
  7. var max = 0
  8. loop {
  9. D = D.map {|n| n.prime_divisors.map{idiv(n,_)}... }.uniq
  10. if (D.len > max) {
  11. max = D.len
  12. }
  13. elsif (D.len < max) {
  14. break
  15. }
  16. D || break
  17. }
  18. return max
  19. }
  20. assert_eq(g(45), 2)
  21. assert_eq(g(5040), 12)
  22. var max = 0
  23. for n in (1..1e9) {
  24. var t = g(n)
  25. if (t > max) {
  26. max = t
  27. say "g(#{n}) = #{t}"
  28. break if (max >= 1e4)
  29. }
  30. }
  31. __END__
  32. g(4) = 1
  33. g(12) = 2
  34. g(30) = 3
  35. g(60) = 4
  36. g(180) = 5
  37. g(210) = 6
  38. g(420) = 7
  39. g(840) = 8
  40. g(1260) = 10
  41. g(2520) = 11
  42. g(4620) = 14
  43. g(9240) = 15
  44. g(12600) = 16
  45. g(13860) = 18
  46. g(27720) = 22
  47. g(55440) = 23
  48. g(60060) = 25
  49. g(69300) = 26