Modulo-Rechnen, Zahlentheorie

Mathematik in wxMaxima www.mathematik-verstehen.de Haftendorn Okt 2010

Hilfen zum Handling
Achtung: Durch Anklicken der linken Zellmarkierung kann man die
Abschnitte und auch einzelne Zellen aufklappen und auch wieder zuklappen.
Dazu Shift halten, dann werden auch alle Unterebenen aufgeklappt.
Endung *.wxmx ist komfortabel. Ist die Endung *.wxm muss man
erst noch alle Ausgaben neu erzeugen. Mit Strg r werden alle aufgeklappten Zellen ausgewertet.
Zum Lernen ist es besser die Zellen einzeln (mit Shift+Enter) auszuwerten.
Werte einzelne Zellen aus mit Shift-Enter.
Auswertung in einem Rutsch: Falte alle Abschnitte auf,
werte alle Zellen mit Strg r aus ( auch Menu Cell Alle Zellen auswerten).

Figure 1: Inhaltsverzeichnis
Result

1 Zahlen, Teilbakkeit, Vielfache

1.1 Ganze Zahlen, Ganzzahlige Division

In der Zahlentheorie kommen nur die Ganzen Zahlen vor.
Dezimalzahlen spielen keine Rolle.
Bei Divisionen interessiert man sich für den ganzzahlichen Anteil und den Rest.

(%i1) 34/7;
divide(34,7);

Result

also 34 geteilt durch 7 ist 4 Ganze Rest 7 (wie in der Grundschule)

(%i3) num(34/7);
denom(34/7);

Result

Zähler (numerator) und Nenner (denominator) kann man aus
Brüchen herausgreifen.

1.2 Primfaktoren und Teiler

(%i5) factor(731);
divisors(731);

Result

(%i7) factor(72);
ifactors(72);
divisors(72);

Result

(%i10) factor(123456789);
Result

Die Zerlegung in Faktoren zeigt die Primfaktoren und ihre Potenzen.
Bei ifactors werden diese als Liste von Primahlen mit ihren Potenzen
ausgegeben. (integer =ganzzahlig)
Die Teiler einer Zahl sind alle Produkte, sich mit diesen Bausteinen
bilden lassen. Z.B. ist 3*3607 Teiler, aber auch 3^2*3803

(%i11) 3*3607; 3^2*3803;
Result

(%i13) divide(123456789,10821); divide(123456789,34227);
Result

Der Rest 0 war also vorherzusehen.

der Befehl divisors(n) zeigt die Teilemenge von n.

(%i15) divisors(3607);
Result

Die Zahlen, die nur sich und die 1 als Teiler haben, heißen Primzahlen.
3607 ist also eine Primzahl.
Achtung: 1 ist keine Primzahl, das ist so definiert.

1.3 Gemeinsame Teiler, ggT

(%i16) divisors(72); divisors(48);
Result

Der größte gemeinsame Teiler ist ersichtlich 24.
Dafür gibt es den Begriff ggT(72,48) in Deutsch und in Eglisch
gcd(72,48) greatest common divisor

(%i18) gcd(72,48);
Result

(%i19) divisors(24);
Result

In dieser Teilermenge sind tatsächlich alle gemeinsamen Elemente von
den obigen beiden Teilermengen und 24 ist die größte unter ihnen.

Es gibt den Euklidischen Algorithmus auch in seiner erweiterten Form

(%i20) gcdex(72,48);
Result

gcdex(a,b) ist so zu lesen: [r,s,gcd] mit r*a+s*b=gcd(a,b)
Also hier

(%i21) 1*72+(-1)*48=24;
Result

Diese "Vielfachsummendarstellung" wird in der Kryptografie sehr wichtig.
An passender Stelle wird dies aufgegriffen.
Achtung andere Software schreibt [gcd,r,s].

1.4 Vielfache und Gemeinsame Vielfache

Die Vielfachenmengen sind naturgemäß unendlich groß.
Hier nehmen wir 10 Elemente. Wir bleiben im Positiven, damit es übersichtlich bleibt.)

(%i22) Z:makelist(i,i,0,10);
Result

Erstmal erzeugen wir und die Grundmenge Z (eigentlich noch mit Negativen)

(%i23) 6*Z;
Result

Das ist die abgekürzte Vielfachenmenge 6 Z als Liste.

(%i24) 8*Z;
Result

Unter den gemeinsamen Elementen von 6Z und 8Z ist 24 das kleinste
kgV(6,8)=24 in Deutsch, in Englisch lcm(6,8) least common multiple

(%i25) lcm(6,8);
Result

2 Die Gruppe Z(m) und das Modulo-Rechnen

2.1 modulo - Begriff, Z(m)

Es kommt hier nur auf die Reste an, die beim ganzzahligen Teilen bleiben.
In mathematischer Schreibweise 34 mod 7 = 6 (lies 34 modulo 7 ist 6)

(%i26) mod(34,7);
Result

