Реализации алгоритмов/Метод Лемана: различия между версиями

Содержимое удалено Содержимое добавлено
вынесено из w:Метод Лемана
(нет различий)

Версия от 13:41, 11 февраля 2011

Delphi[источник?]

{ Если N является простым, функция вернет -1 }
function GetLehmanFactor(N: Integer): Integer;
var
  I, k, d, A, B, t, dd: Integer;
begin
  Result := -1;

  { Проверка делителей до n^(1/3) }
  for I := 2 to Trunc(Power(N, 1/3)) do
    if N mod I = 0 then begin
      Result := I;
      exit;
    end;

  for k := 1 to Trunc(Power(N, 1/3)) do
    for d := 0 to Trunc( Power(N, 1/6) / (4 * Sqrt(k)) ) + 1 do begin
      A := Trunc(Sqrt(4*k*N)) + d;
      t := Sqr(A) - 4*k*N;

      if t < 0 then
        continue;

      B := Trunc(Sqrt(t));
      if Sqr(B) = t then begin
        ASSERT( (A+B)*(A-B) mod N = 0 );    { Всегда выполняется }

        dd := GCD(A-B, N);

        if (1 < dd) and (dd < N) then begin
          Result := dd;
          exit;
        end;
      end;
    end;
end;