# sieve_oc.py import time import machine from machine import Pin led = Pin(25, Pin.OUT) #Berechnung von Primzahlen mit dem Sieb des Eratosthenes. def sieb_des_eratosthenes(limit): # Erzeuge eine Liste, die angibt, ob eine Zahl eine Primzahl ist is_prime = [True] * (limit + 1) p = 2 while (p * p <= limit): # Wenn is_prime[p] nicht verändert wurde, ist p eine Primzahl if is_prime[p]: # Alle Vielfachen von p können keine Primzahl sein. for i in range(p * p, limit + 1, p): is_prime[i] = False p += 1 # Sammle alle Primzahlen in einer Liste. prime_numbers = [p for p in range(2, limit + 1) if is_prime[p]] return prime_numbers # Methode zur Laufzeitbestimmung def berechnung(limit): ergebnis = {} start_time = time.ticks_ms() prime_numbers = sieb_des_eratosthenes(limit) ergebnis['primzahlen'] = prime_numbers end_time = time.ticks_ms() running_time =time.ticks_diff(end_time,start_time) ergebnis['laufzeit'] = running_time return ergebnis # Liefert den Clock-Speed in MHz def get_speed(): return str(round(machine.freq()/1000000,1)) # Beispielverwendung: Finde alle Primzahlen bis 1000 print(f'Durchgang #1 mit {get_speed()}MHz') limit = 10000 ergebnis1 = berechnung(limit) laufzeit1 = ergebnis1['laufzeit'] print(f'Laufzeit: {laufzeit1}ms') #Übertaktung auf 270MHz led.on() machine.freq(270000000) print(f'Durchgang #2 mit {get_speed()}MHz') ergebnis2 = berechnung(limit) laufzeit2 = ergebnis2['laufzeit'] primzahlen = ergebnis2['primzahlen'] led.off() machine.freq(125000000) print(f'Primzahlen bis {limit}: {primzahlen}') print(f'Laufzeit: {laufzeit2}ms') p = (laufzeit1 -laufzeit2) / laufzeit1 *100 print(f' prozentualer Unterschied: {p}%%')