792 Too Many Twos.sf 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/ruby
  2. # Too Many Twos
  3. # https://projecteuler.net/problem=792
  4. # See also:
  5. # https://oeis.org/A059304
  6. func g(n) {
  7. return 0 if (n < 0)
  8. return 1 if (n == 0)
  9. __FUNC__(n-1)*(8 - 4/n)
  10. }
  11. func Sg(n) {
  12. return 1 if (n == 0)
  13. return g(n)+g(0) if (n == 1)
  14. return g(n)+g(1)+g(0) if (n == 2)
  15. return g(n)+g(2)+g(1)+g(0) if (n == 3)
  16. #__FUNC__(n-1) + g(n)
  17. #assert_eq((8 - 4/n), g(n)/g(n-1))
  18. #assert_eq((8 - 4/(n-1)), g(n-1)/g(n-2))
  19. (g(n)/g(n-1) * __FUNC__(n-1)) - ((n-2) * __FUNC__(n-2))
  20. }
  21. #~ say 10.of(g).acc
  22. #~ say 10.of(Sg)
  23. #say 10.of {|n| g(n) / g(n-1) }
  24. #say 10.of {|n| g(n+1) / g(n) }
  25. func S2(n) {
  26. sum(1..n, {|k|
  27. 3 * (-2)**k * binomial(2*k, k)
  28. })
  29. }
  30. func f(n) {
  31. return 4/3 if (n == 0)
  32. (-1)**n * (2**n * (2*n)!) / ((n!)**2)
  33. }
  34. func S(N) {
  35. sum(1..N, {|n|
  36. #(-1)**n * (2**n * (2*n)!) / ((n!)**2)
  37. f(n)
  38. })
  39. }
  40. func f2(n) {
  41. return 1 if (n == 0)
  42. __FUNC__(n-1) * (8 - 4/n)
  43. }
  44. func S4(n) {
  45. return 4 if (n == 0)
  46. #return f(1) if (n == 1)
  47. #return f(1) if (n == 2)
  48. #n*__FUNC__(n-1) - (n - 1)*__FUNC__(n-2)
  49. __FUNC__(n-1) + 3*f(n)
  50. }
  51. func u5(n) {
  52. return 2 if (n == 0)
  53. __FUNC__(n-1).valuation(2) - ((-1)**n + (n + valuation((2*n)!, 2)) - valuation(((n!)**2), 2))
  54. }
  55. #~ func S(n) {
  56. #~ 2**n * n * binomial(2*n, n)
  57. #~ }
  58. func u2(n) {
  59. 3*S(n) + 4 -> valuation(2)
  60. }
  61. func u(n) {
  62. S4(n) -> valuation(2)
  63. }
  64. func U(N) {
  65. sum(1..N, {|n|
  66. u(n**3)
  67. })
  68. }
  69. say S(4)
  70. say u(4)
  71. say u(20)
  72. say U(5)
  73. #say U(1e4)
  74. assert_eq(u(4), 7)
  75. assert_eq(u(20), 24)
  76. assert_eq(U(5), 241)