Der Euklidische Algorithmus
Der Euklidische Algorithmus dient dazu, den größten gemeinsamen Teiler () zweier natürlicher Zahlen zu ermitteln. Das Ermitteln des findet in der Kryptographie bei vielen Kryptosystemen Anwendung.
Beispiel:
Es soll für zwei natürliche Zahlen und der ermittelt werden.
Formal kann die Ausgangssituation wie folgt beschrieben werden: ( steht hierbei für den Rest der ganzahligen Division).
Beispiel für und :
In der letzten Zeile kann der abgelesen werden (fett gedruckte 3). Die Berechnung des ist abgeschlossen, sobald der Rest (r) den Wert 0 angenommen hat.
Kompakter kann der auch in Form einer Tabelle ermittelt werden:
a | b | r |
285 | 33 | 21 |
33 | 21 | 12 |
21 | 12 | 9 |
12 | 9 | 3 |
9 | 3 | 0 |
Die Spalte b in der letzten Zeile liefert das Ergebnis .
Als Python-Programm lässt sich die Ermittlung des wie folgt implementieren:
def ggt(a ,b):
while b!=0:
a ,b = b, a % b
return a
if __name__ == '__main__':
a = 285
b = 33
print("Ausgabe ggt: ", ggt(a, b))
Der erweiterte Euklidische Algorithmus
Der erweiterte Euklidische Algorithmus wird u. a. dazu verwendet lineare diophantische Gleichungen der Form zu lösen. Vielfache des sind ebenfalls lösbar und können allgemein mit für beschrieben werden.
Beispiel:
Gegeben sei die lineare diophantische Gleichung:
Zuerst wir der Euklidische Algorithmus wie zuvor durchgeführt:
Die Werte werden nun in eine Tabelle übertrage. Diese Tabelle erhält neben den Spalten für und noch zusätzlich die Spalten für die Werte und . Die Spalte r spielt bei der Berechnung von und keine Rolle und kann auch weggelassen werden.
a | b | q | r | x | y |
285 | 81 | 3 | 42 | 2 | |
81 | 42 | 1 | 39 | -1 | |
42 | 39 | 1 | 3 | 1 | |
39 | 13 | 3 | 0 | 0 | |
13 | 0 | 1 | 0 |
Hierbei gilt für die Berechnungen der Werte für die Spalten und :
- in die letzte Zeile wird immer für und eingetragen und
- anschließend wird sich sukzessive Zeile für Zeile nach oben gearbeit, wobei gilt:
Als Lösung für das obige Beispiel gilt demnach:
Probe:
In Python lassen sich die Werte für und sowie der wie folgt ermitteln:
def extgcd(a, b):
x, y, xi, yi = 1, 0, 0, 1
while b!=0:
q=a//b
a, b = b, a-q*b
y, yi = yi, y-q*yi
x, xi = xi, x-q*xi
return a, x, y
if __name__ == '__main__':
print("Werte a, x, y: ", extgcd(285, 81))