diff --git a/bsgs.py b/bsgs.py new file mode 100644 index 0000000..3539eec --- /dev/null +++ b/bsgs.py @@ -0,0 +1,32 @@ +# Алгоритм Гельфонда-Шенкса дискретного логарифмирования (baby-step giant-step algoritm) + +def order(a, p): + """Возвращает порядок числа a по модулю числа p""" + i, x = 1, 0 + while x != 1: + x, i = pow(a, i, p), i + 1 + return i - 1 + +def gelfond(a, b, p, q=None): + if q == None: q = order(a, p) + s = (int)(q**.5) + 1 + d = pow(a, p - 1 - s, p) + + #print(f"q = {q}, s = {s}, d = {d}") + + base = [] + for i in range(0, s): + base.append(b % p * pow(d, i , p) % p) + + #print(base) + + for i in range(0, s): + try: + x = s*base.index(pow(a, i, p))+i + #print(f"x≡{x}mod({q})") + return x + except: + pass + +if __name__ == "__main__": + print(gelfond(2, 7123, 1123)) \ No newline at end of file diff --git a/pollard_rho.py b/pollard_rho.py index 61c26da..4a379d7 100644 --- a/pollard_rho.py +++ b/pollard_rho.py @@ -49,18 +49,19 @@ def pollard_rho(a, b, p, ord=None): log_c, log_d = [1, 1], [1, 1] while True: - #start_time = time.perf_counter() + # start_time = time.perf_counter() c = f(c, a, b, p, log_c) d = f(f(d, a, b, p, log_d), a, b, p, log_d) - #end_time = time.perf_counter() - #print(f"Время выполнения итерации: {end_time - start_time:.10f}") + # end_time = time.perf_counter() + # print(f"Время выполнения итерации: {end_time - start_time:.10f}") # print(c, d, log_c, log_d) if c == d: break if ord == None: ord = order(a, p) - #print(f"{log_c[0]}+{log_c[1]}x≡{log_d[0]}+{log_d[1]}x(mod{ord})") - #print(f"{log_c[1]-log_d[1]}x≡{log_d[0]-log_c[0]}(mod{ord})") + # print(f"{log_c[0]}+{log_c[1]}x≡{log_d[0]}+{log_d[1]}x(mod{ord})") + # print(f"{log_c[1]-log_d[1]}x≡{log_d[0]-log_c[0]}(mod{ord})") return solve(log_c[1]-log_d[1], log_d[0]-log_c[0], ord) -print(pollard_rho(2, 7, 137)) -# print(pollard_rho(2,11,50091285122438801159, ord=25045642561219400579)) \ No newline at end of file +if __name__ == "__main__": + print(pollard_rho(2, 7123, 1123)) + # print(pollard_rho(2,11,50091285122438801159, ord=25045642561219400579)) \ No newline at end of file