755 Not Zeckendorf.sf 979 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/usr/bin/ruby
  2. # Not Zeckendorf
  3. # https://projecteuler.net/problem=755
  4. # The sum hits powers of two at indices given by g(n).
  5. func f(x,y,z) is cached {
  6. if (x < y) {
  7. return 0**x
  8. }
  9. f(x-y, y+z, y) + f(x, y+z, y)
  10. }
  11. func a(n) {
  12. f(n, 1, 1)
  13. }
  14. var sum = 0
  15. func g(n) is cached {
  16. return 1 if (n == 1)
  17. return 1 if (n == 2)
  18. return 2 if (n == 3)
  19. return 3 if (n == 4)
  20. return 4 if (n == 5)
  21. return 5 if (n == 6)
  22. return 8 if (n == 7)
  23. g(n-2) + g(n-3) + g(n-4) - g(n-5) - g(n-7)
  24. }
  25. #a(1)=1, a(2)=1, a(3)=2, a(4)=3, a(5)=4, a(6)=5, a(7)=8, a(n)=a(n-2)+ a(n-3)+a(n-4)-a(n-5)-a(n-7)
  26. #say g(30)
  27. say bsearch_le(1..1e4, {|k|
  28. g(k) <=> 1e4
  29. })
  30. say bsearch_ge(1..1e4, {|k|
  31. g(k) <=> 1e4
  32. })
  33. say g(122)
  34. say g(123)
  35. #__END__
  36. for k in (0..1e4) {
  37. sum += a(k)
  38. if (sum.is_power_of(2)) {
  39. say [k, sum]
  40. }
  41. }
  42. say sum
  43. #say a(10000)
  44. #say sum(0..12, a)
  45. #say sum(0..128, a)
  46. __END__
  47. f(x, y, z)=if(x<y, 0^x, )
  48. a(n)=f(n, 1, 1)