Question
It is possible to write five as a sum in exactly six different ways:
How many different ways can one hundred be written as a sum of at least two positive integers?
Haskell
import Data.Array
change :: Integer -> Integer -> Integer
change t c = cache ! (t, c) where
cache = array ((0, 0), (t, c)) [((i, j), f i j) | i <- [0..t], j <- [0..c]]
f _ 1 = 1
f t' c' = sum [cache ! (t' - i*c', c' - 1) | i <- [0..t' `quot` c']]
main :: IO ()
main = print $ change 100 99
$ ghc -O2 -o counting-summations counting-summations.hs
$ time ./counting-summations
real 0m0.004s
user 0m0.000s
sys 0m0.004s
Python
#!/usr/bin/env python
partitions = {}
def partition(n):
if n < 0: return 0
if n == 0: return 1
if n not in partitions:
# http://mathworld.wolfram.com/PartitionFunctionP.html
partitions[n] = sum([(-1)**(k+1) * (partition(n - (k * (3 * k - 1) // 2))
+ partition(n - (k * (3 * k + 1) // 2))) for k in range(1, n+1)])
return partitions[n]
def main():
print(partition(100) - 1)
if __name__ == "__main__": main()