| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- {IsPrime.Pas ver. 2.0 (c) Max Alekseyev <relf@os2.ru>, 2:5015/60@FidoNet}
- {�¥ «¨§ æ¨ï ¢¥à®ïâ®á⮣® «£®à¨â¬ Œ¨««¥à -� ¡¨ á 20 à 㤠¬¨.
- „«ï ¯à¨¬¥à ¢ë¤ ¥â ¯à®áâë¥ ®â१ª¥ [1000000000,1000100000].
- ‚¥à®ïâ®áâì ®è¨¡ª¨ (â®, çâ® á®áâ ¢®¥ ç¨á«® ¡ã¤¥â §¢ ® ¯à®áâë¬) ¬¥ìè¥
- 4^(-Rounds).}
- const Rounds=20;
- function mulmod(x,y,m:longint):longint; assembler;
- asm
- {$IFDEF USE32}
- mov eax,x
- mul y
- div m
- mov eax,edx
- {$ELSE}
- db $66; mov ax,word ptr x
- db $66; mul word ptr y
- db $66; div word ptr m
- mov ax,dx
- db $66; shr dx,16
- {$ENDIF}
- end;
- function powmod(x,a,m:longint):longint;
- var r:longint;
- begin
- r:=1;
- while a>0 do
- begin
- if odd(a) then r:=mulmod(r,x,m);
- a:=a shr 1;
- x:=mulmod(x,x,m);
- end;
- powmod:=r;
- end;
- function isprime(p:longint):boolean;
- var q,i,a:longint;
- begin
- if odd(p) and (p>1) then
- begin
- isprime:=true;
- q:=p-1;
- repeat q:=q shr 1; until odd(q);
- for i:=1 to Rounds do
- begin
- {$IFDEF USE32} a:=Random(p-2)+2; {$ELSE} a:=2+Trunc(Random*(p-2)); {$ENDIF}
- if powmod(a,p-1,p)<>1 then
- begin
- isprime:=false; break;
- end;
- a:=powmod(a,q,p);
- if a<>1 then
- begin
- while (a<>1) and (a<>p-1) do a:=mulmod(a,a,p);
- if a=1 then
- begin
- isprime:=false; break;
- end;
- end;
- end;
- end else isprime:=(p=2);
- end;
- var t:longint;
- begin
- Randomize; {Do not forget to reset Random Generator!}
- for t:=1000000000 to 1000100000 do if isprime(t) then writeln(t);
- end.
|