sequence_succesive_differences.sf 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/ruby
  2. # Compute the successive differences of a given sequence.
  3. # An Introduction to "sequences" and discrete calculus:
  4. # https://www.youtube.com/watch?v=J-Gow6SfG2c
  5. func differences(seq) {
  6. var deltas = [seq]
  7. seq.end.times {
  8. seq = seq.map_cons(2, {|a,b| b - a })
  9. deltas << seq
  10. }
  11. return deltas
  12. }
  13. say "=> Difference of powers:"
  14. for n in (0 .. 5) {
  15. say differences(n+1 -> of {|k| k**n })
  16. }
  17. say "\n=> First 10 factorials:"
  18. # This is equivalent with the following formula:
  19. # n! = Sum_{k=0..n} binomial(n, k) * (n-k)^n * (-1)^k
  20. for n in (^10) {
  21. say ("#{n}! = ", differences(n+1 -> of {|k| k**n })[-1][0])
  22. }
  23. __END__
  24. => Difference of powers:
  25. [[1]]
  26. [[0, 1], [1]]
  27. [[0, 1, 4], [1, 3], [2]]
  28. [[0, 1, 8, 27], [1, 7, 19], [6, 12], [6]]
  29. [[0, 1, 16, 81, 256], [1, 15, 65, 175], [14, 50, 110], [36, 60], [24]]
  30. [[0, 1, 32, 243, 1024, 3125], [1, 31, 211, 781, 2101], [30, 180, 570, 1320], [150, 390, 750], [240, 360], [120]]
  31. => First 10 factorials:
  32. 0! = 1
  33. 1! = 1
  34. 2! = 2
  35. 3! = 6
  36. 4! = 24
  37. 5! = 120
  38. 6! = 720
  39. 7! = 5040
  40. 8! = 40320
  41. 9! = 362880