Forum: PC-Programmierung rekursion unformung


von rekursiv (Gast)


Lesenswert?

Hallo,

Ich benötige etwas Hilfe und zwar hätte ich gern die Iterative Umformung 
von. Mir ist klar das ich ne schleife reinbauen muss um den 
Rekursionsaufruf wegzubekommen:
1
def inv(a, k):
2
    if k==1:
3
        return 1
4
    m=1<<k    # 2**k
5
    a=a % m
6
    r=inv(a, (k+1)//2)
7
    return (2-a*r) * r % m

: Verschoben durch Moderator
von Keiner N. (nichtgast)


Lesenswert?

Moin,

helfen kann ich dir nicht.

Was macht denn der Algorithmus? Kannst du den Variablen und der Funktion 
mal aussagekräftigere Namen geben?

von rekursion (Gast)


Lesenswert?

Die Funktion findet man hier: montgomery-multiplikation - 
http://www.inf.fh-flensburg.de/lang/algorithmen/arithmetik/montgomery-multiplikation.htm

Diese Funktion bildet das Inverse Element zur Berechnung der montgomery 
multiplikation a*b*2^-k % M

von Yalu X. (yalu) (Moderator)


Lesenswert?

Bspw. so:

1
def inv2(a, k):
2
  k -= 1
3
  r = 1
4
  n = k.bit_length()
5
  while n:
6
    n -= 1
7
    m = 2 << (k >> n)
8
    r = (2 - a * r) * r % m
9
  return r

Die Zeile

1
    a=a % m

im Originalcode ist übrigens überflüssig.

: Bearbeitet durch Moderator
von rekursion (Gast)


Lesenswert?

Yalu, ich weis garnicht wie ich dir danken kann :)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die rekursive Lösung ist IMHO dennoch die elegantere, und ich hatte
einige Mühe, den nichtrekursiven Algorithmus so hinzubiegen, dass er
ähnlich effizient wie der rekursive ist. Auch der Stackverbrauch ist
hier kaum ein Argument gegen die Rekursion, da er nur mit log2(k) bzw.
log2(log2(m)) wächst, angesichts des Speicherverbrauchs von m also
vernachlässigbar ist.

: Bearbeitet durch Moderator
von rekursion (Gast)


Lesenswert?

Vielen Dank Yalu. Für mich ist es nur in der Iterativen Form möglich den 
Algorithmus in Verilog zu übertragen.

von Arc N. (arc)


Lesenswert?

Falls es um Krypto geht, dann sollte man sich u.U. ein paar Paper dazu 
ansehen (u.a. auch auf Wikipedia verlinkt), die auch die 
Seitenkanalresistenz und Fehlersicherheit betrachten u.a.:

The Montgomery Powering Ladder
https://cr.yp.to/bib/2003/joye-ladder.pdf

Efficient and Side-Channel Resistant RSA Implementation for 8-bit AVR 
Microcontrollers
http://www.caad.arch.ethz.ch/noolab/files/external/conferences/IoT2010_proceedings/pdf/WS1/WS1_6.%20seciot2010_submission_12_final_v0.pdf#page=8

von Hans (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.