63 lines
1.3 KiB
Plaintext
63 lines
1.3 KiB
Plaintext
MODULE TotientFunction;
|
|
FROM InOut IMPORT WriteString, WriteCard, WriteLn;
|
|
|
|
VAR count, n, tot: CARDINAL;
|
|
|
|
PROCEDURE totient(n: CARDINAL): CARDINAL;
|
|
VAR tot, i: CARDINAL;
|
|
BEGIN
|
|
tot := n;
|
|
i := 2;
|
|
WHILE i*i <= n DO
|
|
IF n MOD i = 0 THEN
|
|
WHILE n MOD i = 0 DO
|
|
n := n DIV i
|
|
END;
|
|
DEC(tot, tot DIV i)
|
|
END;
|
|
IF i=2 THEN i := 1 END;
|
|
INC(i, 2)
|
|
END;
|
|
IF n>1 THEN
|
|
DEC(tot, tot DIV n)
|
|
END;
|
|
RETURN tot
|
|
END totient;
|
|
|
|
PROCEDURE ShowPrimeCount(n, count: CARDINAL);
|
|
BEGIN
|
|
WriteString("Number of primes up to");
|
|
WriteCard(n, 6);
|
|
WriteString(": ");
|
|
WriteCard(count, 4);
|
|
WriteLn
|
|
END ShowPrimeCount;
|
|
|
|
BEGIN
|
|
count := 0;
|
|
|
|
WriteString(" N Totient Prime");
|
|
WriteLn;
|
|
FOR n := 1 TO 25 DO
|
|
tot := totient(n);
|
|
WriteCard(n, 2);
|
|
WriteCard(tot, 9);
|
|
IF tot = n-1 THEN
|
|
WriteString(" Yes");
|
|
INC(count)
|
|
ELSE
|
|
WriteString(" No")
|
|
END;
|
|
WriteLn
|
|
END;
|
|
|
|
ShowPrimeCount(25, count);
|
|
|
|
FOR n := 26 TO 10000 DO
|
|
IF totient(n) = n-1 THEN INC(count) END;
|
|
IF (n=100) OR (n=1000) OR (n=10000) THEN
|
|
ShowPrimeCount(n, count)
|
|
END;
|
|
END
|
|
END TotientFunction.
|