47 lines
1.8 KiB
Plaintext
47 lines
1.8 KiB
Plaintext
BEGIN # calculate the partition function of some integers #
|
|
# translated from the FreeBASIC sample #
|
|
PR precision 128 PR # set the number of digits for LONG LONG INT #
|
|
MODE PARTINT = LONG LONG INT;
|
|
PROC partitions p = ( INT n )PARTINT:
|
|
BEGIN
|
|
[ 0 : n ]PARTINT p; FOR i FROM LWB p TO UPB p DO p[ i ] := 0 OD;
|
|
p[ 0 ] := 1;
|
|
FOR i TO n DO
|
|
INT k := 0;
|
|
WHILE k +:= 1;
|
|
INT j := ( k * ( 3 * k - 1 ) ) OVER 2;
|
|
IF j > i
|
|
THEN FALSE # exit the loop #
|
|
ELSE IF ODD k THEN
|
|
p[ i ] +:= p[ i - j ]
|
|
ELSE
|
|
p[ i ] -:= p[ i - j ]
|
|
FI;
|
|
j +:= k;
|
|
IF j > i
|
|
THEN FALSE # exit the loop #
|
|
ELSE IF ODD k THEN
|
|
p[ i ] +:= p[ i - j ]
|
|
ELSE
|
|
p[ i ] -:= p[ i - j ]
|
|
FI;
|
|
TRUE # continue to loop #
|
|
FI
|
|
FI
|
|
DO SKIP OD
|
|
OD;
|
|
p[ n ]
|
|
END # partitions p # ;
|
|
|
|
BEGIN
|
|
print( ( "P(0..12):" ) );
|
|
FOR x FROM 0 TO 12 DO
|
|
print( ( " ", whole( partitions p( x ), 0 ) ) )
|
|
OD;
|
|
print( ( newline, "P(127): ", whole( partitions p( 127 ), 0 ) ) );
|
|
print( ( newline, "P(255): ", whole( partitions p( 255 ), 0 ) ) );
|
|
print( ( newline, "P(6666): ", whole( partitions p( 6666 ), 0 ) ) );
|
|
print( ( newline ) )
|
|
END
|
|
END
|