partition_function.sf 763 B

12345678910111213141516171819202122232425262728
  1. #!/usr/bin/ruby
  2. # A recursive algorithm for computing the partition p(n) function.
  3. # See also:
  4. # https://rosettacode.org/wiki/Partition_function_P
  5. # https://en.wikipedia.org/wiki/Partition_(number_theory)#Partition_function
  6. func partitionsP(n) {
  7. func (n) is cached {
  8. n <= 1 && return n
  9. var a = sum(1..floor((sqrt(24*n + 1) + 1)/6), {|k|
  10. (-1)**(k-1) * __FUNC__(n - ((k*(3*k - 1)) >> 1))
  11. })
  12. var b = sum(1..ceil((sqrt(24*n + 1) - 7)/6), {|k|
  13. (-1)**(k-1) * __FUNC__(n - ((k*(3*k + 1)) >> 1))
  14. })
  15. a + b
  16. }(n+1)
  17. }
  18. say partitionsP.map(0..20) #=> [1, 1, 2, 3, 5, 7, 11, 15, 22, 30, 42, 56, 77, 101, 135, 176, 231, 297, 385, 490, 627]
  19. say partitionsP(200) #=> 3972999029388