Also ich versuche, den Baby Step Giant Step-Algorithmus zur Berechnung diskreter Protokolle zu implementieren. Unten ist mein Code:Baby Schritt Giant Schritt Algorithmus für diskrete Log: falsche Giant Schritt
# trying to solve 8576 = 3^x (mod 53047)
p = 53047
a = 3
B = 8576
m = int(math.ceil(math.sqrt(p-1)))
baby = []
giant = []
for j in range(0,m-1):
baby.append((a**j)%p)
for k in range(0,m-1):
val = a**(-1)%p
val2 = val**(k*m)%p
giant.append((B*val2)%p)
for i in xrange(len(baby)):
if giant[k] == baby[k]:
x = j + m*k
Ich denke, es ist etwas falsch mit meinem riesigen Schritt ist, weil ich bin sehr kleine Werte als Ausgänge und keine Streichhölzer zu bekommen. Die richtige Antwort lautet x = 1234. Kann mir jemand sagen, was ich falsch mache?
Sie * wirklich * sollte verwenden 'pow (a, j, p)' und nicht '(a ** j)% p' - was riskiert Überlauf und ist sonst schrecklich ineffizient –
Ihre" riesigen "Schritte sind eigentlich winzige Schritte. Ich bin nicht vertraut mit dieser Methode, aber es scheint seltsam ... 'a ** (- 1)% p 'wird immer' 1/a ', und dann erhöhen Sie' 1/a' zu einem großen power, und dann mod p wieder, aber du nimmst eine infinitesimale Zahl mod p, was sinnlos ist. Versuchen Sie das * inverse * von a, mod p zu berechnen? – gariepy