Hey, I just realized I can shave off another 30% in C# ;-)<br><br>So now the timings become:<br><br>Safe Haskell<br>=========<br><br>J:\dev\haskell&gt;ghc -O2 -o primechaddai.exe PrimeChaddai.hs<br><br>J:\dev\haskell&gt;primechaddai
<br>number of primes: 664579<br>Elapsed time: 26.234<br><br>Unsafe Haskell<br>===========<br><br>J:\dev\haskell&gt;ghc -fglasgow-exts -O2 -o PrimeDonald2.exe PrimeDonald2.hs<br><br>J:\dev\haskell&gt;primedonald2<br>number of primes: 664579
<br>Elapsed time: 0.7030000000000001<br><br>mono<br>====<br><br>J:\dev\test\testperf&gt;erase primecs.exe &amp; gmcs primecs.cs<br><br>J:\dev\test\testperf&gt;mono primecs.exe<br>number of primes: 664579<br>elapsed time: 0,453
<br><br>Microsoft.Net<br>==========<br><br>J:\dev\test\testperf&gt;erase primecs.exe &amp; csc /nologo primecs.cs<br><br>J:\dev\test\testperf&gt;primecs<br>number of primes: 664579<br>elapsed time: 0,421875<br><br>Here&#39;s the fabulously complicated ;-) new C# algorithm:
<br><br>&nbsp;&nbsp;&nbsp; public int&nbsp; CalculateNumberOfPrimes( int maxprime )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; bool[]IsNotPrime = new bool[ maxprime ]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int NumberOfPrimes = 1;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int squarecutoff = (Int32)Math.Sqrt( maxprime ) + 1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i = 3; i &lt; maxprime; i+= 2 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !IsNotPrime [i] )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberOfPrimes++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( i &lt; squarecutoff )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j = ( i &lt;&lt; 1 ); j &lt; maxprime; j+= i )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if( !IsNotPrime [j] )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IsNotPrime [ j] = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NumberOfPrimes;<br>&nbsp;&nbsp;&nbsp; }<br><br>(basically, we only cross off primes up to the square root of the size of the grid.&nbsp; I think this is a standard part of the standard Arostophenes grid algorithm, so like I say the C# version is seriously unoptimized ;-) )
<br><br>