高分求解释,
请解释以下代码,
{$R-,S-,Q-,O+}//求100亿以内的素数
{$APPTYPE CONSOLE}
program prime;
uses
sysutils;
const
maxlen3 = 1000;
dn = int64(10) shl 30;
dm = 7;
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;
writeln(format('pi(%d) = %d (%.2fs)',
[n, ans, (now - start) * SecsPerDay]));
writeln('Press enter');
readln;
end.具体请看:
http://www.csdn.net/expert/topic/733/733996.xml?temp=.6040003
www.csdn.net/expert/topic/417/417110.xml?temp=.3694422