diff --git a/pollard_rho.py b/pollard_rho.py index 6ddc305..7a4ed76 100644 --- a/pollard_rho.py +++ b/pollard_rho.py @@ -47,7 +47,7 @@ if __name__ == '__main__': N2 = 1191515026104746183243378937330489098579 # ~2.5 часа N3 = 74048093444435937986114388960912781233885985702403356033834092312625704192350369 # слишком большое, не считает - number = N2 + number = N1 fact = rho_pollard(number) print(f"Первые 5 записей:") diff --git a/pollard_rho_minus_1.py b/pollard_rho_minus_1.py new file mode 100644 index 0000000..5fa99ef --- /dev/null +++ b/pollard_rho_minus_1.py @@ -0,0 +1,66 @@ +# (p-1)-алгоритм полларда, реализация _rho_minus_1_pollard из интернета +import time +from math import gcd +from utils import is_prime + +def primes(B): + primes_list = [] + is_prime = [True] * (B + 1) + is_prime[0] = is_prime[1] = False + for p in range(2, B + 1): + if is_prime[p]: + primes_list.append(p) + for i in range(p * p, B + 1, p): + is_prime[i] = False + return primes_list + +def _rho_minus_1_pollard(n, + B_start=100, + B_step=10, B_max=1000000000000): + B = B_start + while B <= B_max: + a = 2 + for p in primes(B): + pp = 1 + while pp * p <= B: + pp *= p + a = pow(a, pp, n) + g = gcd(a - 1, n) + if 1 < g < n: + return g, B + B *= B_step + return None, B_max + +def rho_minus_1_pollard(n): + factors, stack = [], [n] + while stack: + current = stack.pop() + if current == 1: continue + if is_prime(current): + factors.append(current) + continue + + divisor, _ = _rho_minus_1_pollard(current) + if divisor is None: + factors.append(current) + continue + + stack.append(divisor) + stack.append(current // divisor) + + return sorted(factors) + +if __name__ == '__main__': + start_time = time.time() + + N1 = 13611197472111783959 + N2 = 1191515026104746183243378937330489098579 + N3 = 74048093444435937986114388960912781233885985702403356033834092312625704192350369 + + number = N2 + + factors = rho_minus_1_pollard(number) + print(f"Факторизация числа {number}: {factors}") + + elapsed_time = time.time() - start_time + print(f"Общее время работы программы: {elapsed_time} секунд.") \ No newline at end of file diff --git a/pollard_rho_minus_1_slow.py b/pollard_rho_minus_1_slow.py new file mode 100644 index 0000000..51eeeaa --- /dev/null +++ b/pollard_rho_minus_1_slow.py @@ -0,0 +1,68 @@ +# (p-1)-алгоритм полларда, реализация _rho_minus_1_pollard из презентации препода +import time +from math import gcd, log as ln +from utils import is_prime +import random + +def primes(B): + primes_list = [] + is_prime = [True] * (B + 1) + is_prime[0] = is_prime[1] = False + for p in range(2, B + 1): + if is_prime[p]: + primes_list.append(p) + for i in range(p * p, B + 1, p): + is_prime[i] = False + return primes_list + +def _rho_minus_1_pollard(n, + B_start=100, + B_step=10, B_max=1000000000000): + B = B_start + while B <= B_max: + a = random.randint(2, n - 1) + d = gcd(a, n) + if d >= 2: return d + for p in primes(B): + l = int(ln(n)/ln(p)) + a = pow(a, p**l, n) + d = gcd(a-1, n) + if not (d == 1 or d == n): + return d + B *= B_step + + return None + +def rho_minus_1_pollard(n): + factors, stack = [], [n] + while stack: + current = stack.pop() + if current == 1: continue + if is_prime(current): + factors.append(current) + continue + + divisor = _rho_minus_1_pollard(current) + if divisor is None: + factors.append(current) + continue + + stack.append(divisor) + stack.append(current // divisor) + + return sorted(factors) + +if __name__ == '__main__': + start_time = time.time() + + N1 = 13611197472111783959 + N2 = 1191515026104746183243378937330489098579 + N3 = 74048093444435937986114388960912781233885985702403356033834092312625704192350369 + + number = N2 + + factors = rho_minus_1_pollard(number) + print(f"Факторизация числа {number}: {factors}") + + elapsed_time = time.time() - start_time + print(f"Общее время работы программы: {elapsed_time} секунд.") \ No newline at end of file