MATHEMATIK PROGRAMMIEREN MIT PYTHON Univ.–Prof. Dr. Stefan Müller-Stach AG Zahlentheorie 27. September 2006 JOGU Mainz PYTHON: Möglichkeiten einer Programmiersprache PYTHON: Objektorientierte Sprache von Guido van Rossum [1] benannt nach der MONTY PYTHON Truppe Genutzt für Content Management Systeme wie PLONE/ZOPE und auch GOOGLE et.al. leicht erlernbar, geeignet für Mathematik (longint) Plattformunabhängig (läuft auf Win, Mac, Linux etc.) Kostenlos erhältlich, siehe http://python.org JOGU Mainz Starten von PYTHON Man startet das Programm mit Hilfe einer Konsole, am besten sogar eine interaktive Version wie z.B. IPYTHON. In folgender Beispielsitzung wird die Mathematik–Bibliothek math geladen: >>> import math >>> math.pi 3.1415926535897931 >>> math.e 2.7182818284590451 >>> 2**5 32 >>> math.cos(2*math.pi) 1.0 JOGU Mainz >>> 221 % 17 0 >>> 4/3 (oder besser 4//3) 1 >>> from future import division >>> 4/3 1.33333333333 >>> 2**190 1569275433846670190958947355801916604025588861116008628224L >>> numbers=[i for i in range(1,8)] >>> numbers [1,2,3,4,5,6,7] >>> [2**n for n in numbers] [2,4,8,16,32,64,128] >>> [x for x in range(-10,10) if (x**4-13*x**2+36==0)] [-3, -2, 2, 3] JOGU Mainz Beispiel 1: Der ggT Man kann kleine Programme wie hier den größten gemeinsamen Teiler von zwei ganzen Zahlen auch selbst auf der Konsole programmieren: >>> def ggt(a,b): >>> while b: >>> a,b=b,a%b >>> return a JOGU Mainz Etwas allgemeiner kann man den erweiterten Euklidischen Algorithmus programmieren, der auch noch eine Linearkombination xa + yb = ggt(a, b) ausgibt: >>> def xggt(a,b): >>> x1,x2,y1,y2=1,0,0,1 >>> while b: >>> q=a//b >>> x1,x2,y1,y2=x2,x1-q*x2,y2,y1-q*y2 >>> a,b=b,a%b >>> return a,x1,y1 JOGU Mainz Beispiel 2: Primzahlen Mit PYTHON kann man auch Programme in Dateien schreiben und ausführen lassen. Schreiben Sie folgendes Programm in eine Datei z.B. mit dem Namen primzahltest.py: from math import sqrt def isprime(n): if n % 2 == 0 and not n == 2: return (0) else: limit = int(sqrt(n)) + 1 for l in range(3, limit, 2): if n % l == 0: return (0) return (1) JOGU Mainz Jetzt kann man diese Datei laden und neu definierte Kommando isprime benutzen: >>> from primzahltest import isprime >>> [i for i in range(1,30) if isprime(i)] 2,3,5,7,11,13,17,19,23,29 JOGU Mainz Beispiel 3: Fibonacci Zahlen def fibonacci(n): a,b = 0,1 list=[1,1] for x in range(1,n-1): a,b=b,a+b list.append(a+b) return list Das Kommando fibonacci(7) produziert nun die Liste der ersten sieben Fibonaccizahlen [1,1,2,3,5,8,13]. JOGU Mainz Beispiel 4: Fakultät Rekursive Programmierung: def factorial(n): assert n>=0, "n nicht negativ!" if n=1: return 1 else: return n*factorial(n-1) Das Kommando factorial(5) ergibt das korrekte Ergebnis 5! = 120. JOGU Mainz Beispiel 5: Binomialkoeffizenten Die Binomialkoeffizienten im Pascalschen Dreieck auf und tauchen n! ∈ N. sind definiert durch kn := k!(n−k)! = n(n−1)···(n−k+1) 1·2···k def binomial(n,k): out=1 for i in range(1,k+1): out = (out*(n-i+1))//i return out Das Kommando binomial(5,3) ergibt das korrekte Ergebnis 10. JOGU Mainz Beispiel 6: Mersenne Primzahlen und Lucas–Lehmer Test Der Lucas–Lehmer Test untersucht ob n = 2p − 1 mit p prim eine (Mersenne) Primzahl ist, die größten bekannten Primzahlen, z.B. derzeit die Zahl 232.582.657 − 1 mit über 9.8 Mio. Ziffern [6]. Dazu konstruiert man rekursiv eine Folge sn mit s1 = 4 und sn+1 = sn2 − 2 und testet, ob sp−1 durch n teilbar ist: def lucas(p): s=4 val=pow(2,p)-1 for i in range(3,p+1): s=(s*s-2)%val return not s Die ersten fünf Mersenne–Primzahlen sind 22 − 1 = 3, 23 − 1 = 7, 25 − 1 = 31, 27 − 1 = 127 und 213 − 1 = 8191. JOGU Mainz Beispiel 7: Sierpinski Grafik 1 1 1 1 1 1 1 3 5 7 9 .. . 1 5 13 25 41 .. . 1 7 25 63 129 .. . 1 9 41 129 321 .. . 1 ··· ··· ··· ··· Bild wird durch PYTHON Imaging Library als JPEG–Bild erzeugt. JOGU Mainz PYTHON MATH LAB PYTHON MATH LAB [3] ist eine Webseite, die zum Ziel hat, Mathematik mit PYTHON zu unterstützen. Dort findet man Bibliotheken für viele mathematische Teilgebiete, wie z.B. Zahlentheorie, Geometrie, Kryptographie, Numerische Analysis. Ebenso findet man dort PYTHON–Programme, die auf Smartphones laufen (siehe unten). JOGU Mainz SAGE SAGE [5] ist ein auf PYTHON aufgebautes freies und kostenloses CAS. Es enthält u.a. NTL, MWRANK, NUMERIC, SINGULAR, MAXIMA, GAP und PARI/GP. sage: 2/3 2/3 sage: 2//3 0 sage: parent( ) Rational Field sage: factor(232 + 1) 641 * 6700417 In der letzten Zeile sieht man, dass die 5–te Fermatzahl 232 + 1 nicht prim ist. JOGU Mainz NZMATH NZMATH [7] ist ein eng auf die Zahlentheorie fokussiertes und in PYTHON geschriebenes CAS. Im Gegensatz zu SAGE sind alle Algorithmen ausschließlich in PYTHON implementiert und bilden damit ein Lehrbeispiel für die Programmierung in PYTHON. JOGU Mainz NOKIA PYTHON für Series 60 Series 60 Telefone besitzen ein SYMBIAN Betriebssystem, für das eine Opensource PYTHON Implementation von NOKIA existiert [2]. Features: 2D Grafik, Bildbetrachtung Kamera, Kalender und Kontaktdatenbankzugang Soundaufnahme und Playback Zugang zu Systeminformation (e.g. GSM Location) Telefon und SMS-Nutzung GPRS, Webserver und Bluetooth Applikationen Standalone Programme herstellbar Aktives Developer Forum [2] JOGU Mainz Mathematik auf dem Telefon Das kleine in PYTHON geschriebene CAS mathlab.py läuft auf Serie 60 Mobiltelefonen und löst viele kleine mathematische Probleme der Zahlentheorie [3]. Features: Elementare Zahlentheorie Algebraische Zahlentheorie (Klassenzahlen) Rationale Zahlen, Vektoren, Matrizen, Gleichungen Taschenrechnerfunktionen Elementare Kombinatorik Eine Weiterentwicklung ist geplant. Götz Schwandtner vom Institut für Informatik in Mainz hat z.B. einen spigot–Algorithmus zur Berechnung beliebig vieler Ziffern von π und e implementiert [13]. JOGU Mainz Screenshots JOGU Mainz Andere PYTHON–Mathematik Links In der numerischen Mathematik (Scientific Computing) werden oft extrem große Matrizen benutzt und manipuliert. Dazu gibt die Bibliothek NUMPY [4] (früher NUMERIC oder NUMARRAY). Weitere Links: Kombinatorische Mathematik ALADIM [8], MATHGUIDE [9] (weiteres CAS), Kryptographische Tools PYCRYPTO [9], 2D und 3D Visualierungs- und Geometrietools VPYTHON [10] und PYGEO [11]. JOGU Mainz Bibliographie [1 ] PYTHON, http://python.org [2 ] NOKIA, http://opensource.nokia.com/projects/pythonfors60/ [3 ] PYTHON MATH LAB, http://hodge.mathematik.uni-mainz.de/ ∼stefan/python/index.html [4 ] NUMPY, http://numeric.scipy.org/ [5 ] SAGE, http://modular.math.washington.edu/sage/ [6 ] GIMPS, http://www.mersenne.org [7 ] NZMATH, http://sourceforge.net/projects/nzmath/ [8 ] ALADIM, http://www.math.uni-siegen.de/ring/aladim.html [9 ] MATHGUIDE, http://www.math.uni-siegen.de/ring/mathGUIde/ [10 ] PYCRYPTO, http://www.amk.ca/python/code/crypto.html [11 ] VPYTHON, http://vpython.org/ [12 ] PYGEO, http://home.netcom.com/∼ajs/index.html [13 ] http://wombatz.informatik.uni-mainz.de/∼goetz/PyS60/ JOGU Mainz