Restklassenstrukturen

Prof. Dr. Dörte Haftendorn, Mathematik mit MuPAD 4.02, 

(ex. in 2.5 vom Nov.02 und in 3.11 Sept. 05) Feb.07

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

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

Diese Datei verwendet kein PACKAGE

Berechnen der Reste

54 mod 7                //infix-Schreibweise 

math

modp(54,7), _mod(54,7)  // präfix-Schreibweisen

math

Diese Arten arbeiten mit positiven Resten von 0 bis m-1.

Dagegen verwendet mods bei der Ausgabe negative Reste.

mods(i,7) $ i=0..6      // verwendet negative Reste

math

Negative Zahlen bei der Eingabe werden richtig behandelt:

[-33 mod 7 ,modp(-33,7), mods(-33,7)]

math

Stammbrüche bei der Eingabe geben die richtigen Inversen an:

[1/3 mod 7 ,modp(1/3,7), mods(1/3,7)]

math

Beliebige Brüche bei der Eingabe werden richtig behandelt:

[11/3 mod 7 ,modp(11/3,7), mods(11/3,7)];

[11*(5 mod 7) mod 7, modp(11/3,7)*modp(3/11,7) mod 7 ];

math

math

Plustafeln und Maltafeln der Restklassen-Struktur    ###############

Sie werden hier als Funktionen des Moduls definiert.

m:=7:

plustafel:=m->array(1..m,1..m, [[i+j mod m $ i=0..m-1 ] $ j=0..m-1]):

maltafel:=m->array(1..m-1,1..m-1, [[i*j mod m $ i=1..m-1 ] $ j=1..m-1]):

plustafel(m),maltafel(m);

math

plustafel(6), maltafel(6)

math

plustafel(5), maltafel(5)

math

Rechnen mit Restklassen.

a:=76:b:=40:m:=7:

print(a,b,a+b,a mod m, b mod m);

print("((a mod m)+ (b mod m)) mod m) =?= ((a+b) mod m )");

print("".(((a mod m)+ (b mod m)) mod m)." =?= ".((a+b) mod m ));

76, 40, 116, 6, 5

"((a mod m)+ (b mod m)) mod m) =?= ((a+b) mod m )"

"4 =?= 4"

 

Mit zufälligen Zahlen immer wieder ansehen.

w:=random(1..1000):v:=random(1..1000):a:=w():b:=v():

print(a,b,a+b,a mod m, b mod m, (a mod m)+ (b mod m) mod m, " =?= ", (a+b) mod m )

769, 922, 1691, 6, 5, 4, " =?= ", 4

 

w:=random(1..1000):v:=random(1..1000):a:=w():b:=v():

print(a,b,a*b,a mod m, b mod m, ((a mod m)*(b mod m)) mod m, " =?= ", (a*b) mod m )

410, 656, 268960, 4, 5, 6, " =?= ", 6

 

w:=random(1..1000):v:=random(1..1000):vv:=random(1..100):a:=w():b:=v():m:=vv():

print(m,a,b,a*b,a mod m, b mod m, (a mod m)*(b mod m) mod m, " =?= ", (a*b) mod m)

61, 164, 458, 75112, 42, 31, 21, " =?= ", 21

 

Merke: Die Modulofunktion ist ein Homomorphismus,

eine strukturerhaltende Abbildung

Es ist also egal, an welcher Stellen der Ausrechnung man zu

der Resten übergeht.

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

Erweitertes Arbeiten in Restklassenstrukturen

powermod(13,187,111); // 123 hoch 111 modulo 187

math

po:=13^111

math

modp(po,187)

math

powermod(13,111,187);

math

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

Bestimmung der Inversen

a:=541: m:=631: isprime(631)

math

Für in MuPAD funktioniert einfach

1/541 mod 631

math

Probe:

7*541 mod 631

math

Das aber muss geschickt programmiert sein.

Der Von-Hand-Algorithmus verwendet den erweiterten euklidischen Algorithmus,

dessen Ergebnis auch von MuPAD bescafft wird:

a:=541;m:=631; ggt:=igcdex(a,m);

math

math

math