Nehmen wir von allen ganzen Zahlen immer nur den Rest modulo 7
so erhalten wir offfenbar eine sehr kleine Menge, sie heißt Z(7)

(%i27) Z;
Result

(%i28) mod(Z,7);
unique(mod(Z,7));

Result

Jetzt nehmen wir negative Zahlen hinzu

(%i30) ZZ: makelist(i,i,-10,20);
Result

(%i31) mod(ZZ,7);
unique(mod(ZZ,7));

Result

unique wirft die Doppelungen weg. Wir definieren also:

(%i33) Z(m__):=unique(mod(ZZ,m__))$

(%i34) Z(3); Z(7); Z(16);
Result

2.2 Rechnen in Z(m)

Mit den Zahlen dieser Menge kann man nun die Grundrechenarten
+,-, *, hoch unbeschränkt ausführen, "geteilt" gehört nicht dazu.
Grundprinzip ist, dass man wie in ganzen Zahlen rechnet und alles modulo m
interpretiert.

(%i37) 11+13;
mod(11+13,16);

Result

(%i39) 11-13;
mod(11-13,16);

Result

Wenn man das selbst rechnen will, zählt man zu der -2 eine 16 hinzu, ist 14.
Oder man denkt 11=27 mod 16 und 27-13 =14

(%i41) mod(11,16); mod(27,16);
Result

Man kann an jeder Stelle des Rechenvorgangs modulo m "herunternbrechen.
Das ist besonders interessant beim Potenzieren

(%i43) mod(3^5,10);
Result

selber: 3^2 =-1 mod 10 , 3^4=(3^2)^2=(-1)^2 mod 10 =1 mod 10;
3^5=1*3 mod 10=3

(%i44) 3^5;
Result

Da sieht man die 3 auch gleich als Rest beim Teilen durch 10.

2.3 Multplikationstafeln von Z(m)

(%i45) /*Definitionen, nach Auwertung wieder zuklappen */
plus(i,j,m):=mod(Z(m)[i]+Z(m)[j],m)$
maal(i,j,m):=mod(Z(m)[i]*Z(m)[j],m)$
plustafel(m):=block(
    array(ma,fixnum,m,m),
    for i:1 thru m do for j:1 thru m do ma[i,j]:plus(i,j,m),
    print("Plus-Tafel modulo ",m),
    genmatrix(ma,m,m)
)$
maltafel(m):=block(
    array(ma,fixnum,m-1,m-1),
    for i:1 thru m-1 do for j:1 thru m-1 do ma[i,j]:maal(i+1,j+1,m),
    print("Mal-Tafel modulo ",m),
    genmatrix(ma,m-1,m-1)
)$

(%i49) m:6;Z(m);Z(m)[3];
Result

(%i52) plustafel(6);
Result

(%i53) maltafel(6);
Result

(%i54) for i:4 thru 11 do print(maltafel(i))$
Result

2.4 Zstern(m) die Gruppe der Teilerfremden

Teilerfremd zu m sind alle Zahlen i mit ggT(m,i)=1

(%i55) /*Definitionen Zstern(m) und malsterntafel(m)*/
Zstern(m):=block([li],
    li:[],
    for i:1 thru m-1 do
        if gcd(m,i)=1 then li:endcons(i,li),
    return(li)
)$
malsterntafel(m):=block([le,Zs,malstern],
    Zs:Zstern(m), le:length(Zs),
    malstern(i,j,m):=(mod(Zs[i]*Zs[j],m)),
    array(ma,fixnum,le,le),
    for i:1 thru le do for j:1 thru le do ma[i,j]:malstern(i,j,m),
    print("Malstern-Tafel modulo ",m),
    genmatrix(ma,le,le)
)$

(%i57) Zstern(20);
Result

Für die Anzahl dieser Teilerfremden gibt es die Eulersche-Phi-Funktion

(%i58) eulerphi(m):=length(Zstern(m))$
eulerphi(20);

Result

(%i60) malsterntafel(20);
Result

(%i61) for i:6 thru 21 do print(malsterntafel(i))$
Result

2.5 Potenztafeln

(%i62) /* Definition potenztafel(m) */
potenztafel(m):=block([le,Zs,hochstern],
    Zs:Zstern(m), le:length(Zs),
    hochstern(i,j,m):=(mod(Zs[j]^i,m)),
    array(ma,fixnum,le,le),
    for i:1 thru le do for j:1 thru le do ma[i,j]:hochstern(i,j,m),
    print("Potenz-Tafel von Zstern modulo ",m),
    print("Zstern(",m,") hat ",le," Elemente"),
    genmatrix(ma,le,le)
)$

(%i63) potenztafel(7);
Result

(%i64) for i:6 thru 21 do print(potenztafel(i))$
Result

(%i65) potenztafel(30);potenztafel(31);
Result

3 Ordnung eines Elementes, Powermod

3.1 Ordnung

