ist Mein aktueller Algorithmus die Primalität von Zahlen in Python zu überprüfen Art und Weise für die Zahlen zwischen 10 Millionen und 1 Milliarde zu verlangsamen. Ich möchte, dass es verbessert wird, wissend, dass ich nie Zahlen größer als 1 Milliarde bekommen werde.schnell festzustellen, ob eine Zahl für Zahlen in Python prim <1 Milliarde
Der Kontext ist, dass ich nicht eine Implementierung bekommen kann, die schnell genug ist, um Problem 60 von Projekt Euler zu lösen: Ich bekomme die Antwort auf das Problem in 75 Sekunden, wo ich es in 60 Sekunden brauche. http://projecteuler.net/index.php?section=problems&id=60
Ich habe nur sehr wenige Speicher zu meiner Verfügung, so kann ich unter 1 Milliarde aller Primzahlen nicht speichern.
Ich verwende derzeit die Standard-Probedivision mit 6k ± 1 abgestimmt. Gibt es etwas besseres als das? Muss ich schon die Rabin-Miller-Methode für so große Zahlen bekommen?
primes_under_100 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
def isprime(n):
if n <= 100:
return n in primes_under_100
if n % 2 == 0 or n % 3 == 0:
return False
for f in range(5, int(n ** .5), 6):
if n % f == 0 or n % (f + 2) == 0:
return False
return True
Wie kann ich diesen Algorithmus verbessern?
Präzision: Ich bin neu in Python und möchte mit Python arbeiten 3+ nur.
Schlusscode
Für diejenigen, die interessiert sind, MAK Ideen verwenden, erzeugen ich den folgenden Code, der etwa ein Drittel schneller ist, so dass ich das Ergebnis des euler Problems in weniger bekommen als 60 Sekunden!
from bisect import bisect_left
# sqrt(1000000000) = 31622
__primes = sieve(31622)
def is_prime(n):
# if prime is already in the list, just pick it
if n <= 31622:
i = bisect_left(__primes, n)
return i != len(__primes) and __primes[i] == n
# Divide by each known prime
limit = int(n ** .5)
for p in __primes:
if p > limit: return True
if n % p == 0: return False
# fall back on trial division if n > 1 billion
for f in range(31627, limit, 6): # 31627 is the next prime
if n % f == 0 or n % (f + 4) == 0:
return False
return True
ist das Py3k ??? – st0le
Ich wusste es unter dem Namen Python 3 oder Python 3.1, aber es sieht aus wie Py3k diese Versionen verweist. –
sollte es nicht "f" und "f + 4" sein ... Könnten Sie bestätigen? Warum die '4'? – st0le