RosettaCodeData/Task/Partition-function-P/FreeBASIC/partition-function-p-1.basic

38 lines
875 B
Plaintext

Function PartitionsP(n As UInteger) As ULongInt
' if n > 416, the result becomes to large for a unsigned 64bit integer
Dim As ULongInt p(n)
Dim As UInteger k, j
p(0) = 1
For i As UInteger = 1 To n
k = 0
While TRUE
k += 1
j = (k * (3*k - 1)) \ 2
If (j > i) Then Exit While
If (k And 1) Then
p(i) += p(i - j)
Else
p(i) -= p(i - j)
End If
'j = (k * (3*k + 1)) \ 2
j += k
If (j > i) Then Exit While
If (k And 1) Then
p(i) += p(i - j)
Else
p(i) -= p(i - j)
End If
Wend
Next i
Return p(n)
End Function
Print !"\nPartitionsP: ";
For x As UInteger = 0 To 12
Print PartitionsP(x);" ";
Next x
Print !"\n\ndone"
Sleep