From 0f7575215f81d2aacd68e0147a2b44969426e444 Mon Sep 17 00:00:00 2001
From: serr <sc7227484@gmail.com>
Date: Sun, 23 Feb 2025 22:24:59 +0300
Subject: [PATCH] bsgs added

---
 bsgs.py        | 32 ++++++++++++++++++++++++++++++++
 pollard_rho.py | 15 ++++++++-------
 2 files changed, 40 insertions(+), 7 deletions(-)
 create mode 100644 bsgs.py

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