pollard rho minus 1 logger added

master
serr 2025-02-19 19:40:22 +03:00
parent a155d73cb3
commit 939b11db78
3 changed files with 59 additions and 9 deletions

View File

@ -1,10 +1,10 @@
# p-метод Полладра
import random
import time
from math import gcd
from utils import is_prime
log = []
def logger(i, x, y, gcd):
global log
if len(log) > 10: log = log[:5] + log[-5:]

View File

@ -1,4 +1,4 @@
# (p-1)-алгоритм полларда, реализация _rho_minus_1_pollard из интернета
# (p-1)-алгоритм Полларда, реализация _rho_minus_1_pollard из интернета
import time
from math import gcd
from utils import is_prime
@ -16,7 +16,8 @@ def primes(B):
def _rho_minus_1_pollard(n,
B_start=100,
B_step=10, B_max=1000000000000):
B_step=10,
B_max=100000000):
B = B_start
while B <= B_max:
a = 2
@ -57,7 +58,7 @@ if __name__ == '__main__':
N2 = 1191515026104746183243378937330489098579 # менее половины секунды
N3 = 74048093444435937986114388960912781233885985702403356033834092312625704192350369 # не считается
number = N2
number = N3
factors = rho_minus_1_pollard(number)
print(f"Факторизация числа {number}: {factors}")

View File

@ -1,9 +1,15 @@
# (p-1)-алгоритм полларда, реализация _rho_minus_1_pollard из презентации препода
# (p-1)-алгоритм Полларда, реализация _rho_minus_1_pollard из презентации препода
import time
from math import gcd, log as ln
from utils import is_prime
import random
log = []
def logger(i, p, l, b):
global log
if len(log) > 10: log = log[:5] + log[-5:]
log.append(f'iter = {i}, p_i = {p}, l_i = {l}, B = {b}')
def primes(B):
primes_list = []
is_prime = [True] * (B + 1)
@ -17,8 +23,9 @@ def primes(B):
def _rho_minus_1_pollard(n,
B_start=100,
B_step=10, B_max=1000000000000):
B = B_start
B_step=10,
B_max=100000000):
i, B = 0, B_start
while B <= B_max:
a = random.randint(2, n - 1)
d = gcd(a, n)
@ -26,6 +33,10 @@ def _rho_minus_1_pollard(n,
for p in primes(B):
l = int(ln(n)/ln(p))
a = pow(a, p**l, n)
i += 1
logger(i, p, l, B)
d = gcd(a-1, n)
if not (d == 1 or d == n):
return d
@ -62,7 +73,45 @@ if __name__ == '__main__':
number = N2
factors = rho_minus_1_pollard(number)
print(f"Факторизация числа {number}: {factors}")
print(f"Первые 5 записей:")
for e in log[:5]: print(e)
print(f"Последние 5 записей:")
for e in log[-5:]: print(e)
elapsed_time = time.time() - start_time
print(f"Общее время работы программы: {elapsed_time} секунд.")
print(f"\nФакторизация числа {number}: {factors}")
print(f"Общее время работы программы: {elapsed_time} секунд.")
# ЧИСЛО 1
# Первые 5 записей:
# iter = 1, p_i = 2, l_i = 63, B = 100
# iter = 2, p_i = 3, l_i = 40, B = 100
# iter = 3, p_i = 5, l_i = 27, B = 100
# iter = 4, p_i = 7, l_i = 22, B = 100
# iter = 5, p_i = 11, l_i = 18, B = 100
# Последние 5 записей:
# iter = 21, p_i = 73, l_i = 10, B = 100
# iter = 22, p_i = 79, l_i = 10, B = 100
# iter = 23, p_i = 83, l_i = 9, B = 100
# iter = 24, p_i = 89, l_i = 9, B = 100
# iter = 25, p_i = 97, l_i = 9, B = 100
# Факторизация числа 13611197472111783959: [2978457007, 4569882137]
# Общее время работы программы: 0.0010013580322265625 секунд.
# ЧИСЛО 2
# Первые 5 записей:
# iter = 1, p_i = 2, l_i = 129, B = 100
# iter = 2, p_i = 3, l_i = 81, B = 100
# iter = 3, p_i = 5, l_i = 55, B = 100
# iter = 4, p_i = 7, l_i = 46, B = 100
# iter = 5, p_i = 11, l_i = 37, B = 100
# Последние 5 записей:
# iter = 11010, p_i = 99929, l_i = 7, B = 100000
# iter = 11011, p_i = 99961, l_i = 7, B = 100000
# iter = 11012, p_i = 99971, l_i = 7, B = 100000
# iter = 11013, p_i = 99989, l_i = 7, B = 100000
# iter = 11014, p_i = 99991, l_i = 7, B = 100000
# Факторизация числа 1191515026104746183243378937330489098579: [28078932453784161973, 42434484575433608423]
# Общее время работы программы: 0.29599881172180176 секунд.