pollard rho minus 1 logger added
parent
a155d73cb3
commit
939b11db78
|
@ -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:]
|
||||
|
|
|
@ -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}")
|
||||
|
|
|
@ -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 секунд.
|
Loading…
Reference in New Issue