64 lines
1.3 KiB
Plaintext
64 lines
1.3 KiB
Plaintext
' version 26-06-2021
|
|
' compile with: fbc -s console
|
|
|
|
#Include Once "gmp.bi"
|
|
|
|
Sub PartitionsP(max As ULong, p() As MpZ_ptr)
|
|
' based on Numericana code example
|
|
Dim As ULong a, b, i, k
|
|
Dim As Long j
|
|
|
|
Dim As Mpz_ptr s = Allocate(Len(__mpz_struct)) : Mpz_init(s)
|
|
|
|
Mpz_set_ui(p(0), 1)
|
|
|
|
For i = 1 To max
|
|
j = 1 : k = 1 : b = 2 : a = 5
|
|
While j > 0
|
|
' j = i - (3*k*k+k) \ 2
|
|
j = i - b : b = b + a : a = a + 3
|
|
If j >= 0 Then
|
|
If k And 1 Then Mpz_add(s, s, p(j)) Else Mpz_sub(s, s, p(j))
|
|
End If
|
|
j = j + k
|
|
If j >= 0 Then
|
|
If k And 1 Then Mpz_add(s, s, p(j)) Else Mpz_sub(s, s, p(j))
|
|
End If
|
|
k = k +1
|
|
Wend
|
|
Mpz_swap(p(i), s)
|
|
Next
|
|
|
|
Mpz_clear(s)
|
|
|
|
End Sub
|
|
|
|
' ------=< MAIN >=------
|
|
|
|
#Define max 6666
|
|
|
|
Dim As UInteger n
|
|
Dim As ZString Ptr ans
|
|
Dim As Double t = Timer
|
|
|
|
ReDim big_p(max) As Mpz_ptr
|
|
For n = 0 To max
|
|
big_p(n) = Allocate(Len(__mpz_struct)) : Mpz_init(big_p(n))
|
|
Next
|
|
|
|
PartitionsP(max, big_p())
|
|
ans = Mpz_get_str (0, 10, big_p(max))
|
|
Print "PartitionsP("; Str(max); ") = "; " "; *ans
|
|
|
|
For n = 0 To max
|
|
Mpz_clear(big_p(n))
|
|
Next
|
|
|
|
Print Using "time = ###.## ms"; (Timer - t) * 1000
|
|
|
|
' empty keyboard buffer
|
|
While InKey <> "" : Wend
|
|
Print : Print "hit any key to end program"
|
|
Sleep
|
|
End
|