RosettaCodeData/Task/Long-primes/PascalABC.NET/long-primes.pas

35 lines
856 B
ObjectPascal

function gen_primes_upto(n: integer): sequence of integer;
begin
if n < 3 then exit;
var table := |True| * n;
var sqrtn := n.sqrt.Floor;
for var i := 2 to sqrtn do
if table[i] then
for var j := i * i to n - 1 step i do
table[j] := False;
yield 2;
for var i := 3 to n step 2 do
if table[i] then yield i
end;
function period(n: integer): integer;
begin
var r := 1;
repeat
r := r * 10 mod n;
result += 1;
until r <= 1;
end;
begin
writeln('The long primes up to 500 are:');
var primes := Gen_primes_upto(64000).Skip(1);
primes.Where(x -> (x < 500) and (period(x) = x - 1)).Println;
writeln;
writeln('The number of long primes up to:');
foreach var n in |500, 1000, 2000, 4000, 8000, 16000, 32000, 64000| do
writeln(n:6, ' is ', primes.Where(x -> (x < n) and (period(x) = x - 1)).Count);
end.