s:=ggt[2]:t:=ggt[3]:gt:=ggt[1]:sa:=s*a:tm:=t*m:satm:=s*a+t*m;

math

Die Vielfachsummen-Darstellung (VSD, siehe auch Datei teiler-prim.mn) ist also

ggt(a,m)=s*a+t*m:

"ggt =".gt." = (".s.")*".a."+(".t.")*".m

math

"(".s.")*".a."+(".t.")*".m."=".sa."+(".tm.")=".satm." ist gleich ggt= ".gt

math

s ist invers zu a modulo m

bzw, falls s negativ, dann nimm s+m,

bzw kann man in MuPAD einfach die positive-Modulfunktion nehmen

s:=modp(s,m)

math

s*a mod m

math

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

Prime Restklassen-Gruppe Z*(a)

zstern:=proc(a)

        local i,s;

        begin

          s:=[1];

          for i from 2 to a-1 do

            if gcd(a,i)=1 then

               s:=append(s,i);

            end_if;

          end_for;

          return(s);

        end_proc:

zstern(12)

math

Definition einer eigenen Prozedur, verwendet im TI92/Voyage

eulerphi:=proc(a)

          begin nops(zstern(a)) end_proc:

eulerphi(12)

math

[numlib::phi(a), eulerphi(a)] $ a=54..64

math

 

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

Ordnung der Elemente

a sei Element einer endlichen Gruppe.

Der minimale Exponent k, der a^k=1 erzeugt heißt "Ordnung von a"

a:=i:m:=18:zstern(m);eulerphi(m);

[a,numlib::order(a,m)] $a in zstern(m)

math

math

math

Satz: Die Ordnung jedes Gruppenelementes teilt die Gruppenordnung.

26^2 mod 27 //kleine Probe

math

Definition einer eigenen Prozedur, verwendet im TI92/Voyage

ordo:=proc(a,m)

       local ordnung, pot;

       begin

         ordnung:=1: pot:=modp(a,m):

         if gcd(a,m)>1 then return("".a." nicht teilerfremd zu ".m); end_if;

         while pot>1 do

           pot:=modp(pot*a,m): ordnung:=ordnung+1

         end_while;

         if pot=1 then return( ordnung); end_if;

       end_proc:     

ordo(2,27)

math

ordo(2,26)

math

m:=11:eulerphi(m);[a,numlib::order(a,m),ordo(a,m)] $a in zstern(m)

math

math

m:=12:zstern(m);ph:=eulerphi(m);

math

math

maltafel_m_stern:=array(1..ph,1..ph, [[i*j mod m $ i in zstern(m) ] $ j in zstern(m)]):

maltafel_m_stern

math

 

potenzTafelListe:=proc(liste,m,n)

               local i,k;

               begin

                 print(liste, " Potenzen modulo ".m);

                 matrix([i $ i=1..n]),

                 matrix([[k^i mod m $ k in liste] $ i=1..n]);

               end_proc:

potenzTafelListe([3,7,9],10,8)

[3, 7, 9], " Potenzen modulo 10"

math

Man kann die zstern direkt einsetzen:

m:=15:

potenzTafelListe(zstern(m),m,nops(zstern(m)))

[1, 2, 4, 7, 8, 11, 13, 14], " Potenzen modulo 15"

math

 

 

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

Potenzieren im Modul   (Entwicklung mit Erklärung auf eigener Seite)

powermod(17,4,120), modp(17^4,120)

math

Definition einer eigenen Prozedur, verwendet im TI92/Voyage

pmod:=proc(a,k,m)

        local x_,h_,k_;

        begin

          k_:=k: x_:=1:pot:=a:

          repeat

            if modp(k_,2)=1 then

              x_:= modp(x_*pot,m):

              if k_=1 then return(x_):exit:end_if:

              k_:=k_-1:

            end_if:

            k_:=k_/2:

            pot:=modp(pot*pot,m):

           until 3=1 end_repeat:

         end_proc:

           

a:=5:m:=7:[pmod(a,k,m),powermod(a,k,m)] $k=1..12

math

a:=17:m:=120:[pmod(a,k,m),powermod(a,k,m)] $k=90..96

math