33 lines
1.1 KiB
Text
33 lines
1.1 KiB
Text
MODULE ArithmeticDerivative; (* Translation of Algol W *)
|
|
IMPORT Out;
|
|
VAR n : INTEGER;
|
|
|
|
PROCEDURE lagarias( n : INTEGER ) : INTEGER; (* Lagarias arithmetic derivative *)
|
|
VAR result, f, q : INTEGER;
|
|
|
|
PROCEDURE smallPf( j, k : INTEGER ) : INTEGER; (* Smallest prime factor *)
|
|
VAR result : INTEGER;
|
|
BEGIN
|
|
IF j MOD k = 0 THEN result := k
|
|
ELSIF k = 2 THEN result := smallPf( j, 3 )
|
|
ELSE result := smallPf( j, k + 2 )
|
|
END
|
|
RETURN result
|
|
END smallPf ;
|
|
|
|
BEGIN
|
|
IF n < 0 THEN result := - lagarias( - n )
|
|
ELSIF ( n = 0 ) OR ( n = 1 ) THEN result := 0
|
|
ELSE
|
|
f := smallPf( n, 2 ); q := n DIV f;
|
|
IF q = 1 THEN result := 1 ELSE result := q * lagarias( f ) + f * lagarias( q ) END
|
|
END
|
|
RETURN result
|
|
END lagarias ;
|
|
|
|
BEGIN
|
|
FOR n := -99 TO 100 DO
|
|
Out.String( " " );Out.Int( lagarias( n ), 6 );
|
|
IF n MOD 10 = 0 THEN Out.Ln END
|
|
END
|
|
END ArithmeticDerivative.
|