Contributor: GUY MCLOUGHLIN 
{
GUY MCLOUGHLIN>the way, it took about 20 mins. on my 386/40 to get prime numbers>through 20000. I tried to come up With code to do the same With>Turbo but it continues to elude me. Could anybody explain>how to Write such a routine in Pascal?
 ...The following PRIME routine should prove to be a bit faster:
}
{ Find the square-root of a LongInt. }
Function FindSqrt(lo_IN : LongInt) : LongInt;
 { SUB : Find square-root For numbers less than 65536. }
 Function FS1(wo_IN : Word) : Word;
 Var
 wo_Temp1,
 wo_Temp2 : Word;
 lo_Error : Integer;
 begin
 if (wo_IN> 0) then
 begin
 wo_Temp1 := 1;
 wo_Temp2 := wo_IN;
 While ((wo_Temp1 shl 1) < wo_Temp2) do begin wo_Temp1 := wo_Temp1 shl 1; wo_Temp2 := wo_Temp2 shr 1; end; Repeat wo_Temp1 := (wo_Temp1 + wo_Temp2) div 2; wo_Temp2 := wo_IN div wo_Temp1; lo_Error := (LongInt(wo_Temp1) - wo_Temp2); Until (lo_Error <= 0); FS1 := wo_Temp1; end else FS1 := 0; end; { SUB : Find square-root For numbers greater than 65535. } Function FS2(lo_IN : longInt) : longInt; Var lo_Temp1, lo_Temp2, lo_Error : longInt; begin if (lo_IN> 0) then
 begin
 lo_Temp1 := 1;
 lo_Temp2 := lo_IN;
 While ((lo_Temp1 shl 1) < lo_Temp2) do
 begin
 lo_Temp1 := lo_Temp1 shl 1;
 lo_Temp2 := lo_Temp2 shr 1;
 end;
 Repeat
 lo_Temp1 := (lo_Temp1 + lo_Temp2) div 2;
 lo_Temp2 := lo_IN div lo_Temp1;
 lo_Error := (lo_Temp1 - lo_Temp2);
 Until (lo_Error <= 0);
 FS2 := lo_Temp1;
 end
 else
 FS2 := 0;
 end;
begin
 if (lo_IN < 65536) then
 FindSqrt := FS1(lo_IN)
 else
 FindSqrt := FS2(lo_IN);
end;
{ Check if a number is prime. }
Function Prime(lo_IN : LongInt) : Boolean;
Var
 lo_Sqrt,
 lo_Loop : LongInt;
begin
 if not odd(lo_IN) then
 begin
 Prime := (lo_IN = 2);
 Exit;
 end;
 if (lo_IN mod 3 = 0) then
 begin
 Prime := (lo_IN = 3);
 Exit;
 end;
 if (lo_IN mod 5 = 0) then
 begin
 Prime := (lo_IN = 5);
 Exit;
 end;
 lo_Sqrt := FindSqrt(lo_IN);
 lo_Loop := 7;
 While (lo_Loop < lo_Sqrt) do
 begin
 inc(lo_Loop, 2);
 if (lo_IN mod lo_Loop = 0) then
 begin
 Prime := False;
 Exit;
 end;
 end;
 Prime := True;
end;
 

AltStyle によって変換されたページ (->オリジナル) /