56 lines
1,001 B
Text
56 lines
1,001 B
Text
MODULE PerfectTotient;
|
|
FROM InOut IMPORT WriteCard, WriteLn;
|
|
|
|
CONST Amount = 20;
|
|
VAR n, seen: CARDINAL;
|
|
|
|
PROCEDURE GCD(a, b: CARDINAL): CARDINAL;
|
|
VAR c: CARDINAL;
|
|
BEGIN
|
|
WHILE b # 0 DO
|
|
c := a MOD b;
|
|
a := b;
|
|
b := c;
|
|
END;
|
|
RETURN a;
|
|
END GCD;
|
|
|
|
PROCEDURE Totient(n: CARDINAL): CARDINAL;
|
|
VAR i, tot: CARDINAL;
|
|
BEGIN
|
|
tot := 0;
|
|
FOR i := 1 TO n/2 DO
|
|
IF GCD(n,i) = 1 THEN
|
|
tot := tot + 1;
|
|
END;
|
|
END;
|
|
RETURN tot;
|
|
END Totient;
|
|
|
|
PROCEDURE Perfect(n: CARDINAL): BOOLEAN;
|
|
VAR sum, x: CARDINAL;
|
|
BEGIN
|
|
sum := 0;
|
|
x := n;
|
|
REPEAT
|
|
x := Totient(x);
|
|
sum := sum + x;
|
|
UNTIL x = 1;
|
|
RETURN sum = n;
|
|
END Perfect;
|
|
|
|
BEGIN
|
|
seen := 0;
|
|
n := 3;
|
|
WHILE seen < Amount DO
|
|
IF Perfect(n) THEN
|
|
WriteCard(n,5);
|
|
seen := seen + 1;
|
|
IF seen MOD 14 = 0 THEN
|
|
WriteLn();
|
|
END;
|
|
END;
|
|
n := n + 2;
|
|
END;
|
|
WriteLn();
|
|
END PerfectTotient.
|