SFZ FN Sj. 12/13 Python 4 Grundlagen 1 Python, SFZ FN, Sj 12/13 W.Seyboldt Python Methoden: def teilt(t, n): ''' Kommentar …. ''' Berechnungen return var Statt der Variable var bei Return kann eine Methode oder eine Formel stehen. Listen: siehe z.B. http://effbot.org/zone/python-list.htm auch li=[1,5,4] tm=[t for t in range(1,int(sqrt(n))+1) if teilt(t,n)] tm[3] tm.reverse() # Elemente umgekehrt anordnen 2 W.Seyboldt Teiler 3 Eine Zahl a ist Teiler der Zahl b, wenn der Test bei der Divison b/a Null ist. Erstelle in EcPy das Package C Erstelle im Modul Teiler01.py die Methode teilt(t,n), die true zurückgibt, wenn t ein Teiler ist, false sonst. Man muss keinesfalls alle Zahlen t<=n überprüfen, die Zahlen t<= wurzel(n) genügen. Teste die Methode mit alle Zahlen kleiner als n bei n=60 (Schleife), ebenso bei n = 61, 121, 144. Zeige nur die Zahlen am Bildschirm an, die Teiler sind. Erstelle in diesem Modul die Methode teiler(n), die eine Liste mit allen Teilern von n zurück gibt. Erstelle damit die Teilermenge von 60, 61, 121, 144, 35742 W.Seyboldt ggT(a,b) 4 Der ggT(a,b) ist das größte Element der Durchschnitte der Teilermengen von a und b Erstelle im Modul Teiler01.py, die Methode ggT1(a,b), die mit Hilfe der Teilermengen ta und tb der Zahlen a und b den größten Teiler zurückgibt. Benutze evtl. die Methode teiler(n) Tipp: Drehe die Ordnung in ta um (ta.reverse) und suche von oben her, ob ein Teiler in ta auch in tb ist. Bestimme ggT(60,18), ggT(75,90) und ggT(144,12). W.Seyboldt Python Tipps Man kann auf den Index und das Element das dem Index zugeordnet ist in einer Schleife gleichzeitig zugreifen: For index , n in enumerate(liste): Man kann auch eine Liste mit Zahlenpaaren erstellen. For a,b in [(23,56), 45,34)]: Ausgaben von Zahlen und Stringtexten: Der ggT(%d,%d) ist %d" %(n,m,g) Auf Methoden aus anderen Files zugreifen from filename import * Schreibe ein File mit allen Moduls und lade es mit from filename import * 5 W.Seyboldt Diophantische Gleichung 6 Letzte Stunde haben wir gesehen, dass die Gleichung x*a-y*b=1 Lösungen hat, wenn a und b teilerfremd sind. Eine Lösung findet man, wenn man die (b-1) Zahlen a, 2a, 3a, …. (b-1)a auf Rest 1 untersucht. Der Rest 1 tritt auf. Weitere Lösungen bekommt man, wenn man beachtet, dass k*a*b für alle ganzen Zahlen k durch a und b teilbar ist und dass 1 = xa − yb = xa + kab − kab − yb = (x + kb)a − (y + kb)b Damit sind mit x und y auch (x+kb) und (y+ka) Lösungen. W.Seyboldt Löse Diophantische Gl. Erstelle im Modul Diophant01.py, die Methode DiophantTeilerfremd(a,b), die für teilerfremde a und b eine Lösung der diophantischen Gleichung a ×x − b × y = 1 zurückgibt. Das Programm benötigt die Methoden teiler(a). Erstelle dazu das File teiler.py, das die Methoden von Teiler01.py enthält, aber kein Hauptprogramm. Lade Zahlentheorie.py im Modul Diophant01.py, durch from Zahlentheorie import * 7 W.Seyboldt Euklidscher Algorithmus Wir wollen als erstes mit dem Euklidschen Algorithmus den ggT bestimmen. Lese http://de.wikipedia.org/wiki/Euklidischer_Algorithmus Erstelle den Modul Euklid01.py und darin die – – iterative Methode euklidIt(a,b) und die rekursive Version euklidRec(a,b) . siehe http://de.wikipedia.org/wiki/Euklidischer_Algorithmus 8 Wir werden jetzt eine Variante des Euklidschen Algorithmus programmieren, bei dem alle Reste und Quotienten zurückgegeben werden. Dies ist eine Vorstufe zum Erweiterten Euklidschen Algorithmus, bei dem man die Lösung bestimmter diophantischen Gleichungen und die Kettenbruchbruchentwicklung mitbestimmt. W.Seyboldt Euklid – Rückgabe von Listen 9 Wir setzen b0 = a, b1 = b Die Division mit Rest ist nun b0 = q1 × b1 + r1 Wir setzen b2 = r1. Dann gilt b = q ×b 2 + rrLi 2 Damit können wir Listen bLi,1 qLi2 und definieren. qLi[0] und rLi[0] setzen wir auf None (unbestimmt) Wir brechen Euklid ab, wenn rk=0 ist. bk-1 ist dann der ggT(a,b). Der Index (k-1) ist dann der letzte Index der drei Listen. Programmiere EuklidLi, die den ggT = bLi[-1]=bk1, die Listen bLi, qLi und rLi zurückgibt (die alle die Länge k haben, also den höchsten Index (k-1). W.Seyboldt Euklid –Liste qLi, Kettenbruch 10 Die Folge qLi des Euklidschen Algorithmus EuklidLi ist die Kettenbruchentwicklung des Bruchs a/b. Erstelle ein Programm kettenbruch(z,n), das zu einem Bruch bestehend aus Zähler z und Nenner n den Kettenbruch erstellt. siehe http://de.wikipedia.org/wiki/Euklidischer_Algor ithmus#Euklidischer_Algorithmus_und_Kettenbruch zerlegung W.Seyboldt Vom Kettenbruch zum Bruch Der Teil eines Kettenbruch, der aus der Kettenbruchentwicklung K = [a0; a1,…, an] durch einen Abbruch nach dem k-ten Teilnenner ak entsteht, heißt k-te Konvergente oder k-ter Näherungsbruch und wird Kk = [a0; a1,…, ak], 1 ≤ k ≤ n bezeichnet. Die 0-te Konvergente K0 ist die Zahl a0. Sei K = [ a 0 ;a1 , a 2 ,...a n ] ein Kettenbruch, so gilt mit 11 P0 = a 0 Q0 = 1 P1 = a1 ×a 0 + 1 Pk = a k × Pk − 1 + Pk − 2 Q1 = a1 Qk = a k ×Qk − 1 + Qk − 2 K k = [ a 0 ;a1 , a 2 ,...a k ] = Pk Qk Erstelle den Modul konvergenten(kb), der eine Liste von Brüchen, die Konvergenten, zurückgibt. W.Seyboldt Euklid – erweitert, diophant. Gl. 12 Seien a und b ganze Zahlen, g = ggT(a,b). So gibt es Zahlen x und y mit ax+by=g – das heißt diese Diophantische Gleichung ist lösbar. Man kann die Zahlen x und y im Euklidschen Algorithmus mit berechnen. Man redet dann vom erweiterten Euklidschen Algorithmus. Mit den Bezeichnung von Folie 0, d.h. bLi=[a,b,r1,…] qLi=[None, q1, …] und rLi=[None, r1, …] führen wir zwei weitere Listen xLi und yLi ein, die so sind, dass bLi[i]=a*xLi[i]+b*yLi[i]. Da das letzte Element von bLi der ggT(a,b) ist, haben wir eine Lösung der Diophantischen Gleichung gefunden. W.Seyboldt Euklid – erweitert, diophant. Gl. Die Rekursionsgleichungen von x und y sind: xLi=[1,0, x2…] yLi=[0,1,y2…]x n + 1 = x n − 1 − q n ×x n bLi qLi rLi xLi yLi 0 a − − 1 0 13 1 2 3 b r1 r2 q1 q2 q3 r1 r2 r3 0 x2 x3 y n + 1 = y n − 1 − q n ×y n 1 y2 y3 Die q und r bestimmen sich durch den Euklidschen Algorithmus, die x und y durch die obigen Formeln W.Seyboldt Beweis der Formeln x und y Die Formeln liefern zusammen mit der Division mit Rest die Diophantische Gleichung Mit x = x − q ×x bzw. y = y − q ×y n+ 1 n− 1 n n n+ 1 n− 1 n n Und b n − 1 = b n ×q n + rn bzw. (rn = )b n + 1 = b n − 1 − b n ×q n Beweis mit Induktion. Richtig für Index 0 und 1 Induktionsschritt: aus n-1 und n folgt n+1 b n + 1 = b n − 1 − q n b n = x n − 1a + y n − 1b − q n ( x n a + y n b ) = x n − 1a − q n x n a + xy n − 1b − q n y n b = a ( x n − 1 − q n x n ) + b ( yn − 1 − q n yn ) 14 W.Seyboldt Primzahlen SiebDesEratosthenes.py: Bestimme mit dem Sieb des Eratosthenes alle Primzahlen bis zu einer eingegebenen Zahl Sieb des Eratosthenes: – – – – 15 Schreibe alle Zahlen bis n auf ein Blatt. Streiche alle 2er-Zahlen Streiche alle 3er-Zahlen Gehe einfach weiter und streiche alle Mehrfache der Zahlen, die noch nicht gestrichen sind Erstelle ein Programm Primzahlen01.py, das die Primzahlen bis zu einer einzugebenden Zahl berechnet. Schreibe dazu eine Methode. W.Seyboldt Literatur 16 [Old] Reinhard Oldenburg: Mathematische Algorithmen im Unterricht, Teubner 2011 [PyTut] Das offizielle Python-Tutorial, siehe http://docs.python.org/2/tutorial/ [SymPy] Symbolisch rechnen mit Python, siehe http://docs.sympy.org/dev/tutorial/tutorial.d e.html W.Seyboldt