HSG |
|
Gib folgende Befehle in der Shell ein und schaue dir immer wieder die gespeicherte Liste L an.
L=[42,-5.34,'otto'] L L[0] L[1] L[2] L[3] L[-1] L[-2] L[1] = 'Adam' L L.append('Eva') L L.append(17) L del L[2] L L.insert(2,'hsg') L L.insert(0,'hsg') L L.remove('hsg') L 'hsg' in L L.remove('hsg') L 'hsg' in L del[0] del[1] L L = [44,55,12,42,94,6,67] L L.sort() L
# -*- coding: iso-8859-1 -*- # Autor: mk, 2.6.08; spr, 25.2.21 from time import * def sieb(n): P =[] # leere Liste for zahl in range (2,n+1): P.append(zahl) # Liste P = [2,3,4,...,n] i = 0 # Position der aktuellen Primzahl p = P[i] # p ist aktuelle Primzahl while p*p <= n: # 1) v = 2*p # v ist ein Vielfaches von p, zuerst v=2*p while v <= P[-1]: # ist v <= letztes Element der Liste P? if v in P: # ist v überhaupt noch in der Liste? P.remove(v) # v aus Liste entfernen v = v+p # zum nächsten möglichen Vielfachen i = i+1 p = P[i] # nächste (nicht gestrichene) Zahl in der Liste return P # 1) Jede nichtprime Zahl <= n muss durch eine Primzahl p teilbar sein, für # die p*p <= n gilt. Daher muss man nur bis zu dieser Primzahl p die # Vielfachen streichen. # Angenommen p1<p2<..<pg sind alle die Primzahlen mit p*p <= n. Sei m <= n # und nicht prim, dh. pgg>pg ist eine Primzahl mit pgg | m. Also gilt # m = pgg*f. f ist eine Zahl, die nicht durch p1,...,pg teilbar ist, dh. # f >= pgg. Damit folgt m >= pgg*pgg > n (letztes > nach Voraussetzung). # Widerspruch zu m <= n. if __name__ == '__main__': # wenn Modul als Hauptprogramm, dann Tests t1 = process_time() print sieb(1000) t2 = process_time() print('Rechenzeit: '+str(t2-t1)+'s')
Die zu streichenden Vielfachen könnte man auch bei v = p*p beginnen lassen. Messungen ergeben aber keine kürzeren Rechenzeiten. Vielleicht hängt das daran, dass *2 und +p leicht im Vergleich zu p*p zu rechnen ist.
# -*- coding: iso-8859-1 -*- # Autor: Klaus Merkert, Datum: 2.6.08 def primfac(n): F = [] while n%2 == 0: F.append(2) n = n/2 while n%3 == 0: F.append(3) n = n/3 t = 5 diff = 2 while t*t <= n: while n%t == 0: F.append(t) n = n/t t = t + diff diff = 6 - diff if n > 1: F.append(n) return F
Für eine Primzahl p > 3 gibt es nur die Fälle: 1.Fall: 3∣(p+1) oder 2.Fall: 3∤(p+1). Im 1.Fall könnte p+2 eine Primzahl sein, da ungerade und nicht durch 3 teilbar. p+4 =p+1 + 3 ist aber wieder durch 3 teilbar, sodass der nächste Primzahl-Kandidat p+6 wäre. Im zweiten Fall muss p+2 durch 3 teilbar sein, weil p und p+1 es nicht waren. Man wird daher p+4 untersuchen. p+5 ist aber wieder durch 3 teilbar, sodass p+6 es nicht ist. p+6 kommt als Primzahl-Kandidat in Frage. Im ersten Fall sollte man also p+2 und dann p+6, im zweiten Fall p+4 und dann p+6 untersuchen. Die Primzahlkandidaten haben also abwechselnd eine Differenz von 2 und 4.