• Keine Ergebnisse gefunden

Wir haben in obigen Beispielen bereits in bescheidenem Umfang programmiersprachliche Mittel eingesetzt, um unsere speziellen W¨unsche zu formulieren.

Das Vorhandensein einer voll ausgebauten Programmiersprache, mit der man den Interpre-ter des jeweiligen CAS gut steuern kann, ist ein weiInterpre-teres CharakInterpre-teristikum der Mehrzahl der betrachteten Systeme. Dabei werden alle g¨angigen Sprachkonstrukte einer imperativen Programmiersprache unterst¨utzt und noch um einige Spezifika erweitert, die aus der Natur des symbolischen Rechnens folgen und ¨uber die weiter unter zu sprechen sein wird.

Mit diesem Instrumentarium und dem eingebauten mathematischen Wissen werden CAS so zu einer vollwertigen Probleml¨osungs-Umgebung, in der man neue Fragestellungen und Vermutungen (mathematischer Natur) ausgiebig testen und untersuchen kann. Selbst f¨ur zahlentheoretische Fragestellungen reichen die M¨oglichkeiten dabei weit ¨uber die des Taschenrechners hinaus.

Betrachten wir etwa Aufgaben der Art:

Bestimmen Sie die letzte Ziffer der Zahl2100,

wie sie in Sch¨ulerarbeitsgemeinschaften vor Einf¨uhrung von CAS zum Kennenlernen des Rechnens mit Resten gern gestellt wurden.

Die Originalaufgabe ist f¨ur ein CAS gegen-standslos, da man die ganze Zahl leicht aus-rechnen kann.

2^100;

1267650600228229401496703205376

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen zur Vorlesung 15

Erst im Bereich von Exponenten in der Gr¨oßenordnung 1 000 000 wird der Verbrauch von Rechen-zeit ernsthaft sp¨urbar und die dann ¨uber 300 000-stelligen Zahlen zunehmend un¨ubersichtlich.

Wirkliche Probleme bekommt der Nutzer, wenn er die dem Computer

”angemessene“ Frage nach letzten Ziffern der Zahl 21010 stellt.

Zun¨achst ist zu beachten, dass2^10^10sowohl als(2^10)^10als auch als2^(10^10)verstanden werden kann. Da ^ nicht assoziativ ist, kommt es hier auf die Klammersetzung an. Mit Blick auf die Potenzgesetze ist allein die zweite – die rechtsassoziative – Auslegung sinnvoll, denn es gilt 21010

= 2100. Maple l¨asst solche Ausdr¨ucke ohne Klammern deshalb gar nicht erst zu, Mathematica, Maxima und Sage parsen den Ausdruck 2^10^10 (korrekt) rechtsassoziativ, ReduceundMatlab(falsch) linksassoziativ.

Bei der korrekten Eingabe 2^(10^10) gibt Maplenach endlicher Zeit auf. ¨Ahnlich reagie-ren Mathematica und Sage, w¨ahrend Ma-ximalosrechnet und nur durch einen Interrupt wieder anzuhalten ist.

2^10^10

Error: Overflow/underflow in arithmetical operation

Der urspr¨ungliche Sinn der Aufgabe bestand darin, zu erkennen, dass man zur Berechnung der letzten Ziffer nicht die gesamte Potenz, sondern nur deren Rest (mod 10) berechnen muss und dass Potenzreste 2k (mod 10) ei-ne periodische Folge bilden. Mit eiei-nem CAS kann man den Rechner f¨ur eine wesentlich weitergehende Untersuchung derselben Proble-matik einsetzen. Da dieses in der Lage ist, die erm¨udende Berechnung der Potenzreste zu

¨ubernehmen (nachdem dieser Gegenstand ggf.

gen¨ugend ge¨ubt worden ist), k¨onnen wir nach Regelm¨aßigkeiten f¨ur die Potenzreste f¨ur belie-bige Moduln fragen.

Table[Mod[2^k, 10],{k,1,15}]

{2,4,8,6,2,4,8,6,2,4,8,6,2,4,8}

Table[Mod[2^k, 3],{k,1,15}]

{2,1,2,1,2,1,2,1,2,1,2,1,2,1,2}

Table[Mod[2^k, 11],{k,1,15}]

{2,4,8,5,10,9,7,3,6,1,2,4,8,5,10}

