ggtex    erweiterter Euklidischer Algoritmus mit Textausgabe

Programmierung mit MuPAD Die Prozeduren sind dann in dem package  zahltheo verborgen.

Prof. Dr. Dörte Haftendorn, Mathematik mit MuPAD 4.02, (ursprünglich 02 ex. in 3.11 Sept. 05) Feb.07

http://haftendorn.uni-lueneburg.de             www.mathematik-verstehen.de

####################################################################

Aufruf: ggtex(a,b)

ggtex:=proc(a,b)

           local r0,r1,r2,q0,s0,s1,s2,t0,t1,t2;

           begin

              r0:=a:  r1:=b: q0:=a div b: s0:=1: s1:=0: t0:=0: t1:=1:

              repeat

                r2:=r0 mod r1:   

                if r2=0 then

                  print(Unquoted,"ggT(".a.",".b.")= ".r1.

                  "       VSD  ".r1."= ".s1."*".a."+ (".t1.")*".b);

                  return([r1,s1,t1]);

                end_if;

                q0:= r0 div r1: s2:=s0-q0*s1:  t2:=t0-q0*t1:

                print(Unquoted,

" ".r0."=".q0."*".r1."+".r2." und es ist  VSD  ".r2."= ".s2."*".a."+ (".t2.")*".b);

                r0:=r1:   r1:=r2: s0:=s1:  t0:=t1:  s1:=s2:   t1:=t2:

                /*alle eine Nummer herunterzählen */

              until 3=5 end_repeat;

           end_proc:

                           

              

gg:=ggtex(676,18)

 

        676=37*18+10 und es ist  VSD  10= 1*676+ (-37)*18

 

          18=1*10+8 und es ist  VSD  8= -1*676+ (38)*18

 

          10=1*8+2 und es ist  VSD  2= 2*676+ (-75)*18

 

          ggT(676,18)= 2       VSD  2= 2*676+ (-75)*18

   image

 

Herausgreifen der wichtigen Zahlen

gg[1],gg[2],gg[3]

   image

 

Untensteht eine  Extra-Funktion für ggT.

Ablaufverfolgung um die Prozedur zu entwickeln und zu testen.

 

delete a,b,r0,r1,r2,q0,q1,s0,s1,s2,t0,t1,t2;

[r0,r1,r2,q0,s0,s1,s2,t0,t1,t2] ;     

   image

   image

 

a:=676:b:=18:

 

 

r0:=a:  r1:=b: q0:=a div b: s0:=1: s1:=0: t0:=0: t1:=1:

[r0,r1,r2,q0,s0,s1,s2,t0,t1,t2];

 

             

   image

 

---------Marke 1--------------- ab hier wiederholt auswerten --------------------------------------------

r2:=r0 mod r1:   

                if r2=0 then

                  print(Unquoted,"ggT(".a.",".b.")= ".r1.

                  "       VSD  ".r1."= ".s1."*".a."+ (".t1.")*".b);

                  return([r1,s1,t1]);

                end_if;

 

 

          ggT(676,18)= 2       VSD  2= 2*676+ (-75)*18

   image

 

Aufhören, wenn hier der  hier der ggT erscheint.

q0:= r0 div r1: s2:=s0-q0*s1:  t2:=t0-q0*t1:

                print(Unquoted,

" ".r0."=".q0."*".r1."+".r2." und es ist  VSD  ".r2."= ".s2."*".a."+ (".t2.")*".b);

 

 

          10=1*8+2 und es ist  VSD  2= 2*676+ (-75)*18

   image

 

[r0,r1,r2,q0,s0,s1,s2,t0,t1,t2];

   image

 

r0:=r1:   r1:=r2: s0:=s1:  t0:=t1:  s1:=s2:   t1:=t2:

[r0,r1,r2,q0,s0,s1,s2,t0,t1,t2];            

           /*alle eine Nummer herunterzählen */

            

 

   image

 

-------gehe zu Marke 1    ab hier zurück  ---------------------------------------------------

 

Variante ohne die Textausgabe

ggte:=proc(a: Type::Integer,b:Type::Integer)

           local r0,r1,r2,q0,q1,s0,s1,s2,t0,t1,t2;

           begin

              r0:=a:  r1:=b: q0:=a div b: s0:=1: s1:=0: t0:=0: t1:=1:

              repeat

                r2:=r0 mod r1:   

                if r2=0 then

                  return([r1,s1,t1]);

                end_if;

                q0:= r0 div r1: s2:=s0-q0*s1:  t2:=t0-q0*t1:

                  r0:=r1:   r1:=r2: s0:=s1:  t0:=t1:  s1:=s2:   t1:=t2:

                /*alle eine Nummer herunterzählen */

              until 3=5 end_repeat;

           end_proc:

 

ggte(676,18)

   image

 

Variante nur ggt

ggt:=proc(a: Type::Integer,b:Type::Integer)

           local r0,r1,r2,q0,q1;

           begin

              r0:=a:  r1:=b:

              repeat

                r2:=r0 mod r1: 

                if r2=0 then  return(r1)

                  end_if;

                q0:= r0 div r1:

                q1:= r1 div r2:

                r0:=r1:   r1:=r2: q0:=q1:

                /*alle eine Nummer herunterzählen */

              until r2=0 end_repeat;

           end_proc:

 

ggt(676,115)

   image

 

WeitereTests, Vergeich mit eingebauten Funktionen

a:=676: b:= 37: ggt(a,b), gcd(a,b),ggte(a,b), igcdex(a,b);

   image

 

ggtex(a,b)

 

        676=18*37+10 und es ist  VSD  10= 1*676+ (-18)*37

 

          37=3*10+7 und es ist  VSD  7= -3*676+ (55)*37

 

          10=1*7+3 und es ist  VSD  3= 4*676+ (-73)*37

 

          7=2*3+1 und es ist  VSD  1= -11*676+ (201)*37

 

         ggT(676,37)= 1       VSD  1= -11*676+ (201)*37

   image

 

a:=666: b:= 37: ggt(a,b), gcd(a,b),ggte(a,b), igcdex(a,b),ggtex(a,b);

 

          ggT(666,37)= 37       VSD  37= 0*666+ (1)*37

   image

 

Also der größte gemeinsame Teiler ist von MuPAD direkt zu erreichen mit  

gcd(a,b)    greates common divisor 

Der erweiterte Euklidische Algorithmus wird von

igcdex(a,b)  integer gcd extended   ausgeführt. Ausgegeben wird eine Folge 

a:=676:b:=37:     ig:=igcdex(a,b)

   image

 

Probe

-11*676+201*37

   image

 

ig[1]=ig[2]*a+ig[3]*b  // Automatisch

   image

 

gg:=ggtex(a,b)

 

        676=18*37+10 und es ist  VSD  10= 1*676+ (-18)*37

 

          37=3*10+7 und es ist  VSD  7= -3*676+ (55)*37

 

          10=1*7+3 und es ist  VSD  3= 4*676+ (-73)*37

 

          7=2*3+1 und es ist  VSD  1= -11*676+ (201)*37

 

         ggT(676,37)= 1       VSD  1= -11*676+ (201)*37

   image

 

gg[1]=gg[2]*a+gg[3]*b  // Automatisch

   image