How to resolve the algorithm Partition function P step by step in the Haskell programming language
How to resolve the algorithm Partition function P step by step in the Haskell programming language
Table of Contents
Problem Statement
The Partition Function P is the function P(n), where n∈ℤ, defined as the number of distinct ways in which n can be expressed as the sum of non-increasing positive integers.
P(n) can be expressed as the recurrence relation: The successive numbers in the above equation have the differences: 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8 ... This task may be of popular interest because Mathologer made the video, The hardest "What comes next?" (Euler's pentagonal formula), where he asks the programmers among his viewers to calculate P(666). The video was viewed more than 100,000 times in the first couple of weeks after its release. In Wolfram Language, this function has been implemented as PartitionsP.
Write a function which returns the value of PartitionsP(n). Solutions can be iterative or recursive. Bonus task: show how long it takes to compute PartitionsP(6666).
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Partition function P step by step in the Haskell programming language
Memoization Utilities
The code defines a data structure called Memo
for memoization. Memoization is a technique used to improve the efficiency of functions by storing their results for future use. The Memo
data structure represents a node in a tree, where each node has a value, a left child, and a right child.
The memo
function retrieves the value stored in the Memo
data structure. If the value for the given input is already stored in the tree, it returns the stored value. Otherwise, it recursively traverses the tree to find the value. The function uses bit manipulation to determine which child to traverse based on the input.
Calculating Partitions
The code calculates the number of partitions of a given number using a recursive approach. A partition of a number is a way of dividing the number into smaller positive integers.
The partitions
memo represents the number of partitions for each input. The partitionP
function recursively calculates the number of partitions for a given input. It uses the memo
function to access the stored results.
The partitionP
function uses a formula to calculate the number of partitions. It sums up the product of signs and terms. The signs and terms are calculated using the signs
and terms
functions, respectively.
The signs
function generates a cycle of alternating 1s and -1s. The terms
function calls the memo
function to retrieve the number of partitions for smaller inputs.
Main Function
The main
function calls the partitionP
function with an input of 6666 and prints the result.
Source code in the haskell programming language
{-# LANGUAGE DeriveFunctor #-}
------------------------------------------------------------
-- memoization utilities
data Memo a = Node a (Memo a) (Memo a)
deriving (Functor)
memo :: Integral a => Memo p -> a -> p
memo (Node a l r) n
| n == 0 = a
| odd n = memo l (n `div` 2)
| otherwise = memo r (n `div` 2 - 1)
nats :: Memo Int
nats =
Node
0
((+ 1) . (* 2) <$> nats)
((* 2) . (+ 1) <$> nats)
------------------------------------------------------------
-- calculating partitions
partitions :: Memo Integer
partitions = partitionP <$> nats
partitionP :: Int -> Integer
partitionP n
| n < 2 = 1
| otherwise = sum $ zipWith (*) signs terms
where
terms =
[ memo partitions (n - i)
| i <- takeWhile (<= n) ofsets
]
signs = cycle [1, 1, -1, -1]
ofsets :: [Int]
ofsets = scanl1 (+) $ mix [1, 3 ..] [1, 2 ..]
where
mix a b = concat $ zipWith (\x y -> [x, y]) a b
main :: IO ()
main = print $ partitionP 6666
You may also check:How to resolve the algorithm XML/DOM serialization step by step in the Ada programming language
You may also check:How to resolve the algorithm S-expressions step by step in the Ceylon programming language
You may also check:How to resolve the algorithm Zumkeller numbers step by step in the Kotlin programming language
You may also check:How to resolve the algorithm Hello world/Newbie step by step in the SQL PL programming language
You may also check:How to resolve the algorithm Higher-order functions step by step in the Racket programming language