Duffinian numbers: Difference between revisions

add Modula-2
(add Modula-2)
Line 1,333:
860671-860673 910115-910117 913951-913953 963271-963273 968255-968257
991231-991233</pre>
 
=={{header|Modula-2}}==
<syntaxhighlight lang="modula2">MODULE DuffinianNumbers;
FROM InOut IMPORT WriteCard, WriteString, WriteLn;
 
CONST
MaxSigma = 10000;
 
VAR
seen, cur: CARDINAL;
sigma: ARRAY [1..MaxSigma] OF CARDINAL;
 
PROCEDURE CalculateSigmaTable;
VAR i, j: CARDINAL;
BEGIN
FOR i := 1 TO MaxSigma DO
sigma[i] := 0
END;
FOR i := 1 TO MaxSigma DO
j := i;
WHILE j <= MaxSigma DO
INC(sigma[j], i);
INC(j, i);
END
END
END CalculateSigmaTable;
 
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 IsDuffinian(n: CARDINAL): BOOLEAN;
BEGIN
RETURN (sigma[n] > n+1) AND (GCD(n, sigma[n]) = 1)
END IsDuffinian;
 
PROCEDURE IsDuffinianTriple(n: CARDINAL): BOOLEAN;
BEGIN
RETURN IsDuffinian(n) AND IsDuffinian(n+1) AND IsDuffinian(n+2)
END IsDuffinianTriple;
 
BEGIN
CalculateSigmaTable;
WriteString("First 50 Duffinian numbers:");
WriteLn;
cur := 0;
FOR seen := 1 TO 50 DO
REPEAT INC(cur) UNTIL IsDuffinian(cur);
WriteCard(cur, 4);
IF seen MOD 10 = 0 THEN WriteLn END
END;
 
WriteLn;
WriteString("First 15 Duffinian triples:");
WriteLn;
cur := 0;
FOR seen := 1 TO 15 DO
REPEAT INC(cur) UNTIL IsDuffinianTriple(cur);
WriteCard(cur, 6);
WriteCard(cur+1, 6);
WriteCard(cur+2, 6);
WriteLn
END
END DuffinianNumbers.</syntaxhighlight>
{{out}}
<pre>First 50 Duffinian numbers:
4 8 9 16 21 25 27 32 35 36
39 49 50 55 57 63 64 65 75 77
81 85 93 98 100 111 115 119 121 125
128 129 133 143 144 155 161 169 171 175
183 185 187 189 201 203 205 209 215 217
 
First 15 Duffinian triples:
63 64 65
323 324 325
511 512 513
721 722 723
899 900 901
1443 1444 1445
2303 2304 2305
2449 2450 2451
3599 3600 3601
3871 3872 3873
5183 5184 5185
5617 5618 5619
6049 6050 6051
6399 6400 6401
8449 8450 8451</pre>
 
=={{header|Nim}}==
2,093

edits