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