Quindi stavo lavorando a un modo per generare pigramente i primi, e ho trovato queste tre definizioni, che funzionano tutte in modo equivalente - solo controllando se ogni nuovo intero ha un fattore tra tutti i precedenti numeri primi:Stile Haskell/efficienza
primes1 :: [Integer]
primes1 = mkPrimes id [2..]
where mkPrimes f (x:xs) =
if f (const True) x
then
let g h y = y `mod` x > 0 && h y in
x : mkPrimes (f . g) xs
else
mkPrimes f xs
primes2 :: [Integer]
primes2 = mkPrimes id (const True) [2..]
where mkPrimes f f_ (x:xs) =
if f_ x
then
let g h y = y `mod` x > 0 && h y in
x : mkPrimes (f . g) (f $ g $ const True) xs
else
mkPrimes f f_ xs
primes3 :: [Integer]
primes3 = mkPrimes [] [2..]
where mkPrimes ps (x:xs) =
if all (\p -> x `mod` p > 0) ps
then
x : mkPrimes (ps ++ [x]) xs
else
mkPrimes ps xs
così sembra a me primes2
dovrebbero essere un po 'più veloce di primes1
, in quanto evita ricalcolare f_ = f (const True)
per ogni intero (che io che richiede un lavoro su ordine del numero di numeri primi che abbiamo 'ho trovato finora), e lo aggiorna solo quando enc cacciare un nuovo primo.
Proprio da prove non scientifiche (in esecuzione take 1000
in ghci) sembra primes3
corre più veloce di quanto primes2
.
devo prendere una lezione da questo, e supponiamo che se posso rappresentare una funzione come un'operazione su una matrice, che io implementarlo nel secondo modo di efficienza, o c'è qualcosa che accende qui ?
(come sono sicuro che ormai lo so) in 'primes3' che chiama' all' è un enorme overkill - prendere solo i primi non superiori a 'sqrt' di' x' è sufficiente - quindi la stessa lista di primi può essere usata che viene costruito - la funzione diventa semplice filtro: 'primes4 = 2: filter (\ x-> all ((/ = 0). (rem x)) $ takeWhile ((<= x). (^ 2)) primes4) [3,5 ..] ', correndo a circa' O (n^1.45) 'empiricamente, nei primissimi' n' prodotti - * tutte e tre le versioni * nella tua domanda sembrano quadrate - indipendentemente da come costruisci le tue funzioni prova per * tutti * i primi invece di quelli sotto 'sqrt x'. –