Wie ich in den Kommentaren sagte, die eingebaute pow
Funktion macht bereits schnelle modulare Exponentiation, aber ich denke, es ist eine vernünftige Kodierung Übung, um es selbst zu implementieren.
Ihr Algorithmus ist in der Nähe, aber Sie tun das Falsche. Sie müssen das Quadrat base
, nicht r
, und Sie sollten es nach dem Multiplikationsschritt tun.
def pow_h(base, degree, module):
degree = bin(degree)[2:]
r = 1
for i in range(len(degree) - 1, -1, -1):
r = (r * base ** int(degree[i])) % module
base = (base ** 2) % module
return r
#test
for i in range(16):
print(i, 2**i, pow_h(2, i, 100))
Ausgang
0 1 1
1 2 2
2 4 4
3 8 8
4 16 16
5 32 32
6 64 64
7 128 28
8 256 56
9 512 12
10 1024 24
11 2048 48
12 4096 96
13 8192 92
14 16384 84
15 32768 68
r * base ** int(degree[i])
Verwendung ist ein netter Trick, aber es ist wahrscheinlich effizienter, eine if
Aussage als Potenzierung zu verwenden. Und Sie können Arithmetik verwenden, um die Bits von degree
zu erhalten, anstatt String zu verwenden, obwohl bin
ziemlich effizient ist. Wie auch immer, hier ist meine Version:
add 'print()' in Funktion, um zu sehen, welche Werte Sie erhalten - und mit eigenen Berechnungen auf Papier vergleichen. – furas
FWIW, die eingebaute 'pow'-Funktion akzeptiert einen Modulus als optionales drittes Argument. –