function IsPrime(n: Longint): Boolean;
var d, q: Integer;
begin
IsPrime:=False;
if (n<2) or (n<>2) and not Odd(n) then Exit;
q:=Trunc(SqRt(n)); d:=3;
while (d<=q) and (n mod d<>0) do Inc(d,2);
if d<=q then Exit;
IsPrime:=True;
end;
Или так:
function IsPrime(n: Longint): Boolean;
var i, sqrtn, delta: Word;
begin
if (n >= 5) and ((n - 1) mod 6 = 0) or ((n + 1) mod 6 = 0) then begin
i := 5;
delta := 2;
sqrtn := Trunc(sqrt(n));
IsPrime := False;
while i <= sqrtn do begin
if n mod i = 0 then Exit;
Inc(i, delta);
delta := delta xor 6; {смена шага, то 2, то 4}
end;
IsPrime := True;
end else
IsPrime := (n = 2) or (n = 3);
end;
Или даже так:
function IsPrime(n: Longint): Boolean;
const delta: array [0..7] of Word = (4, 2, 4, 2, 4, 6, 2, 6);
var i, j, sqrtn: Word;
begin
if (n >= 7) and ((n - 1) mod 6 = 0) or ((n + 1) mod 6 = 0) then begin
i := 7; j := 0;
sqrtn := Trunc(SqRt(n));
IsPrime := False;
while i <= sqrtn do begin
if n mod i = 0 then Exit;
Inc(i, delta[j]);
Inc(j); if j = 8 then j := 0;
end;
IsPrime := True;
end else
IsPrime := (n = 2) or (n = 3) or (n = 5);
end;
Но если проверять несколько чисел, любое решето обычно быстрее.
но лучше так:
Или так:
Или даже так:
Но если проверять несколько чисел, любое решето обычно быстрее.