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.