program prim(output);
const
PrimeLimit = 1000*1000*1000;//1;
type
tLimit = 1..PrimeLimit;
var
primes: array [tLimit] of boolean;
function BuildWheel: longInt;
var
wheelprimes :array[0..13] of byte;
wheelSize,wpno,
pr,pw,i, k: LongWord;
begin
pr := 1;
primes[1]:= true;
WheelSize := 1;
wpno := 0;
repeat
inc(pr);
pw := pr;
if pw > wheelsize then
dec(pw,wheelsize);
If Primes[pw] then
begin
k := WheelSize+1;
for i := 1 to pr-1 do
begin
inc(k,WheelSize);
if k<primeLimit then
move(primes[1],primes[k-WheelSize],WheelSize)
else
begin
move(primes[1],primes[k-WheelSize],PrimeLimit-WheelSize*i);
break;
end;
end;
dec(k);
IF k > primeLimit then
k := primeLimit;
wheelPrimes[wpno] := pr;
primes[pr] := false;
inc(wpno);
WheelSize := k;
i:= pr;
i := i*i;
while i <= k do
begin
primes[i] := false;
inc(i,pr);
end;
end;
until WheelSize >= PrimeLimit;
while wpno > 0 do
begin
dec(wpno);
primes[wheelPrimes[wpno]] := true;
end;
BuildWheel := pr+1;
end;
procedure Sieve;
var
sieveprime,
fakt : LongWord;
begin
sieveprime := BuildWheel;
repeat
if primes[sieveprime] then
begin
fakt := PrimeLimit DIV sieveprime;
IF fakt < sieveprime then
BREAK;
repeat
primes[sieveprime*fakt] := false;
//Search next smaller possible prime
repeat
dec(fakt);
until primes[fakt];
until fakt < sieveprime;
end;
inc(sieveprime);
until false;
primes[1] := false;
end;
var
prCnt,
i : LongWord;
Begin
Sieve;
{count the primes }
prCnt := 0;
for i:= 1 to PrimeLimit do
inc(prCnt,Ord(primes[i]));
writeln(prCnt,' primes up to ',PrimeLimit);
end.
cHJvZ3JhbSBwcmltKG91dHB1dCk7CmNvbnN0CiAgUHJpbWVMaW1pdCA9IDEwMDAqMTAwMCoxMDAwOy8vMTsKdHlwZQogIHRMaW1pdCA9IDEuLlByaW1lTGltaXQ7CnZhcgogIHByaW1lczogYXJyYXkgW3RMaW1pdF0gb2YgYm9vbGVhbjsKIApmdW5jdGlvbiBCdWlsZFdoZWVsOiBsb25nSW50Owp2YXIKICB3aGVlbHByaW1lcyA6YXJyYXlbMC4uMTNdIG9mIGJ5dGU7CiAgd2hlZWxTaXplLHdwbm8sCiAgcHIscHcsaSwgazogTG9uZ1dvcmQ7CmJlZ2luCiAgcHIgOj0gMTsKICBwcmltZXNbMV06PSB0cnVlOwogIFdoZWVsU2l6ZSA6PSAxOwogCiAgd3BubyA6PSAwOwogIHJlcGVhdAogICAgaW5jKHByKTsKICAgIHB3IDo9IHByOwogICAgaWYgcHcgPiB3aGVlbHNpemUgdGhlbgogICAgICBkZWMocHcsd2hlZWxzaXplKTsKICAgIElmIFByaW1lc1twd10gdGhlbgogICAgYmVnaW4KICAgICAgayA6PSBXaGVlbFNpemUrMTsKICAgICAgZm9yIGkgOj0gMSB0byBwci0xIGRvCiAgICAgIGJlZ2luCiAgICAgICAgaW5jKGssV2hlZWxTaXplKTsKICAgICAgICBpZiBrPHByaW1lTGltaXQgdGhlbgogICAgICAgICAgbW92ZShwcmltZXNbMV0scHJpbWVzW2stV2hlZWxTaXplXSxXaGVlbFNpemUpCiAgICAgICAgZWxzZQogICAgICAgIGJlZ2luCiAgICAgICAgICBtb3ZlKHByaW1lc1sxXSxwcmltZXNbay1XaGVlbFNpemVdLFByaW1lTGltaXQtV2hlZWxTaXplKmkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZW5kOwogICAgICBlbmQ7CiAgICAgIGRlYyhrKTsKICAgICAgSUYgayA+IHByaW1lTGltaXQgdGhlbgogICAgICAgIGsgOj0gcHJpbWVMaW1pdDsKICAgICAgd2hlZWxQcmltZXNbd3Bub10gOj0gcHI7CiAgICAgIHByaW1lc1twcl0gOj0gZmFsc2U7CiAKICAgICAgaW5jKHdwbm8pOwogICAgICBXaGVlbFNpemUgOj0gazsKIAogICAgICBpOj0gcHI7CiAgICAgIGkgOj0gaSppOwogICAgICB3aGlsZSBpIDw9IGsgZG8KICAgICAgYmVnaW4KICAgICAgICBwcmltZXNbaV0gOj0gZmFsc2U7CiAgICAgICAgaW5jKGkscHIpOwogICAgICBlbmQ7CiAgICBlbmQ7CiAgdW50aWwgV2hlZWxTaXplID49IFByaW1lTGltaXQ7CiAKCiAgd2hpbGUgd3BubyA+IDAgZG8KICBiZWdpbgogICAgZGVjKHdwbm8pOwogICAgcHJpbWVzW3doZWVsUHJpbWVzW3dwbm9dXSA6PSB0cnVlOwogIGVuZDsKICBCdWlsZFdoZWVsICA6PSBwcisxOwplbmQ7CiAKcHJvY2VkdXJlIFNpZXZlOwp2YXIKICBzaWV2ZXByaW1lLAogIGZha3QgOiBMb25nV29yZDsKYmVnaW4KICBzaWV2ZXByaW1lIDo9IEJ1aWxkV2hlZWw7CiAgcmVwZWF0CiAgICBpZiBwcmltZXNbc2lldmVwcmltZV0gdGhlbgogICAgYmVnaW4KICAgICAgZmFrdCA6PSBQcmltZUxpbWl0IERJViBzaWV2ZXByaW1lOwogICAgICBJRiBmYWt0IDwgc2lldmVwcmltZSB0aGVuCiAgICAgICAgQlJFQUs7CiAgICAgIHJlcGVhdAogICAgICAgIHByaW1lc1tzaWV2ZXByaW1lKmZha3RdIDo9IGZhbHNlOwogICAgICAgIC8vU2VhcmNoIG5leHQgc21hbGxlciBwb3NzaWJsZSBwcmltZQogICAgICAgIHJlcGVhdAogICAgICAgICAgZGVjKGZha3QpOwogICAgICAgIHVudGlsIHByaW1lc1tmYWt0XTsKICAgICAgdW50aWwgZmFrdCA8IHNpZXZlcHJpbWU7CiAgICBlbmQ7CiAgICBpbmMoc2lldmVwcmltZSk7CiAgdW50aWwgZmFsc2U7CiAgcHJpbWVzWzFdIDo9IGZhbHNlOwplbmQ7CiAKdmFyCiAgcHJDbnQsCiAgaSA6IExvbmdXb3JkOwpCZWdpbgogIFNpZXZlOwogIHtjb3VudCB0aGUgcHJpbWVzIH0KICBwckNudCA6PSAwOwogIGZvciBpOj0gMSB0byBQcmltZUxpbWl0IGRvCiAgICBpbmMocHJDbnQsT3JkKHByaW1lc1tpXSkpOwogIHdyaXRlbG4ocHJDbnQsJyBwcmltZXMgdXAgdG8gJyxQcmltZUxpbWl0KTsKZW5kLg==