#!/usr/bin/newlisp
# nsieve - benchmark
#
# by Lutz Mueller 2004-12-11
#
# A solution with a newLISP array for flags is about the same
# speed but uses much more memory. Here a character vector is
# manipulated directly.
(define (nsieve m f, cnt)
(set 'cnt 0)
(for (i 2 m)
(if (= (char f:isPrime i) 1)
(begin
(set 'k (+ i i))
(while (<= k m)
(cpymem "\000" (+ k (address f:isPrime)) 1)
(inc 'k i))
(inc 'cnt))))
cnt)
(define (main)
(set 'n (integer (main-args 2)))
(set 'm (* (pow 2 n) 10000))
(set 'flags:isPrime (dup "\001" (+ m 1) ))
(println (format "Primes up to %8d%8d" m (nsieve m flags)))
(set 'm (* (pow 2 (- n 1)) 10000))
(println (format "Primes up to %8d%8d" m (nsieve m flags)))
(set 'm (* (pow 2 (- n 2)) 10000))
(println (format "Primes up to %8d%8d" m (nsieve m flags)))
)
(main)
(exit)
syntax highlighting with newLISP and syntax.cgi