DEFLNG A-Z
DIM B(0 TO 15) AS INTEGER
DIM TM AS STRING
FOR I = 0 TO 15
READ B(I)
NEXT
DATA 1,2,4,8,16,32,64,128,256,512
DATA 1024,2048,4096,8192,16384,-32768
AAA:
INPUT "Input a number within 3-1000000:"; N
IF N < 3 OR N > 1536000 THEN
PRINT "Out of range!": GOTO AAA
END IF
TM = TIME$
K = INT(N / 48 + 1)
REDIM A(K) AS INTEGER
FOR I = 0 TO K
A(I) = 0
NEXT
A(0) = 1
Q = INT(SQR(N))
Q = INT((4 * Q - 3 - (Q MOD 6)) / 12)
H = INT((4 * N - 3 - (N MOD 6)) / 12)
FOR I = 1 TO Q
R = INT(I / 16): S = B(I MOD 16): T = A(R) AND S
IF T = 0 THEN
P = 3 * I + 1 + (I MOD 2)
M = INT((4 * P * P - 3 - (P * P MOD 6)) / 12)
U = 3 * I + 4 + ((I + 1) MOD 2)
V = INT((4 * P * U - 3 - ((P * U) MOD 6)) / 12)
W = V - M
FOR J = M TO H STEP 2 * P
R = INT(J / 16): S = B(J MOD 16): A(R) = A(R) OR S
R = INT((J + W) / 16)
IF R <= K THEN
S = B((J + W) MOD 16): A(R) = A(R) OR S
END IF
NEXT J
END IF
NEXT I
E = 2
PRINT USING "##########"; 2; 3;
FOR I = 1 TO H
R = INT(I / 16): S = B(I MOD 16): T = A(R) AND S
IF T = 0 THEN
P = 3 * I + 1 + (I MOD 2)
IF P > N THEN GOTO BBB
E = E + 1
PRINT USING "##########"; P;
END IF
NEXT I
BBB:
PRINT : PRINT "TOTAL:"; E
PRINT "START TIME:"; TM
PRINT "END TIME:"; TIME$
GOTO AAA
END
var
primes, modprimes: array[1 .. maxlen] of integer;
procedure init;
var
i, k, p: integer;
begin
k := 1;
for i := 1 to maxlen do
repeat
k := k + 1; p := 1; primes := k;
while (primes[p] <= sqrt(k)) and (k mod primes[p] <> 0) do p
:= p + 1;
until (primes[p] = k) or (k mod primes[p] <> 0);
end;
var
sum, last: integer;
mark: array[0 .. l shr 1 - 1] of boolean;
procedure makeprimes;
var
i, k, s, p, sqmax: integer;
begin
sum := 0; fillchar(modprimes, sizeof(modprimes), $FF);
for i := 1 to ll do begin
fillchar(mark, sizeof(mark), true);
k := 1; sqmax := round(sqrt(1.0 * i * l));
repeat
k := k + 1; p := primes[k];
if p > sqmax then break;
if i > 1 then begin
if modprimes[k] = - 1 then
modprimes[k] := int64(i - 1) * l mod p
else
modprimes[k] := (modprimes[k] + l) mod p;
s := (p * (1 + modprimes[k] and 1) - modprimes[k]) shr 1;
end else s := p * p shr 1;
while s < l shr 1 do begin
mark[s] := false;
s := s + p;
end;
until false;
for k := 0 to l shr 1 - 1 do if mark[k] then sum := sum + 1;
if (int64(i) * l mod (10 shl 20) = 0) or (i = ll) then begin
writeln(int64(i) * l shr 20 : 5, 'M = ',
sum : 9, ' (', sum - last, ')');
last := sum;
end;
void main()
{
unsigned long *check;
unsigned long num_check = 1;
unsigned long num_result = 2;
unsigned long number, counter;
unsigned long min, max, est, chkmax;
bool test;
min = 5;
printf("Input N:");
scanf("%lu",&max);
check=new unsigned long[sqrt(max)+1];
check[ 0 ] = 3;
#ifdef _PRINT_RESULT_
printf("2\t3\t");
#endif
est=GetTickCount();
for ( number = min; number <= max ; number+=2 )
{
test = true;
chkmax=sqrt( number );
for ( counter = 0; counter < num_check && *(check+counter) <= chkmax; ++counter )
{
if ( ( number % *(check+counter) ) == 0 )
{
test = false;
break;
}
}
if ( test )
{
#ifdef _PRINT_RESULT_
printf("%lu\t",number);
#endif
if ( number < sqrt( max ) )
*(check+num_check++) = number;
++num_result;
}
}
delete [] check;
printf("\n\nchecked:%lu Total:%lu\n",num_check,num_result);
printf("The program run for %lu ms\n",GetTickCount()-est);
var
primes: array[1 .. maxlen3] of integer;
v: array of integer;
mark: array of boolean;
m, ans, Q, phiQ: integer;
n, len2, len3, sum: int64;
start: TDateTime;
procedure init;
var
l, k, s, max, sqmax: integer;
p: int64;
begin
max := round(exp(2 / 3 * ln(1.0 * n))) + 1;
sqmax := round(sqrt(max));
setlength(mark, max);
for s := 2 to sqmax do
if not mark[s] then
begin
k := s * s;
while k < max do
begin
mark[k] := true;
k := k + s;
end;
end;
l := 0; p := 2;
while p * p * p <= n do
begin
if not mark[p] then
begin
l := l + 1;
primes[l] := p;
end;
p := p + 1;
end;
len3 := l;
k := max - 1; sum := 0; s := 0;
while p * p <= n do
begin
if not mark[p] then
begin
l := l + 1;
while p * k > n do
begin
if not mark[k] then
s := s + 1;
k := k - 1;
end;
sum := sum + s;
end;
p := p + 1;
end;
len2 := l;
while p < max do
begin
if not mark[p] then
l := l + 1;
p := p + 1;
end;
sum := (len2 - len3) * l - sum;
sum := len3 * (len3 - 1) div 2 - len2 * (len2 - 1) div 2 + sum;
Q := 1;
phiQ := 1;
if len3 < dm then
m := len3
else
m := dm;
for s := 1 to m do
begin
Q := Q * primes[s];
phiQ := phiQ * (primes[s] - 1);
end;
setlength(v, Q);
for s := 0 to Q - 1 do
v[s] := s;
for s := 1 to m do
for k := Q - 1 downto 0 do
v[k] := v[k] - v[k div primes[s]];
end;
function phi(x: int64; a: integer): int64;
begin
if a = m then
begin
result := (x div Q) * phiQ + v[x mod Q];
exit;
end;
if x < primes[a] then
begin
result := 1;
exit;
end;
result := phi(x, a - 1) - phi(x div primes[a], a - 1);
end;
var
s: string;
begin
writeln('calc pi(n)');
write(format('n (default = %d) = ', [dn]));
try
readln(s);
n := strtoint64(s);
except
n := dn;
end;
start := now;
init;
ans := phi(n, len3) - sum + len3 - 1;