1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
<span class="hljs-keyword">module</span> fsieve
<span class="hljs-keyword">import</span> StdClass; <span class="hljs-comment">// RWS</span>
<span class="hljs-keyword">import</span> StdInt, StdReal
NrOfPrimes :== <span class="hljs-number">3000</span>
primes :: [<span class="hljs-built_in">Int</span>]
primes = pr <span class="hljs-keyword">where</span> pr = [<span class="hljs-number">5</span> : sieve <span class="hljs-number">7</span> <span class="hljs-number">4</span> pr]
sieve :: <span class="hljs-built_in">Int</span> !<span class="hljs-built_in">Int</span> [<span class="hljs-built_in">Int</span>] -> [<span class="hljs-built_in">Int</span>]
sieve g i prs
| isPrime prs g (toInt (sqrt (toReal g))) = [g : sieve` g i prs]
| <span class="hljs-keyword">otherwise</span> = sieve (g + i) (<span class="hljs-number">6</span> - i) prs
sieve` :: <span class="hljs-built_in">Int</span> <span class="hljs-built_in">Int</span> [<span class="hljs-built_in">Int</span>] -> [<span class="hljs-built_in">Int</span>]
sieve` g i prs = sieve (g + i) (<span class="hljs-number">6</span> - i) prs
isPrime :: [<span class="hljs-built_in">Int</span>] !<span class="hljs-built_in">Int</span> <span class="hljs-built_in">Int</span> -> <span class="hljs-built_in">Bool</span>
isPrime [f:r] pr bd
| f>bd = <span class="hljs-literal">True</span>
| pr rem f==<span class="hljs-number">0</span> = <span class="hljs-literal">False</span>
| <span class="hljs-keyword">otherwise</span> = isPrime r pr bd
select :: [x] <span class="hljs-built_in">Int</span> -> x
select [f:r] <span class="hljs-number">1</span> = f
select [f:r] n = select r (n - <span class="hljs-number">1</span>)
Start :: <span class="hljs-built_in">Int</span>
Start = select [<span class="hljs-number">2</span>, <span class="hljs-number">3</span> : primes] NrOfPrimes
|