Реализации алгоритмов/Метод Лемана: различия между версиями
Содержимое удалено Содержимое добавлено
Maxal (обсуждение | вклад) вынесено из 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;