Upload
sarah-jacobs
View
20
Download
0
Embed Size (px)
DESCRIPTION
情報数学1 第 1-3 章. 素数と素因数分解. 香川大学工学部 富永浩之 [email protected]. 概 要. ■ 素数と合成数 素数 合成数 単数 素因数 ■ 素数判定の算法 素数列 素数判定 ■ 素因数の算法 素因数分解の一意性 候補による除算の範囲 効率化 ■ エラトステネスの篩 エラトステネスの篩 ■ 素因数分解と数論的関数 約数個数 約数和 互いに素. 第 01 節 [1] 素数と合成数. ● 素数と合成数 - PowerPoint PPT Presentation
Citation preview
概 要
■ 素数と合成数 素数 合成数 単数 素因数
■ 素数判定の算法 素数列 素数判定
■ 素因数の算法 素因数分解の一意性 候補による除算の範囲 効率化
■ エラトステネスの篩 エラトステネスの篩
■ 素因数分解と数論的関数 約数個数 約数和 互いに素
第 01 節 [1] 素数と合成数● 素数と合成数
素数 約数が 2 個 1 と自分自身以外に約数を持たない正整数
単数 約数が 1 個 1 のみ合成数 約数が 3 個以上 その他 (1 は素数でも合成数でもない )
● 素数数列
・ 明確な規則性がなく、 k 番目の素数 p(k) を一般項では表せない 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
59, ‥ ・ 100 以下の素数は 25 個
● 素数数列
・ 素数は無限に存在 ( 有限すなわち最大の素数が存在と仮定すると矛盾 )
ユークリッドによる証明 全ての素数の積 +1 は素数であり、最初に仮定した最大の素数より
も大きい
第 01 節 [2] 素数と合成数● 素数分布
・ だんだん出現頻度が減っていく ( 大きい数はほとんどが合成数 )◎ 素数定理
● 素数に関する定理
◎ ウィルソンの定理 p が素数 ⇔ (p-1) ! +1 が p で割り切れる 素数を判定する簡単な必要十分条件であるが、計算効率が悪すぎる
● 素数に関する未解決問題
○ 双子素数 p, p+2 がともに素数となる組は無限に存在
○ ゴールドバッハの予想 4 以上の全ての偶数は、 2 つの素数の和で表せる
第 02 節 [1] 素因数と素因数分解● 素因数分解
2 以上の正整数を素数の積の形に表したもの (素数は自分自身のみの形)
36 = 2×2×3×3 210 = 2×3×5×7 17 = 17
個々の素数を重複も数えて素因数という 36 は、異なる素因数 2 と 3 を持ち、 2,2,3,3 の 4 個の素因数を持つ同じ素因数は巾乗にまとめて記述 36 = 2^2 × 3^21 の素因数分解は、 1 のみの形とする (1 は素因数でないが、例外とし
て )
● 素因数分解の一意性
順序を無視して、 2 以上の正整数は、唯一の素因数分解を持つ途中でどのように積の形に分解していっても最後は同じ形に辿り着く 36 = 4×9 = (2×2)×(3×3) → 2×2×3×3 ← 36 = 6×6 = (2×3)×(2×3)
複素数の世界だと 10 = 2×5= ( 3+i ) (3-i)
第 02 節 [2] 素因数と素因数分解● 素因数分解の計算量
素因数分解には効率的な算法が ( 今のところ ) 見つかっていない
適当に与えられた正整数を素因数分解するには、小さい方の素数から順に、実際に割り切れるかどうか調べていくしかな
い。
特に、 2 つの異なる大きな素数の積であるような合成数の素因数分解には、
膨大な計算時間が必要となる。
100 桁以上の 2 つの素数の積である合成数だと、数億年かかるかも
大きな数の素因数分解が「実質的に計算不可能」という性質は、公開鍵暗号系の 1 つである RSA 式公開鍵暗号系に応用されている。
大きな素数を知っていることが軍事機密や企業秘密になる!
第 03 節 [1] 素数判定の算法2 以上の正整数 n を入力とする。
[1] まず、 q←2 と代入し、 n が q で割り切れるかどうか調べる。 割り切れれば合成数である (処理終了 ) 。[2] 次に、 q←3 と代入し、 n が q で割り切れるかどうか調べる。 割り切れれば合成数である (処理終了 ) 。
[3] 以降は、奇数を順に q に代入し、 n が q で割り切れるか調べていく。
ここで、 次の奇数 q←q+2 と値を更新しながら、調べていくことになる。
[4] 除数が q^2> n となったとき、素因数が存在しないことが分かる。
すなわち、素数であると判定される (処理終了 ) 。
[5] q^2 n≦ のとき、 n が q で割り切れるかどうか調べる。 割り切れれば合成数である (処理終了 ) 。 割り切れなければ、 [3] に戻る。
n の最小の素因数を p とすれば、 n/p p ≧ より、 n p^2 ≦ で √ n p≦
第 03 節 [2] 素数判定の算法入力 n = 77
[1] q←2 として、 q=2 で割ってみると割り切れない。 [2]へ進む。
[2] q←3 として、 q=3 で割ってみると割り切れない。 [3]へ進む。
[3] q←3+2 = 5 とする。 [4]へ進む。 [4] q^2 = 5^2 = 25 77≦ より、 [5]へ進む。 [5] q=5 で割ってみると割り切れない。 [3] に戻る。 [3] q←5+2 = 7 とする。 [4]へ進む。 [4] q^2 = 7^2 = 49 77≦ より、 [5]へ進む。 [5] q = 7 で割ってみると割り切れる。 よって、合成数であると判定され、処理は終了する。入力 n = 37
[1] q←2 として、 q=2 で割ってみると割り切れない。 [2]へ進む。
[2] q←3 として、 q=3 で割ってみると割り切れない。 [3]へ進む。
[3] q←3+2 = 5 とする。 [4]へ進む。 [4] q^2 = 5^2 = 25 37 ≦ より、 [5]へ進む。 [5] q=5 で割ってみると割り切れない。 [3] に戻る。 [3] q←5+2 = 7 とする。 [4]へ進む。 [4] q^2 = 7^2 = 49> 37 より、素因数が存在しないと分か
る。 よって、素数と判定され、処理は終了する。
第 04 節 [1] 素因数分解の算法 [1] 被除数 n を入力 とする。初期化として、除数を q←2 とし、添字を k = 0 とす
る。 [2] 除数 q の 2 乗 q^2 と被除数 n の大小を比較する。 [2-1][2-2] の場合分けに進む。 [2-1] q^2> n のとき、 n には q 以上の素因数が存在しない。 [4] に進む。 [2-2] q^2 n≦ のとき、 [3] に進む。
[3] n が q で割り切れるかどうか調べ、 [3-1][3-2] の場合分けに進む。 [3-1] n が q で割り切れるとき、 q は n の素因数である。 添字の更新 k←k+1 の後に、 k 番目の素因数を d_k←q と代入する。 以降の計算では、除数 q はそのままで、商を次の被除数 n←n/q とし、再び [3]
を行う。 [3-2] n が q で割り切れないとき、 n に q 以下の素因数はない。 以降の計算では、被除数 n はそのままで、次の除数を q を求め、再び [2] を行
う。 ただし、次の除数は q1=2, q2=3 を初期値とし、以降は q←q+2 と求める。 [4] n=1 かどうかを調べる。 [4-1] n≠1 のとき、 n は素数となる。 添字の更新 k←k+1 の後に、 d_k←n と代入して、終了処理 [5] に進む。 [4-2] n=1 のとき、そのまま終了処理 [5] に進む。
[5] d1, d2, ‥ を出力として並べれば、素因数分解 n = d1×d2×‥ が得られる。 添字 k の値は、素因数の個数を表している。
第 05 節 [1] 素因数分解の計算過程
被除数 ① 182 91 = = = 13 =
二乗以上 ④ ○ ○ ○ ○ ×二乗 ③ 4 9 25 49 81除数 ② 2 = 3 5 7 = 9整除判定 ⑤ ○ × × × ○ ×1超上 ⑤' ○添字 ⑥ 1 2 3素因数 ⑦ 2 7 13
被除数 ① 375 = 12
5 = 25 5 1 =
二乗以上 ④ ○ ○ ○ ×二乗 ③ 4 9 25 49除数 ② 2 3 = 5 = = = 7整除判定 ⑤ × ○ × ○ ○ ○ ×1超上 ⑤' ×添字 ⑥ 1 2 3 4素因数 ⑦ 3 5 5 5
第 06 節 [1] 素数判定と素因数分解の応用● 3 の倍数の除数列からの除去素数判定の算法では、 2 より大きい偶数を除いた奇数列を除数に選んだが、3 より大きい 3 の倍数も省略することができる。2 でも 3 でも割りきれない数は、 6k±1 という一般形で表される。したがって、 q の次の除数として、2,3,5 の後からは q←q+2, q←q+4 と交互に計算していけばよい。すなわち、 q=5 までを初期値とし、以降は q4=q3+2=7, q5=q4+4=11, ‥ と求めることにな
る。除数の列を具体的に列挙すると、 2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, ‥ となる。
この方法は、素因数分解の算法における除数にも適用できる。さらに、 5 の倍数も省略しようとすると、多くが既に 2,3 の倍数として省略されているので、25,55,85, ‥ にしか効果がない。しかも、除数を更新する規則が複雑になるので、かえって非効率となる。
第 06 節 [2] 素数判定と素因数分解の応用● 最小の素因数の出力 素数判定の算法と全く同様最後の出力において、「合成数」か「素数」かとするのではなく、その時点での除数 q の値を出力すればよい。
● 最大の素因数の出力 素因数分解の算法とほぼ同様入力 n が 1 ならば、そのまま 1 を出力する。入力 n が 2 の累乗ならば、 2 を出力する。それ以外のとき、素因数分解の算法で、除数 q による反復に進む。ただし、途中での素因数の出力は行わない。
除数 q による反復が終了した後、n> 1 ならば、 n が最大の素因数なので、 n を出力する。n = 1 ならば、直前の除数が最大の素因数であるが、 除数 q は既に更新されているので、以前の値 q-2 を出力する。
第 07 節 [1] エラトステネスの篩● エラトステネスの篩素数を列挙する素朴な算法である。素朴だが、これより効率的な方法は知られていない。
準備段階として、 2 以上の自然数を小さい順に ( 調べたい範囲で ) 全て書き出しておく。
まず、 2 を素数として確定し、 2 より大きい 2 の倍数 4, 6, 8, ‥ を合成数として全て消去する。
次に、 3 を素数として確定し、 3 より大きい 3 の倍数 6, 9, 12, ‥ を全て消去する。その次に、消去されている 4 を飛ばし、 5 を素数として確定し、 5 より大きい 5 の倍数 10, 15, 20, ‥ を全て消去する。
このように、未確定部分で、消去されていない最小の数を素数として確定し、その倍数を消去していく操作を続けていくと、最後に素数の完全な列挙ができる。
素数 p の倍数のうち、 p^2 未満は、既に他の素数の倍数として消去されているから、
実際には、 p^2 から消去を始める。逆に、 p まできたら p^2 未満で残っている数は素数である。n までの範囲で、素数を列挙する場合は、√ n 以下の倍数まで調べればよい。
第 07 節 [2] エラトステネスの篩1 2 3 4 2 5 6 2 7 8 2 9 3 10 2
11 12 2 13 14 2 15 3 16 2 17 18 2 19 20 221 3 22 2 23 24 2 25 5 26 2 27 3 28 2 29 30 231 32 2 33 3 34 2 35 5 36 2 37 38 2 39 3 40 241 42 2 43 44 2 45 5 46 2 47 48 2 49 7 50 251 3 52 2 53 54 2 55 5 56 2 57 3 58 2 59 60 261 62 2 63 3 64 2 65 5 66 2 67 68 2 69 3 70 271 72 2 73 74 2 75 5 76 2 77 7 78 2 79 80 281 3 82 2 83 84 2 85 5 86 2 87 3 88 2 89 90 291 7 92 2 93 3 94 2 95 5 96 2 97 98 2 99 3 10
02
101
102
2 103
104
2 105
5 106
2 107
108
2 109
110
2
111
3 112
2 113
114
2 115
5 116
2 117
3 118
2 119
7 120
2
121
11 122
2 123
3 124
2 125
5 126
2 127
128
2 129
3 130
2
131
132
2 133
7 134
2 135
5 136
2 137
138
2 139
140
2
141
3 142
2 143
11 144
2 145
5 146
2 147
3 148
2 149
150
2
151
152
2 153
3 154
2 155
5 156
2 157
158
2 159
3 160
2
161
7 162
2 163
164
2 165
5 166
2 167
168
2 169
13 170
2
171
3 172
2 173
174
2 175
5 176
2 177
3 178
2 179
180
2
181
182
2 183
3 184
2 185
5 186
2 187
11 188
2 189
3 190
2
191
192
2 193
194
2 195
5 196
2 197
198
2 199
200
2
第 08 節 [1] エラトステネスの篩の応用
● エラトステネスの篩の算法[1] n 以下の正整数に対し、結果を格納する箱を用意する。[2] m = [√n] とする。 p←2 とし、 p m ≦ の間、以下を実行する。[3] q←p^2 から n までの各整数に対し、 p の倍数に印を付けていく。 これは、 q←q+p と更新しながら、 q に印を付けていけばよい。[4] 印のない正整数は素数であり、これらを小さい方から列挙する。
● 範囲内の素数列の列挙の算法[1] N1 以上 N2 以下の正整数に対し、結果を格納する箱を用意する。[2] m = [√N2] までの正整数に対し、エラトステネスの篩を実行し、 m 以下の素数を求める。これを素数列 p(k) とおく。[3] 各 p(k) について、 N1 未満の最大の倍数 s(k) = (N1-1)-(N1-1)%p(k) を求
め、 s(k) の次からの p(k) の倍数 s(k)+p(k), s(k)+2p(k), ‥ を N2 までの範囲で消去
する。[4] 消去されずに残った正整数は素数であり、これらを小さい方から列挙する。