35 lines
856 B
ObjectPascal
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.
|