• Keine Ergebnisse gefunden

Ein schnellerer Primzahltest

N/A
N/A
Protected

Academic year: 2022

Aktie "Ein schnellerer Primzahltest"

Copied!
10
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Departement Informatik

Informatikgrundlagen

Daten einlesen und Sortieren

Hans-Joachim Böckenhauer Dennis Komm

Herbst 2021 – 4. November 2021

Ein schnellerer Primzahltest

from math import sqrt def primetest3(x):

if x < 2 or (x > 2 and x % 2 == 0):

return False d = 3

wurzelx = sqrt(x) while d < x<= wurzelx:

if x % d == 0:

return False d += 2

return True

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 1 / 28

Ein schnellerer Primzahltest

Wie gross ist diesmal die Verbesserung?

Was ist die Laufzeit dieses Algorithmus?

Schleife wird√

x/2Mal durchlaufen

Laufzeit «wächst» mit Grösse des Werts von√ x Laufzeit inO(√

2n) =O(2n/2) =O(1.415n)

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 2 / 28

Ein schnellerer Primzahltest

5 10 15 20 25 30 35 40 45

0 2 000 000 4 000 000 6 000 000 8 000 000 10 000 000

2n 1.415n

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 3 / 28

(2)

Ein schnellerer Primzahltest

Nehmen wir vereinfacht an, unser Computer kann1000Durchläufe der Schleife pro Sekunde durchführen; fürx= 100 000 000 000 031bedeutet dies:

. . . d < x . . .

100 000 000 000 031Durchläufe 1000DurchläufeSekunde

>100 000 000 000Sekunden

>3100Jahre

. . . d <= sqrt(x) . . .

√100 000 000 000 031Durchläufe 1000DurchläufeSekunde

≈ 10 000 000Durchläufe 1000DurchläufeSekunde

<3Stunden

Selbst wenn der Computer, auf dem das langsamere Programm läuft, 100 Mal schneller ist, braucht er noch 31 Jahre

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 4 / 28

Ein schnellerer Primzahltest

Oder andersherum. . .

Angenommen, wir wollen maximal zehn Minuten rechnen

Dann ergeben sich maximal «testbare» Primzahlen in den folgenden Grössenordnungen:

. . . d < x . . . xDurchläufe

1000DurchläufeSekunde = 600Sekunden

⇐⇒x= 600 000

. . . d <= sqrt(x) . . .

√xDurchläufe

1000DurchläufeSekunde = 600Sekunden

⇐⇒x= 600 0002

⇐⇒x= 360 000 000 000

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 5 / 28

Ein schnellerer Primzahltest

Best- und Worst-Case-Analyse

Best- und Worst-Case-Analyse

Welcher Algorithmus ist schneller?

def primetest3(x):

if x < 2 or (x > 2 and x % 2 == 0):

return False d = 3

while d <= sqrt(x):

if x % d == 0:

return False d += 2

return True

def primetest4(x):

if x < 2 or (x > 2 and x % 2 == 0):

return False d = 3

isprime = True while d <= sqrt(x):

if x % d == 0:

isprime = False d += 2

return isprime

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 6 / 28

(3)

Best- und Worst-Case-Analyse

Angenommen,xist durch 3 teilbar

Dann ist der linke Algorithmus sehr schnell ï Schleife wird nach dem ersten Vergleich verlassen

«Early Exit»

Rechter Algorithmus macht ca.1.415n/2Vergleiche Angenommen,xist Primzahl

Dann machen beide Algorithmen ca.1.415n/2Vergleiche (Natürlich sollte der linke implementiert werden)

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 7 / 28

Was kann man sonst noch machen?

Primzahltest

Jede Zahl zwischen 1undxtesten

Jede zweite Zahl zwischen 1undxtesten

Jede zweite Zahl zwischen 1und√

xtesten

Randomisierter Monte-Carlo- Algorithmus

Polynomieller AKS-Algorithmus

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 8 / 28

Listen

Weiterführende Konzepte

(4)

2-dimensionale Listen

Bislang beinhalten Listen Zahlen oder Zeichen Liste kann auch Listen beinhalten

Solche2-dimensionalen Listenspeichern z. B. Tabellen und Matrizen

M =

2 0 3 0 6 3 9 5 1 1 0 0 7 2 7 3 9 5 8 0 8 2 0 3 2 1 6 5 9 6

M = [ [2, 0, 3, 0, 6], [3, 9, 5, 1, 1], [0, 0, 7, 2, 7], [3, 9, 5, 8, 0], [8, 2, 0, 3, 2], [1, 6, 5, 9, 6] ] Zugriff aufi-te Zeile undj-te Spalte mit M[i][j]

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 9 / 28

Listen

