Informatik-AG Klasse 11

Werbung
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
Herunterladen