#!/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