RosettaCodeData/Task/Perfect-totient-numbers/Modula-2/perfect-totient-numbers.mod2
2023-07-01 13:44:08 -04:00

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.