[Shootout-list] Tcl : nsieve

Robert Seeger Robert Seeger <rhseeger@gmail.com>
Fri, 18 Mar 2005 11:08:28 -0500


I updated the Tcl implementation of the nsieve test. It now uses
lists, since they are closer to a C array than Tcl arrays are.
However, even with N = 3, it takes over 2 minutes to complete on my
system :(

Rob Seeger



package require Tcl 8.4

proc main {n} {
    foreach value [list $n [incr n -1] [incr n -1]] {
        set num [expr { int(pow(2, $value) * 10000) }]
        puts [format "Primes up to %8d %8d" $num [nsieve $num]]
    }
}

proc nsieve {n} {
    set data {}
    for {set i 1} {$i <= $n} {incr i} {
        lappend data $i
    }

    for {set i 2} {$i <= $n} {incr i} {
        if { [string length [lindex $data $i]] } {
            for {set j [expr {$i * $i}]} {$j <= $n} {incr j $i} {
                if { [string length [lindex $data $j]] } {
                    lset data $j {}
                }
            }
        }
    }
    
    expr {[lsearch [lsort -decreasing $data] {}] -2}
}

main [lindex $argv 0]