HSG

Aktuelle Seite: HSG/Fächer/Informatik/Material/Grundlagen/Algorithmus

Lemma von Bachet (DIFF,CM1,S.30)

Für je zwei natürliche Zahlen a und b gibt es ganze Zahlen x und y mit ggT(a,b)=x*a+y*b.

Beispiel

0 1
1001=4*203+189 1 -4 189=1*1001-4*203
203=1*189 +14 0-1*1= -1 1-1*-4=5 14=-1*1001+5*203
189=13*14 +7 1-13*(-1)= 14 -4-13*5= -69 7=14*1001-69*203
14=2*7+ 0

Der Algorithmus erweitert den gewöhnlichen Algorithmus von Euklid um die Berechnung der Koeffizienten xi und yi zur Darstellung des jeweiligen Restes. Dabei gelten die rekursiven Gleichungen xi = xi-2-ci*xi-1 und yi = yi-2-ci*yi-1. Die xi-1 bzw. xi-2 (yi-1 bzw. yi-2) findet man dabei in der gleichen Spalte 1 oder 2 Zeilen darüber, ci ist der ganzzahlige Quotient in der gleichen Zeile im Euklid-Schema. Wenn man will, so kann man - wie oben in der letzten Spalte geschehen - die Darstellung der Reste fortlaufend kontrollieren.

weiteres Beispiel

0 1
1970=1*1066+904 1 -1 904=1*1970-1*1066
1066=1*904+162 0-1*1= -1 1-1*(-1)= 2 162=-1*1970+2*1066
904=5*162+94 1-5*(-1)= 6 -1-5*2= -11 94=6*1970-11*1066
162=1*94+68 -1-1*6= -7 2-1*(-11)= 13 68=-7*1970+13*1066
94=1*68+26 6-1*(-7)= 13 -11-1*13= -24 26=13*1970-24*1066
68=2*26+16 -7-2*13= -33 13-2*(-24)= 61 16=-33*1970+61*1066
26=1*16+10 13-1*(-33)= 46 -24-1*61= -85 10=46*1970-85*1066
16=1*10+6 -33-1*46= -79 61-1*(-85)= 146 6=-79*1970+146*1066
10=1*6+4 46-1*(-79)= 125 -85-1*146= -231 4=125*1970-231*1066
6=1*4+2 -79-1*125= -204 146-1*(-231)= 377 2=-204*1970+377*1066
4=2*2+ 0

Delphi-Programm

GUI zu Bachet Bachet.zip
// DIFF CM1 Algorithmen der elementaren Zahlentheorie, S.32
  procedure Bachet(a,b : integer; var g,x,y : integer);
  var
    bg,bu,cg,cu,xg,xu,yg,yu : integer;
  begin
    bg := a; cg := 0; xg := 1; yg := 0;
    bu := b; cu := a div b; xu := 0; yu := 1;
    while (bg <> 0) and (bu <> 0) do
    begin
      xg := xg-cu*xu; yg := yg-cu*yu; bg := bg mod bu;
      if bg = 0
      then
      begin
        g := bu; x := xu; y := yu;
      end
      else
      begin
        cg := bu div bg; xu := xu-cg*xg;
        yu := yu-cg*yg; bu := bu mod bg;
      end;
      if bu = 0
      then
      begin
        g := bg; x := xg; y := yg;
      end
      else
        cu := bg div bu;
    end;
  end;