Wenn man sich die Potenztafeln ansieht, fällt auf, dass alle
in der letzten Zeile ausschließlich 1 zeigen.
Das passt zu dem Satz der Gruppentheorie:
Element hoch Gruppenordnung =1
Die Gruppenordnung ist die Zahl der Elemente einer Gruppe.
Die Gruppen Zstern(m) haben eulerphi(m) Elemente

(%i67) Zstern(10); eulerphi(10);
Result

(%i69) Zstern(16); eulerphi(16);
Result

Man bildet den Begriff Ordnung eines Elementes:
ord(a)=k genau wenn k die kleinste Zahl mit a^k mod m =1 ist.
In den Potenztafeln ist k die Nummer der Zeile, in der zum ersten Mal
eine Eins in der k-Spalte auftaucht.

(%i71) makelist(mod(7^i,16),i,1,8);
Result

(%i72) makelist(mod(5^i,16),i,1,8);
Result

7 hat also in Zstern(16) die Ordnung 2, 5 hat die Ordnung 4

(%i73) ordo(a,m):=block([p,z],
                    p:a,z:1, while p>1 do (p:mod(a*p,m), z:z+1),
                    return(z)
                   );

Result

(%i74) ordo(13,16);
Result

(%i75) makelist(mod(5^(4*n),16),n,1,10);
Result

Man überlegt leicht, dass 5 hoch eine beliebiges 4-Vielfache
modulo 16 gleich 1 ist. Darum kann man 5^2010 mod 16 im Kopf ausrechnen.
5^2010=5^(2008+2) mod 16 = 5^2 mod 16=25 mod 16=9

(%i76) mod(5^2010,16);
Result

Einweiter Satz der Gruppentheorie ist, dass dieElementordnung die
Gruppenordnung teilen muss. (Begründung bei "Nebenklassen".
Also kommen nur die Teiler von eulerphi als Elementordnungen infrage.

(%i77) potenztafel(18);
Result

5 und 11 haben Ordnung 6, 7 und 13 haben Ordnung 3, 17 hat Ordnung2.

3.2 Powermod

Für die Kryptografie ist es wichtig, dass hohe Potenzen
riesiger Zahlen berechnet werden können.

(%i78) /*Definition von pmod(a.k.m) powermod*/
pmod(a,k,m):=block([x,i,pot],
    i:k, x:1,pot:a,
    marke,
    if mod(i,2)=1 then (x:mod(x*pot,m),
        if i=1 then return(x),
        i:i-1
    ),
    i:i/2,
    pot:mod(pot*pot,m),
    go(marke)
)$

(%i79) pmod(5,3,16);mod(5^3,16);
Result

(%i81) pmod(12345,34567,16);mod(12345^34567,16);
Result

Die letzte Rechnung könnte man mit einem gewöhnlichen Taschenrechner
nicht ausführen. In der Kryptografie haben die Zahlen aber etwa
200 Stellen und nicht 5 wie oben. Dann geht der rechte Befehl auch nicht mehr.

(%i83) primlistebis(n):=([i,li],li:[],for i from 1 thru n do if primep(i) then li:append(li,[i]),li);
Result

(%i84) lll:primlistebis(500);
Result

(%i85) primep(250348280129);
Result

(%i86) makelist(pmod(99,p-1,p),p, primlistebis(500));
Result

(%i87) mod(99^4998,4999);
Result

3.3 Nebenklassen

In einer Gruppe Zstern(m) kann es Elemente geben, deren Potenzen
schon die ganze Gruppe erzeugen, nämlich die Elemente mit maximaler Ordnung.

(%i88) Zstern(18);
Result

(%i89) makelist(mod(5^i,18),i,1,6);
Result

(%i90) pl[13]:makelist(mod(13^i,18),i,1,3);
Result

Die Elemente, die nicht in der Potenzenliste vorkommen, bilden
mit pl[13] echte Nebenklassen g*pl[a]

(%i91) mod(5*pl[13],18);mod(11*pl[13],18); mod(17*pl[13],18);
Result

davon stimmen einige, hier sogar alle, überein.
Das Element der Ordnung 3 hat hier nur 2 Nebenklassen,
[13,7,1] und [5,11,17]
Alle Nebenklassen haben gleichviele Elemente, Anzahl ord(a)
Darum teilt die Elementordnung die Gruppenordnung.

Eulerscher Satz für Gruppen: Die Elemenordnung teilt die Gruppenordnung

(%i94) primep(250348280129);
Result

(%i95) pmod(2,340,341); factor(341);
Result

4 Betrachtungen für n=p q

4.1 Definitionen

4.2 Tafeln

(%i104) tafel(3,5);
Result

(%i105) p:3;q:5;tafel(p,q);modptafel(p,q); modqtafel(p,q);
Result

(%i110) p:5;q:7;tafel(p,q);modptafel(p,q); modqtafel(p,q);
Result

(%i115) p:11;q:13;tafel(p,q);modptafel(p,q); modqtafel(p,q);
Result


Created with wxMaxima.