2013年8月13日火曜日

エラトステネスの篩(ふるい)をRで適当にコーディング

たまには投稿しないと忘れられそうなのでなんとなく書いたコードを一つ.

素数を求めるアルゴリズムとして有名なのに「エラトステネスの篩(ふるい)」というのがある.

参考: エラトステネスの篩 - Wikipedia

会社でなぜか素数が話題に上がっていたのを遠目で見ていたので,Rで簡単にコーディングしてみた.もっと簡単にコーディングできると思うが,とりあえず適当に.命名が適当なのを治したい.

sieve_of_Eratosthenes <- function(max_num){
    master_vector <- 2:max_num #自然数列
    temp_num <- 1 #素数初期値(2より小さい数を適当に指定)
    return_vec <- NULL #素数列格納用
    while(temp_num < max(master_vector)){
        temp_num <- min(master_vector) #対象素数の決定
        return_vec <- c(return_vec, temp_num) #対象素数を素数列に格納
        temp_times <- floor(max(master_vector) / temp_num) #対象素数の倍数の最大値
        temp_times_vec <- c(temp_num*(1 : temp_times)) #対象素数の倍数列
        for(i in temp_times_vec){
            master_vector <- master_vector[i != master_vector]
        }
        if(!length(master_vector)) break
    }
    return(return_vec)
}

実行例:
> sieve_of_Eratosthenes(200) #200までの素数を求める
[1] 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67
[20] 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163
[39] 167 173 179 181 191 193 197 199