Daten einlesen und in Listen speichern

Daten einlesen

Beispiel: Matrix in Datei gegeben Inhalt der Datei ist ein Text Matrix zeilenweise abgespeichert

Einträge in jeder Zeile mit Kommata getrennt Einträge sollen als Zahlen interpretiert werden Drei Schritte

1. Datei Zeile für Zeile einlesen

2. Einträge aus den Zeilen extrahieren (Trennsymbol: Komma) 3. Jeden Eintrag in Zahl konvertieren

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 10 / 28

Daten einlesen

1. Datei Zeile für Zeile einlesen

with open("daten.txt") as file:

lines = file.read().splitlines()

Dateidaten.txtist für den nachfolgenden Anweisungsblock geöffnet Zugreifbar unter dem Namenfile

lines = file.read()speichert den gesamten Text ausdaten.txtin der Variablenlines

lines = file.read().splitlines()speichert die einzelnen Zeilen von daten.txtals Einträge der Listelines

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 11 / 28

(5)

Daten einlesen: Beispiel

1. Datei Zeile für Zeile einlesen

with open("daten.txt") as file:

lines = file.read().splitlines()

daten.txt 2, 0, 3, 0, 6 3, 9, 5, 1, 1 0, 0, 7, 2, 7 3, 9, 5, 8, 0 8, 2, 0, 3, 2 1, 6, 5, 9, 6

lines = [ "2, 0, 3, 0, 6",

"3, 9, 5, 1, 1",

"0, 0, 7, 2, 7",

"3, 9, 5, 8, 0",

"8, 2, 0, 3, 2",

"1, 6, 5, 9, 6" ]

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 12 / 28

Daten einlesen

2. Einträge aus erster Zeile extrahieren (Trennsymbol: Komma) tmp = lines[0].split(",")

lines = [ "2, 0, 3, 0, 6",

"3, 9, 5, 1, 1",

"0, 0, 7, 2, 7",

"3, 9, 5, 8, 0",

"8, 2, 0, 3, 2",

"1, 6, 5, 9, 6" ]

tmp = ["2", "0", "3", "0", "6"]

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 13 / 28

Daten einlesen

3. Jeden Eintrag in Zahl konvertieren data = [0] * len(tmp)

for i in range(0, len(tmp)):

data[i] = int(tmp[i])

tmp = ["2", "0", "3", "0", "6"] data = [2, 0, 3, 0, 6]

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 14 / 28

Daten einlesen: Zusammenfassung

def readfile(filename):

# Datei Zeile für Zeile einlesen withopen(filename) as file:

lines = file.read().splitlines()

# Einträge aus erster Zeile extrahieren (Trennsymbol: Komma) tmp = lines[0].split(",")

# Jeden Eintrag in Zahl konvertieren data = [0] * len(tmp)

for iin range(0, len(tmp)):

data[i] = int(tmp[i])

returndata

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 15 / 28

(6)

Aufgabe – Daten einlesen

Erweitern Sie die Funktion, sodass alle Zeilen der Datei gelesen und konvertiert werden

der Inhalt in einer 2-dimensionalen Liste gespeichert wird

def readfile(filename):

with open(filename) as file:

lines =file.read().splitlines() tmp = lines[0].split(",")

data = [0] * len(tmp) for i in range(0,len(tmp)):

data[i] =int(tmp[i]) returndata

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 16 / 28

Daten einlesen

def readfile2(filename):

# Datei Zeile für Zeile einlesen withopen(filename) as file:

lines = file.read().splitlines() data = []

# Alle Zeilen nacheinander verarbeiten for iin range(0, len(lines)):

tmp = lines[i].split(",") dataline = [0] * len(tmp) for j in range(0,len(tmp)):

dataline[j] =int(tmp[j]) data.append(dataline) returndata

Oft sind Daten als solchecsv-Dateien (Comma Separated Values) gegeben

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 17 / 28

Sortieren 1

Sortieren und Suchen

Sortieren und Suchen

Daten suchen undsortierensind zwei der grundlegendsten Aufgaben von Informatikerinnen und Informatikern

Standardwerk dreht sich nur um diese Themen Gegeben seiennpositive ganze Zahlen

GenauerunsortierteListedatamitn = len(data) Wir betrachtennals Eingabelänge

Zahlen können mehrfach auftauchen

Sortieremit möglichst kleiner Zeitkomplexität

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 18 / 28

(7)

Sortieren 1

Bubblesort

Bubblesort

5

1 1 5 4 3 4 5 3 4 3 5

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 19 / 28

Bubblesort

Idee

Sortieren durch wiederholtes Finden des Maximums Ziel

ListedatamitnElementen sortieren, also Bereich0, . . . , n−1 Finde Maximum und schiebe es an die letzte Position Vergleiche hierzu iterativ alle benachbarten Elemente

