(Random observation: Hmmm, strange, in the Data.Map version of primes above, we are missing 5 primes?)<br><br>Hi Chaddai,<br><br>Your algorithm does work significantly better than the others I&#39;ve posted here :-)<br><br>
So much so, that we&#39;re going for a grid of 10000000 to get the timings in an easy-to-measure range.&nbsp; Here are the results:<br><br>J:\dev\haskell&gt;ghc -O2 -fglasgow-exts -o PrimeChaddai.exe PrimeChaddai.hs<br><br>J:\dev\haskell&gt;primechaddai
<br>number of primes: 664579<br>30.984<br><br>J:\dev\test\testperf&gt;csc /nologo primecs.cs<br><br>J:\dev\test\testperf&gt;primecs<br>number of primes: 664579<br>elapsed time: 0,859375<br><br>So, only 30 times faster now, which is quite a lot better :-D
<br><br>Here&#39;s the full .hs code:<br><br>module Main<br>&nbsp;&nbsp;&nbsp; where<br><br>import IO<br>import Char<br>import GHC.Float<br>import List<br>import qualified Data.Map as Map<br>import Control.Monad<br>import System.Time<br>
import System.Locale<br><br>merge xs@(x:xt) ys@(y:yt) = case compare x y of<br>&nbsp;&nbsp; LT -&gt; x : (merge xt ys)<br>&nbsp;&nbsp; EQ -&gt; x : (merge xt yt)<br>&nbsp;&nbsp; GT -&gt; y : (merge xs yt)<br><br>diff&nbsp; xs@(x:xt) ys@(y:yt) = case compare x y of
<br>&nbsp;&nbsp; LT -&gt; x : (diff xt ys)<br>&nbsp;&nbsp; EQ -&gt; diff xt yt<br>&nbsp;&nbsp; GT -&gt; diff xs yt<br><br>primes, nonprimes :: [Int]<br>primes&nbsp;&nbsp;&nbsp; = [2,3,5] ++ (diff [7,9..] (nonprimes))<br>nonprimes = foldr1 f . map g $ tail (primes)<br>
&nbsp;&nbsp; where f (x:xt) ys = x : (merge xt ys)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g p = [ n*p | n &lt;- [p,p+2..]]<br><br>calculateNumberOfPrimes max = length $ takeWhile ( &lt; max ) primes<br><br>gettime :: IO ClockTime<br>gettime = getClockTime<br>
<br>main = do starttime &lt;- gettime<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let numberOfPrimes = (calculateNumberOfPrimes 10000000) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn( &quot;number of primes: &quot; ++ show( numberOfPrimes ) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endtime &lt;- gettime
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let timediff = diffClockTimes endtime starttime<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let secondsfloat = realToFrac( tdSec timediff ) + realToFrac(tdPicosec timediff) / 1000000000000<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putStrLn( show(secondsfloat) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ()
<br><br><br><div><span class="gmail_quote">On 7/15/07, <b class="gmail_sendername">Chaddaï Fouché</b> &lt;<a href="mailto:chaddai.fouche@gmail.com">chaddai.fouche@gmail.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Or if you really want a function with your requirement, maybe you<br>could take the painful steps needed to write :<br>let numberOfPrimes = length $ takeWhile (&lt; 200000) primes<br>?<br></blockquote></div><br>