Golangのチュートリアル(A Tour of Go)を一通りやり終えたので、実力試しとしてエラトステネスの篩を実装してみました。
Pythonでもう既に実装しているのですがGoでも実装してみます。([Python]素数を求めてみる)
開発環境には前回書いた記事(DockerでGolangの環境を構築する)で作成したものを使っています。
#動作環境
Windows10 Pro
Docker for windows
#エラトステネスの篩の実装
Wikipediaに書いてあるアルゴリズムを元に実装しました。
package main
import(
"fmt"
"math"
)
//配列の特定の要素を削除する関数
func remove(s_list []int, index int) (tmp []int) {
tmp = append(s_list[:index],s_list[(index+1):]...)
return
}
func get_prime(number int) ([]int,int){
//初期化
prime_list := []int{}
search_list := []int{}
//2からnumberまでの数字の配列を作る
for i := 2; i < number+1; i++{
search_list = append(search_list,i)
}
//探索リストの先頭値が√numberを超えたら終了
limit := int(math.Sqrt(float64(number)))
for search_list[0] <= limit{
//探索リストの先頭を素数リストに移動
p_num := search_list[0]
prime_list = append(prime_list,p_num)
//探索リストの先頭を削除
search_list = remove(search_list,0)
//p_numの倍数を探索リストから篩落とす
search_list_length := len(search_list)
tmp := []int{}
for i := 0; i < search_list_length; i++{
if search_list[i] % p_num != 0{
tmp = append(tmp,search_list[i])
}
}
search_list = tmp
}
//探索リストの残りを素数リストに追加
prime_list = append(prime_list,search_list...)
return prime_list,len(prime_list)
}
func main(){
list,count := get_prime(100)
fmt.Println(list)
fmt.Printf("count:%d個\n",count)
}
golangには特定の要素を削除する関数が無いみたいなのでremove関数を作成しています。
削除したい要素より前の配列と後の配列を合体させてるだけです。
golangでは変数を初めて宣言する時に「a := 1」のように 「=」の前に「:(コロン)」を付けないと、「未定義の変数やないか!!」という風に怒られてしまいます。
何回も怒られました^^;
#実行結果
root@0c296a35f6f5:/go/src/app# go run Eratosthenes.go
[2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97]
count:25個
正しく素数を求められていますね。
Pythonで作成したプログラムの実行結果と比較しても同じだったので正しく求められていると思います。
以上です
特に躓くことなく実装できました。C言語に似たような感じだったのですんなり理解できましたね。
いつかGoでapiサーバとか作ってみたいですね