Perfect totient numbers: Difference between revisions

Add Modula-2
(Add PL/I)
(Add Modula-2)
Line 1,008:
{{out}}
<pre>{3,9,15,27,39,81,111,183,243,255,327,363,471,729,2187,2199,3063,4359,4375,5571}</pre>
 
=={{header|Modula-2}}==
<lang modula2>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.</lang>
{{out}}
<pre> 3 9 15 27 39 81 111 183 243 255 327 363 471 729
2187 2199 3063 4359 4375 5571</pre>
 
=={{header|Nim}}==
2,095

edits