RosettaCodeData/Task/Chowla-numbers/PascalABC.NET/chowla-numbers.pas

55 lines
1.2 KiB
ObjectPascal

function chowla(n: Integer): Integer;
begin
result := 0;
var i := 2;
while i * i <= n do
begin
if n mod i = 0 then
result += i + (if i = n div i then 0 else n div i);
i += 1
end;
end;
function sieve(limit: Integer): array of Boolean;
begin
result := new Boolean[limit];
for var i := 3 to limit div 3 step 2 do
if not result[i] and (chowla(i) = 0) Then
for var j := 3 * i to limit step 2 * i do
result[j] := true;
end;
begin
for var i := 1 To 37 do
WriteLn('chowla(', i, ') = ', chowla(i));
var count := 1;
var limit := 10_000_000;
var power := 100;
var c := sieve(limit);
for var i := 3 To limit Step 2 do
begin
if not c[i] Then count += 1;
if i = power - 1 Then begin
WriteLn('Count of primes up to ', power:8, ' = ', count);
power *= 10;
end;
end;
count := 0;
limit := 35_000_000;
var k := 2; var kk := 3;
while True do
begin
var p := k * kk;
if p > limit Then break;
if chowla(p) = p - 1 Then begin
WriteLn(p:8, ' is a number that is perfect');
count += 1;
end;
k := kk + 1;
kk += k;
end;
WriteLn('There are ', count, ' perfect numbers <= 35,000,000')
end.