Table[Mod[2^k, 17],{k,1,15}]

{2,4,8,16,15,13,9,1,2,4,8,16,15,13,9}

Diese wenigen Kommandos liefern eine F¨ulle von Material, das uns schnell verschiedene Regel-m¨aßigkeiten vermuten l¨asst, die man dann gezielter experimentell untersuchen kann. So taucht f¨ur primen Modul in der Folge stets eine 1 auf, wonach sich die Potenzreste offensichtlich wiederholen.

Geht man dieser Eigenschaft auf den Grund, so erkennt man die Bedeutung primer Restklassen.

Auch die L¨ange der Folge zwischen dem Auftreten der 1 folgt gewissen Gesetzm¨aßigkeiten, die ihre Verallgemeinerung in elementaren Aussagen ¨uber die Ordnung von Elementen in der Grup-pentheorie finden.

Auch die modifizierte Aufgabe zur Bestimmung letzter Ziffern von 21010 k¨onnen wir nun l¨osen.

Der erste Versuch schl¨agt allerdings fehl: Die Auswertungsregeln der Informatik f¨uhren da-zu, dassvor Auswertung derMod-Funktion die inneren Argumente ausgewertet werden, d. h.

zun¨achst der Versuch unternommen wird, die Potenz vollst¨andig auszurechnen.

Mod[2^10^10, 10^5]

Overflow[]

Wir brauchen statt dessen eine spezielle Po-tenzfunktion, die bereits in den Zwischenrech-nungen die Reste reduziert und damit Zwi-schenergebnisse ¨uberschaubarer Gr¨oße produ-ziert. In Mathematica bzw. Maxima steht daf¨ur die spezielle Funktion PowerMod bzw.

power mod zur Verf¨ugung, die in diesem Fall direkt aufgerufen werden muss.

PowerMod[2,10^10,10^20]

power mod(2,10^10,10^20)

46374549681787109376

Andere CAS verwenden Eingabeinformationen, um nach einer solchen Funktion zu suchen, so dass die Aufgabe in

”nat¨urlicher“ Notation angeschrieben werden kann und der Nutzer nicht nach Funktionsnamen suchen muss, unter denen die spezielle Funktionalit¨at implementiert ist. Ein sol-ches Vorgehen – Aufl¨osung des Funktionsnamens zur Laufzeit nach dem Typ der Aufrufargumente – ist aus dem objektorientierten Programmieren gut bekannt.

Einen solchen Ansatz verfolgt Axiom, das als CAS der dritten Generation funktionale Po-lymorphie (hier der Potenzfunktion) an Hand der Argumenttypen aufl¨osen kann. Die korrek-te Pokorrek-tenzfunktion wird also ausgew¨ahlt, wenn bereits die Zahl 2 als Element vonZ108 erzeugt wird.

++ Axiom

a:IntegerMod(10^8):= 2 a^(10^10)

87109376 Type: IntegerMod(100000000)

Eine ¨ahnliche Notation ist mit Sagem¨oglich. u = Mod(2, 10^20) u^10^10

46374549681787109376

InMapleerreichen wir denselben Effekt ¨uber den inerten Operator &^ (auf solche inerten Funktionen werden wir sp¨ater noch eingehen).

2 &^(10^10) mod 10^20;

46374549681787109376

Wir wollen die auch aus didaktischen Gesichtspunkten interessante M¨oglichkeit, CAS als Pro-bleml¨osungs- und Experimentierumgebung einzusetzen, zur Erforschung von Eigenschaften ganzer Zahlen an einem weiteren Beispiel verdeutlichen:

Definition 1 Eine Zahl n heißt perfekt, wenn sie mit der Summe ihrer echten Teiler ¨ uberein-stimmt, d. h. die Summe aller ihrer Teiler gerade2nergibt.

Die Untersuchung solcher Zahlen kann man bis in die Antike zur¨uckverfolgen. Bereits in der Pythagor¨aischen Schule im 6. Jahrhundert vor Christi werden solche Zahlen betrachtet. Euklid kannte eine Formel, nach der man alle gerade perfekte Zahlen findet, die erstmals von Euler exakt bewiesen wurde.

