: init-sieve ( n -- xs ) [ 1 ] B{ } replicate-as 0 over set-first 0 over set-second ; inline : set-all ( elt indices seq -- ) swap [ swap set-nth ] with with each ; inline : multiples ( i n -- range ) over [ 2 * ] [ 1 - ] [ ] tri* ; inline : sieve-step ( i n xs -- ) [ [ 0 ] 2dip multiples ] dip set-all ; inline : sieve-loop ( n xs -- ) tuck '[ swap 1 = [ _ _ sieve-step ] [ drop ] if ] each-index ; : nsieve ( n -- pi(n) ) dup init-sieve [ sieve-loop ] [ sum ] bi ;