pollard rho minus 1

master
serr 2025-02-19 19:07:06 +03:00
parent f72181d5b5
commit a7855ee605
3 changed files with 135 additions and 1 deletions

View File

@ -47,7 +47,7 @@ if __name__ == '__main__':
N2 = 1191515026104746183243378937330489098579 # ~2.5 часа
N3 = 74048093444435937986114388960912781233885985702403356033834092312625704192350369 # слишком большое, не считает
number = N2
number = N1
fact = rho_pollard(number)
print(f"Первые 5 записей:")

66
pollard_rho_minus_1.py Normal file
View File

@ -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} секунд.")

View File

@ -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} секунд.")