prime.pas

来自「acm 国家集训队论文,对ACM爱好者很有用」· PAS 代码 · 共 82 行

PAS
82
字号
unit Prime;

interface

  function isPrime(X : Longint) : Boolean;
  function isPrimeQ(X : Longint) : Boolean;
  {
    History :
      Created : Dec. 2004, Weidong Hu
  }

implementation

  function isPrime(X : Longint) : Boolean;
  var
    i : longint;
  begin
    isPrime := false;
    if x < 2 then exit;
    for i := 2 to trunc(sqrt(x)) do
      if x mod i = 0 then
        exit;
    isPrime := true;
  end;

  function getExpMod(base, exp, _mod : longint) : longint;
  var
    tmp : int64;
  begin
    if exp = 0 then getExpMod := 1 else
    begin
      tmp := getExpMod(base, exp shr 1, _mod);
      tmp := tmp * tmp mod _mod;
      if odd(exp) then
        tmp := tmp * base mod _mod;
      getExpMod := tmp;
    end;
  end;

  function isPrimeQ(X : Longint) : Boolean;
  { Rabin-Miller Strong Pseudoprime Test }
  const
    S : array[1..4] of longint = (2, 3, 5, 7{, 11});
  var
    d, m : longint;
    tmp : int64;
    a : longint;
    i : integer;
    OK : boolean;
  begin
    isPrimeQ := false;
    if x < 2 then exit;
    d := X - 1;
    while d and 1 = 0 do
      d := d shr 1;
    for i := Low(S) to High(S) do
    begin
      OK := false;
      a := S[i];
      if a >= X then break;
      tmp := getExpMod(a, d, X);
      if (tmp = 1) or (tmp = x - 1) then OK := true else
      begin
        m := d shl 1;
        while m < X do
        begin
          tmp := tmp * tmp mod x;
          if tmp = x - 1 then
          begin
            OK := true;
            break;
          end;
          m := m shl 1;
        end;
      end;
      if not OK then exit;
    end;
    isPrimeQ := true;
  end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?