素数を求めるアルゴリズムとして有名なのに「エラトステネスの篩(ふるい)」というのがある.
参考: エラトステネスの篩 - 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)
}
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
[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