85 lines
3.6 KiB
Plaintext
85 lines
3.6 KiB
Plaintext
BEGIN # show members of the Padovan Sequence calculated in various ways #
|
|
# returns the first n elements of the Padovan sequence by the #
|
|
# recurance relation: P(n)=P(n-2)+P(n-3) #
|
|
OP PADOVANI = ( INT n )[]INT:
|
|
BEGIN
|
|
[ 0 : n - 1 ]INT p; p[ 0 ] := p[ 1 ] := p[ 2 ] := 1;
|
|
FOR i FROM 3 TO UPB p DO
|
|
p[ i ] := p[ i - 2 ] + p[ i - 3 ]
|
|
OD;
|
|
p
|
|
END; # PADOVANI #
|
|
# returns the first n elements of the Padovan sequence by #
|
|
# computing by truncation P(n)=floor(p^(n-1) / s + .5) #
|
|
# where s = 1.0453567932525329623 #
|
|
# and p = the "plastic ratio" #
|
|
OP PADOVANC = ( INT n )[]INT:
|
|
BEGIN
|
|
LONG REAL s = 1.0453567932525329623;
|
|
LONG REAL p = 1.324717957244746025960908854;
|
|
LONG REAL pf := 1 / p;
|
|
[ 0 : n - 1 ]INT result;
|
|
FOR i FROM LWB result TO UPB result DO
|
|
result[ i ] := SHORTEN ENTIER ( pf / s + 0.5 );
|
|
pf *:= p
|
|
OD;
|
|
result
|
|
END; # PADOVANC #
|
|
# returns the first n L System strings of the Padovan sequence #
|
|
OP PADOVANL = ( INT n )[]STRING:
|
|
BEGIN
|
|
[ 0 : n - 1 ]STRING l; l[ 0 ] := "A"; l[ 1 ] := "B"; l[ 2 ] := "C";
|
|
FOR i FROM 3 TO UPB l DO
|
|
l[ i ] := l[ i - 3 ] + l[ i - 2 ]
|
|
OD;
|
|
l
|
|
END; # PADOVANC #
|
|
# returns TRUE if a and b have the same values, FALSE otherwise #
|
|
OP = = ( []INT a, b )BOOL:
|
|
IF LWB a /= LWB b OR UPB a /= UPB b
|
|
THEN # rows are not the same size # FALSE
|
|
ELSE
|
|
BOOL result := TRUE;
|
|
FOR i FROM LWB a TO UPB a WHILE result := a[ i ] = b[ i ] DO SKIP OD;
|
|
result
|
|
FI; # = #
|
|
# returns the number of elements in a #
|
|
OP LENGTH = ( []INT a )INT: ( UPB a - LWB a ) + 1;
|
|
# returns the number of characters in s #
|
|
OP LENGTH = ( STRING s )INT: ( UPB s - LWB s ) + 1;
|
|
# returns a string representation of n #
|
|
OP TOSTRING = ( INT n )STRING: whole( n, 0 );
|
|
# generate 64 elements of the sequence and 32 L System values #
|
|
[]INT iterative = PADOVANI 64;
|
|
[]INT calculated = PADOVANC 64;
|
|
[]STRING l system = PADOVANL 32;
|
|
[ LWB l system : UPB l system ]INT l length;
|
|
FOR i FROM LWB l length TO UPB l length DO l length[ i ] := LENGTH l system[ i ] OD;
|
|
# first 20 terms #
|
|
print( ( "First 20 terms of the Padovan Sequence", newline ) );
|
|
FOR i FROM LWB iterative TO 19 DO
|
|
print( ( " ", TOSTRING iterative[ i ] ) )
|
|
OD;
|
|
print( ( newline ) );
|
|
print( ( "The first "
|
|
, TOSTRING LENGTH iterative
|
|
, " iterative and calculated values "
|
|
, IF iterative = calculated THEN "are the same" ELSE "differ" FI
|
|
, newline
|
|
)
|
|
);
|
|
# print the first 10 values of the L System strings #
|
|
print( ( newline, "First 10 L System strings", newline ) );
|
|
FOR i FROM LWB l system TO 9 DO
|
|
print( ( " ", l system[ i ] ) )
|
|
OD;
|
|
print( ( newline ) );
|
|
print( ( "The first "
|
|
, TOSTRING LENGTH l length
|
|
, " iterative values and L System lengths "
|
|
, IF l length = iterative[ LWB l length : UPB l length @ LWB l length ] THEN "are the same" ELSE "differ" FI
|
|
, newline
|
|
)
|
|
)
|
|
END
|