情報技術 1000以下の素数をすべて求める

2015/8/5
情報技術
~アルゴリズム演習~
2015年7月2日
笠井俊信
1000以下の素数をすべて求める
• もっとも単純な方法
– 2から1000までの整数 i を対象とする
– 2から i-1 までの数で割り切れるか?
• 割り切れる数が見つかれば素数ではない
• 少し工夫した方法
– 2から1000までの整数 i を対象とする
• 奇数のみ対象とする
– 2から i の平方根までの数で割り切れるか?
• 割り切れる数が見つかれば素数ではない
1
2015/8/5
もっとも単純な方法のアルゴリズム
• 1~Nまでの変数列(num[i])を用意
• i(調べる対象)が0~Nまで繰り返す
– num[i] = 1
配列の用意と初期化
• num[0] = 0, num[1] = 0
• i(調べる対象)が3~Nまで繰り返す
– j(約数を探す)を2~i-1まで繰り返す
• (条件分岐) i ÷ j の余りが0?
– Yesなら,num[i] = 0
• j を1増やす
約数が見つかったので j の繰り返しから抜ける
– i を1増やす
• i(調べる対象)が1~Nまで繰り返す
– (条件分岐)num[i] = 1?
• Yesなら,iを出力(素数)
結果の出力
少し工夫した方法のアルゴリズム
• i(調べる対象)が3~Nまで繰り返す
– j(約数を探す)を2~ iの平方根 まで繰り返す
• (条件分岐)i ÷2の余りが0?
– Yesなら,偶数なので何もしない
– Noなら,(条件分岐)i ÷ j の余りが0?
» Yesなら,num[i] = 0
約数が見つかったので j の繰り返しから抜ける
• j を1増やす
– i を1増やす
2
2015/8/5
素数を求める有名な解法
• エラトステネスのふるい
– もっとも小さい素数2から順に,その倍数を削
除する。
– 1000の平方根まで調べる
解法の理解
エラトステネスのふるい
3
2015/8/5
解法の理解
エラトステネスのふるい
解法の理解
エラトステネスのふるい
4
2015/8/5
解法の理解
エラトステネスのふるい
解法の理解
エラトステネスのふるい
5
2015/8/5
解法の理解
エラトステネスのふるい
解法の理解
エラトステネスのふるい
6
2015/8/5
解法の理解
エラトステネスのふるい
エラトステネスのふるい
のアルゴリズム
• i(倍数を排除する元)が2~Nの平方根ま
で繰り返す
– (条件分岐) num[i] = 0 ?
• Yesなら,素数ではないので何もしない
• Noなら,j(i を何倍するか)をi~N/i まで繰り返す
– num[i*j]=0
– jを1増やす
– i を1増やす
7
2015/8/5
ソートアルゴリズム
1.基本選択法
• 基本選択法とは?
– 数列の中から最大の数値を探すことを繰り返
し,大きい数字の位置から確定していく
5 3 9 6
9 3 5 6
9 6 5 3
8
2015/8/5
ソートのステップ
6
6
7
7
7
7
2
2
2
6
6
6
5
5
5
5
5
5
3
3
3
3
4
4
1
1
1
1
1
3
7
7
6
2
2
2
4
4
4
4
3
1
6 2 5 3 1 7 4
suu [0] [1] [2] [3] [4] [5] [6]
i
j
p
0
0
1
3
4
1
7
7
7
7
0
5
5
6
6
i ・・・ 何番目に大きい数か
j ・・・ どこまで数を調べたか
p ・・・ 1番大きい数の場所
1.基本選択法のアルゴリズム
(7個の数列のソート)
• iを0から5まで繰り返す
– 最大値の場所pにiを代入
– カウンタ2jにi+1を代入
– jをi+1から6まで繰り返す
• (条件分岐)suu[p] < suu[j]?
– Yesなら,pにjを代入
• jを1増やす
– tempにsuu[i]を,suu[i]にsuu[p]を,suu[p]にtempを代入
– iを1増やす
6 2 5 3 1 7 4
suu [0] [1] [2] [3] [4] [5] [6]
i ・・・ 何番目に大きい数か
j ・・・ どこまで数を調べたか
p ・・・ 1番大きい数の場所
9