58 lines
1.1 KiB
Text
58 lines
1.1 KiB
Text
word MAXSIGMA = 10000;
|
|
[MAXSIGMA+1]word sigma;
|
|
|
|
proc calcsigma() void:
|
|
word i, j;
|
|
for i from 0 upto MAXSIGMA do sigma[i] := 0 od;
|
|
for i from 1 upto MAXSIGMA do
|
|
for j from i by i upto MAXSIGMA do
|
|
sigma[j] := sigma[j] + i
|
|
od
|
|
od
|
|
corp
|
|
|
|
proc gcd(word a, b) word:
|
|
word c;
|
|
while b > 0 do
|
|
c := a % b;
|
|
a := b;
|
|
b := c;
|
|
od;
|
|
a
|
|
corp
|
|
|
|
proc duff(word n) bool:
|
|
sigma[n] > n+1 and gcd(n, sigma[n]) = 1
|
|
corp
|
|
|
|
proc triplet(word n) bool:
|
|
duff(n) and duff(n+1) and duff(n+2)
|
|
corp
|
|
|
|
proc first(word n; proc(word n)bool pred; proc(word i,n)void cb) void:
|
|
word i, cur;
|
|
cur := 0;
|
|
for i from 1 upto n do
|
|
while cur := cur + 1; not pred(cur) do od;
|
|
cb(i, cur)
|
|
od
|
|
corp
|
|
|
|
proc tablenum(word i, n) void:
|
|
write(n:5);
|
|
if i%10 = 0 then writeln() fi
|
|
corp
|
|
|
|
proc tripletline(word i, n) void:
|
|
writeln(i:2, ' ', n:6, n+1:6, n+2:6)
|
|
corp
|
|
|
|
proc main() void:
|
|
calcsigma();
|
|
writeln("First 50 Duffinian numbers:");
|
|
first(50, duff, tablenum);
|
|
writeln();
|
|
|
|
writeln("First 15 Duffinian triplets:");
|
|
first(15, triplet, tripletline)
|
|
corp
|