pollard rho minus 1
parent
f72181d5b5
commit
a7855ee605
|
@ -47,7 +47,7 @@ if __name__ == '__main__':
|
|||
N2 = 1191515026104746183243378937330489098579 # ~2.5 часа
|
||||
N3 = 74048093444435937986114388960912781233885985702403356033834092312625704192350369 # слишком большое, не считает
|
||||
|
||||
number = N2
|
||||
number = N1
|
||||
|
||||
fact = rho_pollard(number)
|
||||
print(f"Первые 5 записей:")
|
||||
|
|
|
@ -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} секунд.")
|
|
@ -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} секунд.")
|
Loading…
Reference in New Issue