760 Sum over Bitwise Operators.sf 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/usr/bin/ruby
  2. # Sum over Bitwise Operators
  3. # https://projecteuler.net/problem=760
  4. func f_xor(a,b) {
  5. a ^ b
  6. }
  7. func f_or(a,b) {
  8. a | b
  9. }
  10. func f_and(a,b) {
  11. a & b
  12. }
  13. func f2_xor(n) {
  14. n + 3*sum(1..n.ilog2, {|j|
  15. 4**(j - 1) * (n >> j)
  16. })
  17. }
  18. func G_xor(N) {
  19. sum(0..N,{|n|
  20. sum(0..n, { |k|
  21. f_xor(k, n - k)
  22. })
  23. })
  24. }
  25. func G2_xor(N) {
  26. sum(1..N, {|k|
  27. f2_xor(k)
  28. })
  29. }
  30. func G_or(N) {
  31. sum(0..N,{|n|
  32. sum(0..n, { |k|
  33. f_or(k, n - k)
  34. })
  35. })
  36. }
  37. func G_and(N) {
  38. sum(0..N,{|n|
  39. sum(0..n, { |k|
  40. f_and(k, n - k)
  41. })
  42. })
  43. }
  44. func G(N) {
  45. sum(0..N, {|n|
  46. sum(0..n, { |k|
  47. f_xor(k, n-k) + f_and(k, n-k) + f_or(k, n-k)
  48. })
  49. })
  50. }
  51. say 15.of(G)
  52. say 15.of { _+1 }.map_reduce {|a,b| f_or(a,b) + f_and(a,b) + f_xor(a,b) }
  53. say 15.of { _+1 }.map_reduce {|a,b| f_xor(a,b) }
  54. say G(10)
  55. say G(100)
  56. say ''
  57. var n = 100
  58. say G_and(n)
  59. say ((n+1)*sum(0..n, {|k| f_and(k, n-k)}) - sum(0..n, {|k| k * f_and(k, n-k) }))
  60. #say sum(0..n, {|k| f_and(k, n-k) * (n - k + 1) })
  61. # XOR for 2^n - 1 = 4^(n-1)*(2^n-1)
  62. #
  63. #var n = 100
  64. #say G(n)
  65. #say (G_xor(n) + G_and(n) + G_or(n))
  66. #say 10.of(G_xor)
  67. #say 10.of(G_and)
  68. #say 10.of(G_or)
  69. #100.of(G_xor).diffs.each{.say}
  70. #100.of(G_or).diffs.each{.say}
  71. #100.of(G_and).diffs.each{.say}
  72. #for n in (1..100) {
  73. # say G_xor(n)
  74. #}
  75. __END__
  76. for k in (1..10) {
  77. say [G_xor(2**k - 1), G_or(2**k - 1), G_and(2**k - 1)]
  78. }
  79. __END__
  80. say 20.of(G_xor)
  81. say 20.of(G2_xor)
  82. say ''
  83. say 20.of(G_or)
  84. #say 20.of(G2_or)
  85. say ''
  86. say 20.of(G_and)
  87. #say 20.of(G2_or)