青山です。

On Thu, 18 Mar 1999 17:21:54 +0900,
Shin-ichiro Hara <sinara / blade.nagaokaut.ac.jp> wrote:

> するとある程度 max が大きいと(稲葉1)の大体3倍のスピード
> が出るようです。

ちょっと古い話しですが、NIFTY の方でこの話が出まして、少し手を加えた所、
max が大きい場合、さらに倍ぐらいになりました。これでほぼ awk, perl の
速度に追い付いたようです。


max = Integer(ARGV.shift || 1000)                                               
max2 = (max-3)/2                                                                
sieve = Array.new(max2, true)                                                   
for i in 0 .. Integer((Math.sqrt(max)-3)/2)                                     
  next unless sieve[i]                                                          
  k = i+i+3                                                                     
  j = k*(i+1)+i                                                                 
  while j <= max2                                                               
    sieve[j] = nil                                                              
    j += k                                                                      
  end                                                                           
end                                                                             
for i in 0 .. max2                                                              
  sieve[i] && sieve[i]=i+i+3                                                    
end                                                                             
sieve.compact!                                                                  
puts 2, sieve.join("\n")                                                        


step --> while, compact --> compact!, Array.new の max とデフォルトの
利用、こんな感じで高速化しました。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>