Wir wollen nun ebenfalls versuchen, uns einen Uberblick ¨¨ uber die perfekten Zahlen zu ver-schaffen. Mathematica kennt eine Funktion DivisorSigma, mit der wir die Teilersumme der nat¨urlichen Zahln berechnen k¨onnen. Mit einer Schleife verschaffen wir uns erst einmal einen ¨Uberblick ¨uber die perfekten Zahlen bis 1000.

For[i=2,i<1000,i++,

If[DivisorSigma[1,i]==2*i,Print[i]]

]

6 28 496

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen zur Vorlesung 17

Betrachten wir die gefundenen Zahlen n¨aher:

6 = 2·3, 28 = 4·7, 496 = 16·31.

Alle diese Zahlen haben die Gestalt 2k−1(2k−1). Wir wollen deshalb versuchen, perfekte Zahlen dieser Gestalt zu finden.

Es ist meist nicht sinnvoll, die Ergebnisse wie oben mit einer Print-Anweisung anzuzeigen, da die entsprechenden Ausdr¨ucke dann zwar auf dem Bildschirm zu sehen sind, jedoch nicht direkt weiter verwendet werden k¨onnnen. Wir wollen die Ergebnisse der folgenden Rechnung deshalb aggregieren und unter einem Bezeichner zum Zweck der weiteren Verwendung speichern.

uhu = Table[ n=2^(k-1)*(2^k-1); {k,n,DivisorSigma[1,n]==2*n}, {k,2,40} ] {{2,6,True},{3,28,True},{4,120,False}, . . . ,{40,604462909806764831539200,False}}

Diese Liste von Listen l¨asst sich nun einfach als Tabelle ausgeben, daMathematicaMatrizen als Listen von Listen speichert und deshalb umgekehrt auch Listen von Listen als Matrizen anzeigen kann.

Die Ausgabe der Ergebnisse der Rechnungen f¨ur Zahlen der Gestalt n = 2k−1(2k −1) bietet umfangreiches experimentelles Material, auf dessen Basis sich qualifizierte Vermutungen ¨uber be-stehende Gesetzm¨aßigkeiten aufstellen lassen. Es scheint insbesondere so, als ob perfekte Zahlen nur f¨ur primekauftreten. Jedoch liefert nicht jede Primzahlk eine perfekte Zahln.

Derartige Beobachtung kann man nun versuchen, mathematisch zu untermauern, was in diesem Fall nur einfache kombinatorische ¨Uberlegungen erfordert: Die Teiler der Zahl n=pa11·. . .·pamm haben offensichtlich genau die Gestaltt=pb11·. . .·pbmm mit 0≤bi ≤ai. Ihre Summe betr¨agt

σ(n) = (1 +p1+. . .+pa11)·. . .·(1 +pm+. . .+pamm).

In der Tat, multipliziert man den Ausdruck aus, so hat man aus jeder Klammer einen Summanden zu nehmen und zu einem Produkt zusammenzuf¨ugen. Alle m¨oglichen Auswahlen ergeben genau die beschriebenen Teiler vonn.

Die Teilersumme σ(n) ergibt sich also unmittelbar aus der Kenntnis der Primfaktorzerlegung der Zahl n. Ist insbesondere n=a·b eine zusammengesetzte Zahl mit zueinander teilerfremden Faktorena, b, so gilt offensichtlichσ(n) =σ(a)·σ(b).

Wenden wir das auf die gerade perfekte Zahl n = 2k−1b (k > 1, b ungerade) an, so gilt wegen σ(2k−1) = 1 + 2 + 22. . .+ 2k−1= 2k−1

2n= 2kb=σ(n) = (2k−1)σ(b).

Also ist 2k −1 ein Teiler von 2kb und als ungerade Zahl damit auch von b. Es gilt folglich b= (2k−1)cund somitσ(b) = 2kc=b+c. DabundcTeiler vonbsind und σ(b)alleTeiler von baufsummiert, hatbnur die Teilerbundc= 1, muss also eine Primzahl sein. Da auch umgekehrt jede solche Zahl eine perfekte Zahl ist haben wir damit folgenden Satz bewiesen:

Satz 1 Jede gerade perfekte Zahl hat die Gestalt n= 2k−1(2k−1), wobei 2k−1 eine Primzahl sein muss.

Ungerade perfekte Zahlen sind bis heute nicht bekannt, ein Beweis, dass es solche Zahlen nicht gibt, ist aber bisher auch nicht gefunden worden.