Okay, also habe ich eine kleine Modifikation gemacht, die Haskell eine ganze Menge Unterschied gemacht hat. Hier ist, wie es geht:Projekt Euler prob 10 mit Haskell
Ich implementierte das Sieb von Eratosthenes für Prob 10 von Projekt Euler. Hier ist, wie es geht:
primesBelowN :: Integer -> [Integer]
primesBelowN n = 2:3:filter f [6*k+i | k <- [1..(n-1)`div`6], i <- [-1, 1]]
where f x = foldr g True [2..truncate(sqrt(fromInteger x))]
where g t ac = (x `rem` t /= 0) && ac
main = print $ sum $ primesBelowN 2000000
es mit ghc Kompilieren, ich habe eine Laufzeit von 8,95 Sekunden zu erhalten:
$ ghc -O3 010SummationOfPrimes.hs
$ time 010SummationOfPrimes
142913828922
8.739u 0.122s 0:08.95 98.8% 0+0k 2384+0io 1pf+0w
Ich dachte, ich den Code faul Auswertung durch Ausnutzen von Haskell in der g
Funktion optimieren können . Getan werden könnte (oder so dachte ich), indem einfach die ac
als erstes Argument zu &&
platzieren, so dass sie nicht die Ungleichheit, wenn ac == False
nicht berechnen:
primesBelowN :: Integer -> [Integer]
primesBelowN n = 2:3:filter f [6*k+i | k <- [1..(n-1)`div`6], i <- [-1, 1]]
where f x = foldr g True [2..truncate(sqrt(fromInteger x))]
where g t ac = ac && (x `rem` t /= 0)
main = print $ sum $ primesBelowN 2000000
Erstaunlicherweise macht das Programm 4X Langsamer!. Die Laufzeit nun deutlich größer ist 30.94s:
$ ghc -O3 010SummationOfPrimes.hs
$ time 010SummationOfPrimes
142913828922
30.765u 0.157s 0:30.94 99.9% 0+0k 2384+0io 1pf+0w
Ich habe keine Ahnung, was falsch gelaufen ist ... irgendwelche Hinweise/Anregungen/Antworten? Danke im Voraus!
EDIT
So wurde ich mit diesem zu spielen, wenn ich über eine andere Sache gestürzt. Sieht aus wie es ist leicht, in Endlosschleifen zu landen, wenn ich dies nur meine Funktion wie modulieren:
primesBelowN :: Integer -> [Integer]
primesBelowN n = 2:3:filter f [6*k+i | k <- [1..(n-1)`div`6], i <- [-1, 1]]
where f x = foldr g True [m | m <- [2..],
m <= truncate(sqrt(fromInteger x))]
where g t ac = (x `rem` t /= 0) && ac
main = print $ sum $ primesBelowN 2000000
Der Prozess Speicher hält nur in diesem Fall zu großen Zahlen (80Gig, bevor ich sie getötet) explodiert, ohne Ausgänge :
$ ghc -O3 010SummationOfPrimes.hs
$ time 010SummationOfPrimes
^C20.401u 7.994s 0:28.42 99.8% 0+0k 2384+0io 1pf+0w
Irgendwelche Ideen, was schief läuft jetzt?
Es ist cos Sie Falten richtig, aber '' && ist streng in seiner linken Argument –
@BenjaminHodgson Pflege dies ein wenig zu erklären? – Carsten
@BenjaminHodgson Danke für die Antwort, aber ich würde wirklich eine Ausarbeitung zu schätzen wissen. Haskell Neuling hier. :) – deejay