Maximum wandert wie Luftblase durch Liste an letzte Position Wiederholen mit Bereich0, . . . , n−2

Fahre fort, bisdatasortiert ist

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 20 / 28

Aufgabe – Eine Bubble-Sequenz

Implementieren Sie eine Bubble-Sequenz Laufe einmal durchdata

Vergleiche jeweils benachbarte Paare Vertausche, wenn das erste Element grösser ist

Maximum «bubblet» nach rechts

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 21 / 28

(8)

Eine Bubble-Sequenz

Eine Bubble-Sequenz in Python

data = [6, 22, 61, 1, 89, 31, 9, 10, 76]

n = len(data)

for i in range(0, n-1):

if data[i] > data[i+1]:

tmp = data[i]

data[i] = data[i+1]

data[i+1] = tmp

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 22 / 28

Aufgabe – Bubblesort

Implementieren Sie den vollständigen Algorithmus Iteriere Bubble-Sequenzen

Nachk-ter Sequenz sind die letztenk Elemente vondatasortiert

Bubble-Sequenzen werden mit jeder Iteration kürzer

Verwende hierzu eine äussere Schleife

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 23 / 28

Bubblesort

def bubblesort(data):

n = len(data)

for d in range(n, 1, -1):

for i in range(0, d-1):

if data[i] > data[i+1]:

tmp = data[i]

data[i] = data[i+1]

data[i+1] = tmp return data

print(bubblesort([6, 22, 61, 1, 89, 31, 9, 10, 76]))

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 24 / 28

Sortieren 1

Minsort

(9)

Minsort

Idee

Sortieren durch wiederholtes Finden des Minimums

Anders als bei Bubblesort werden nicht benachbarte Elemente verglichen Aktuelles Minimum wird gespeichert

Jedes Element wird mit diesem verglichen

Falls es kleiner ist, werden beide miteinander vertauscht Nach einer Iteration wird Minimum an (aktuellen) Anfang kopiert Fahre fort, bisdatasortiert ist

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 25 / 28

Minsort

def minsort(data):

n = len(data)

for current in range(0, n-1):

minimum = data[current]

for i in range(current+1, n):

if data[i] < minimum:

tmp = data[i]

data[i] = minimum minimum = tmp data[current] = minimum return data

print(minsort([6, 22, 61, 1, 89, 31, 9, 10, 76]))

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 26 / 28

Sortieren 1

Zeitkomplexität von Bubblesort und Minsort

Zeitkomplexität von Bubblesort und Minsort

Zähle die Vergleiche von jeweils zwei Zahlen n−1Vergleiche, um das Maximum zu finden

n−2Vergleiche, um das zweitgrösste Element zu finden . . .

1Vergleich, um die beiden kleinsten Elemente zu sortieren ï InsgesamtPn−1i=1 i= (n−1)·n/2 = (n2n)/2Vergleiche ï Quadratisch viele Vergleiche

Die Laufzeit von Bubblesort ist inO(n2)

Die Laufzeit von Minsort ist (mit ähnlichen Argumenten) inO(n2)

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 27 / 28

(10)

Zeitkomplexität von Bubblesort und Minsort

10 20 30 40 50 60 70 80 90 100

0 1 000 2 000 3 000 4 000 5 000

Bubblesort / Minsort

Ziel

Eingabelängen

Vergleiche

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 28 / 28

Referenzen

ÄHNLICHE DOKUMENTE

Informatikgrundlagen für Humanmedizin – Einführung in die Vorlesung Herbst 2021 Böckenhauer, Komm 5 / 36... Computer

Informatikgrundlagen für Humanmedizin – Listen, Strings, Schleifen Herbst 2021 Böckenhauer, Komm 1 / 21... Die

Boolesche Ausdrücke können mögliche Werte F oder T annehmen F entspricht «falsch». T

Informatikgrundlagen für Humanmedizin – Funktionen und Rückgabewerte Herbst 2021 Böckenhauer, Komm 2 / 26... aber nicht automatisch

Informatikgrundlagen für Humanmedizin – Funktionen und Rückgabewerte Herbst 2021 Böckenhauer, Komm 1 /

Informatikgrundlagen für Humanmedizin – Daten einlesen und Sortieren Herbst 2021 Böckenhauer, Komm 7 / 28... Angenommen, x ist durch

Informatikgrundlagen für Humanmedizin – numpy, matplotlib Herbst 2021 Böckenhauer, Komm 9 / 25.. Das Modul numpy. numpy ist Grundlage für viele weitere

Informatikgrundlagen für Humanmedizin – pandas Herbst 2021 Böckenhauer, Komm 4 / 18... Komplexität