RosettaCodeData/Task/Duffinian-numbers/Free-Pascal-Lazarus/duffinian-numbers.pas
2026-04-30 12:34:36 -04:00

79 lines
1.4 KiB
ObjectPascal

program DuffinianNumbers;
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
BEGIN
sigma[i] := 0
END;
FOR i := 1 TO MaxSigma DO
BEGIN
j := i;//2*i -> sigma(n)-n
WHILE j <= MaxSigma DO
Begin
INC(sigma[j], i);
INC(j, i);
END
END
END;// CalculateSigmaTable;
FUNCTION GCD(a, b: CARDINAL): CARDINAL;
VAR c: CARDINAL;
BEGIN
WHILE b <>0 DO
Begin
c := a MOD b;
a := b;
b := c
END;
EXIT(A)
END;// GCD;
function IsDuffinian(n: CARDINAL): BOOLEAN;
BEGIN
EXIT( (sigma[n] > n+1) AND (GCD(n, sigma[n]) = 1))
END;// IsDuffinian;
FUNCTION IsDuffinianTriple(n: CARDINAL): BOOLEAN;
BEGIN
EXIT(IsDuffinian(n) AND IsDuffinian(n+1) AND IsDuffinian(n+2));
END;// IsDuffinianTriple;
BEGIN
CalculateSigmaTable;
Writeln('First 50 Duffinian numbers:');
WriteLn;
cur := 0;
FOR seen := 1 TO 50 DO
Begin
REPEAT
INC(cur)
UNTIL IsDuffinian(cur);
Write(cur:4);
IF seen MOD 10 = 0 THEN
WriteLn;
END;
WriteLn;
WriteLn('First 15 Duffinian triples:');
WriteLn;
cur := 0;
FOR seen := 1 TO 15 DO
BEGIN
REPEAT
INC(cur)
UNTIL IsDuffinianTriple(cur);
Write(cur:6);
Write(cur+1:6);
Write(cur+2:6);
WriteLn;
END
END.// DuffinianNumbers.