• Keine Ergebnisse gefunden

3−√

2

Beide Funktionen k¨onnen auch kompliziertere Wurzelausdr¨ucke

”rational machen“ wie etwa radsimp(1/(sqrt(2)+sqrt(3)+sqrt(5)));

−1 12

√ 2√

3√ 5 + 1

6

√ 3 + 1

4

√ 2

Beide CAS haben einen entsprechenden Algorithmen implementiert, der in den anderen Systemen nicht bzw. nicht direkt zur Verf¨ugung steht. Der Grund f¨ur eine solche Designentscheidung liegt darin, dass es aus Effizienzgr¨unden nicht klug ist, Nenner rational zu machen. Wir kommen auf diese Frage sp¨ater zur¨uck.

1.3 CAS als Probleml¨ osungs-Umgebungen

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 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,

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen vom 16. Juli 2012 14

Mathematica, Maxima und Sage parsen den Ausdruck 2^10^10 (korrekt) rechtsassoziativ, ReduceundMuPAD(falsch) linksassoziativ.

Bei der korrekten Eingabe2^(10^10)gibt Mu-PADnach endlicher Zeit auf. ¨Ahnlich reagieren Mathematica, Maple und Sage, w¨ahrend Maximalosrechnet und nur durch einen Inter-rupt 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.

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, dassvorAuswertung der Mod-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]

General::ovfl: Overflow occurred in computation.

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 solches Vorgehen – Aufl¨osung des Funktionsnamens zur Laufzeit dem Typ der Aufrufargumente entsprechend – ist aus dem objektorientierten Programmieren gut bekannt.

Einen solchen Ansatz verfolgt MuPAD, das funktionale Polymorphie (hier der Potenzfunk-tion) an Hand der Argumenttypen aufl¨osen kann. Die korrekte Potenzfunktion wird also ausgew¨ahlt, wenn bereits die Zahl 2 als Rest-klasse erzeugt wird. Eine ¨ahnliche Notation ist mitSagem¨oglich.

/* MuPAD */

R:=Dom::IntegerMod(10^20);

R(2)^(10^10);

46374549681787109376

mod 100000000000000000000

# Sage

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 Summeallerihrer Teiler gerade 2nergibt.

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 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.

H.-G. Gr¨abe: Einf¨uhrung in das symbolische Rechnen, Notizen vom 16. Juli 2012 16

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)c und somitσ(b) = 2kc=b+c. Dab undcTeiler 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.