RosettaCodeData/Task/Arithmetic-derivative/Oberon-07/arithmetic-derivative.oberon
2026-04-30 12:34:36 -04:00

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.