diff options
Diffstat (limited to 'tests/Smoke/sieve.lua')
-rw-r--r-- | tests/Smoke/sieve.lua | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/Smoke/sieve.lua b/tests/Smoke/sieve.lua new file mode 100644 index 0000000..4ce8456 --- /dev/null +++ b/tests/Smoke/sieve.lua @@ -0,0 +1,28 @@ +-- sieve.lua +-- the sieve of Eratosthenes programmed with coroutines +-- typical usage: lua -e N=500 sieve.lua | column + +-- generate all the numbers from 2 to n +function gen (n) + return coroutine.wrap(function () + for i=2,n do coroutine.yield(i) end + end) +end + +-- filter the numbers generated by `g', removing multiples of `p' +function filter (p, g) + return coroutine.wrap(function () + for n in g do + if n%p ~= 0 then coroutine.yield(n) end + end + end) +end + +N=N or 500 -- from command line +x = gen(N) -- generate primes up to N +while 1 do + local n = x() -- pick a number until done + if n == nil then break end + print(n) -- must be a prime number + x = filter(n, x) -- now remove its multiples +end |