アルゴリズム論特論(塩田) 2020年度教材 第13回
- 出席代わりに、塩田 ( shiota@is.kochi-u.ac.jp ) 宛てにメールを出してください。
- 件名は「アルゴリズム論特論第13回出席」としてください。
今日のテーマ
拡張ユークリッドアルゴリズムを応用した中国剰余アルゴリズムを今日は勉強します。
暗号の分野では、離散対数問題の解法や、秘密分散法に応用される基本的なアルゴリズムです。
1. 数当てゲーム
まずは次のゲームで遊んでみてください。
セレクトボックスで数字を選んで「答」のボタンを押せば答が表示されます。
2桁の数字をループで回して条件を満たす数を表示させてるだけじゃないの、
と思かもしれませんが、もっと巨大な数でもできます。
「乱数生成」ボタンで乱数で余りを設定したら「答」ボタンを押してください。
これだって、
x を先に作って余りを表示して、それらしく検算を書いてるだけじゃないの、
と思うかもしれませんが、入力欄は自分でも入力できますので、
違う数字を入れてみてください。
(
mi を超える数字が入力されたら
mi で割った余りに取り換えます。)
もはや全検索で求められるサイズではありませんが瞬時に答えが出ていますよね。
その仕組みを今日は勉強します。
2. 中国剰余定理・中国剰余アルゴリズム
Th.1(中国剰余定理、Chinese Remainder Theorem) m と n を互いに素な 2 つの法とするとき、連立合同式
{x≡a(modm)x≡b(modn)
は mod(m×n) で唯一の解 x を持つ。
証明 唯一性 x,
y が共に解であれば
{x≡a≡y(modm)x≡b≡y(modn)
ですから、
x−y は
m と
n の公倍数であり、
gcd(m,n)=1 から
x≡y(mod(m×n))
存在 は次のアルゴリズムを実行します。
Algorithm 2(中国剰余アルゴリズム、Chinese Remainder Algorithm) Th.1 の状況で
- m, n を引数として拡張ユークリッドアルゴリズムを実行し
mu+nv=1
を満たす u, v を求める。
- x={a(nv)+b(mu)}%(m×n) とおく。
証明 1° より
- modm では 1=mu+nv≡nv, mu≡0
- modn では 1=mu+nv≡mu, nv≡0
となります。わかり易く表にまとめると
従って
- modm では x≡a(nv)+b(mu)≡a×1+b×0=a
- modn では x≡a(nv)+b(mu)≡a×0+b×1=b
(証明終)
Ex.3 Alg.2 に従って連立合同式
{x≡3(mod 7 )x≡5(mod17)
を解いてみましょう。
答え
- 7, 17 を引数として拡張ユークリッドアルゴリズムを実行し
7×5+17×(−1)=1
- x={3(17×(−2))+5(7×5)}%(7×17)=73
Rem.4
- 代数学用語を使って書けば、m と n が互いに素のとき
Z/(m×n)Z |
⟶ |
Z/mZ ⊕ Z/nZ |
 |
|
 |
x |
⟼ |
(x%m,x%n) |
が環の同型になる、というのが中国剰余定理です。
- mod(m×n) の情報は、
modm の情報とmodn の情報の組に分割できる、とも言えます。
- 暗号で用いるほどのサイズになると
mod(m×n) の計算よりmodm,modn の計算の方が高速に行えますので、
mod(m×n) の情報が知りたいときにmodm とmodn で計算しておいて最後に CRA を使う、
という工夫ができます。(ある意味で分割統治法になっています。)
3. 式が 3 個以上のときの中国剰余アルゴリズム
Th.5(中国剰余定理) m1, ⋯ mk を互いに素な k 個の法とするとき、連立合同式
{x≡a1(modm1)⋮x≡ak(modmk)
は mod(m1×⋯×mk) で唯一の解 x を持つ。
証明 唯一性は
Th.1 と同様に示せます。
解は次の
Alg.6 や
Alg.8 で構成できます。
Algorithm 6(中国剰余アルゴリズム) Th.5 の状況で
- 入力:a1, ⋯ ak; m1, ⋯ mk
- 出力:x
A=a1,
M=m1
for
i=2 to
n :
新
A= 連立合同式
{x≡A(modM)x≡ai(modmi) の解
... Alg.2 を用いて求める
新
M=M×mi
A を出力
証明 ループ変数が
i のときの 新
A は、連立合同式
{x≡a1(modm1)⋮x≡ai(modmi)
の解になっていて、この
i 個の合同式と
x≡ 新A (mod 新M)
が同値になっています。(証明終)
※ 図のようなトーナメントで合同式を制覇してゆくイメージです。
トーナメントはどんな組み方をしても答えは同じになります。
Ex.7 Alg.5 に従って連立合同式
{(1)x≡ 3 (mod 7 )(2)x≡ 5 (mod17)(3)x≡11(mod37)
を解いてみましょう。Ex.3 から
(1) かつ (2) ⇔ x≡73(mod119)
でした。ですから
{x≡73(mod119)x≡11(mod 37 )
を解けばよく
119×14+37×(−45)=1
から
x=(73×37×(−45)+11×119×14)%4403=2453
次のアルゴリズムは
k 個まとめて解くやり方です。
Algorithm 8(中国剰余アルゴリズム) Th.5 の状況で
- 入力:a1, ⋯ ak; m1, ⋯ mk
- 出力:x
- M=m1×⋯×mk とおく。
- 各 i=1,⋯,k に対し、Mi=M/mi とおく。
- 各 i=1,⋯,k に対し、mi, Mi を引数として拡張ユークリッドアルゴリズムを実行し
miui+Mivi=1
を満たす ui, vi を求める。
- x=k∑i=1ai(Mivi)%M とおく。
証明 Mi は
mi 以外の法の積なので、
Alg.2 の証明と同様に
| M1v1 | M2v2 | ⋯ | Mkvk |
modm1 | 1 | 0 | ⋯ | 0 |
modm2 | 0 | 1 | ⋯ | 0 |
⋮ | ⋮ | ⋮ | ⋱ | ⋮ |
modmk | 0 | 0 | ⋯ | 1 |
が成り立ちます。従って mod
mj では
x≡k∑i=1ai(Mivi)≡aj(Mjvj)+∑i≠jai(Mivi)≡aj×1+∑i≠jai×0=aj
(証明終)
Ex.9 m1=3,
m2=5,
m3=7 のとき、
- M=3×5×7=105
- M1=5×7=35, M2=3×7=21, M3=3×5=15
- 3×(−23)+35×2=1, 5×(−4)+21×1=1, 7×(−2)+15×1=1
- x=(70×a1+21×a2+15×a3)%105
これを使ったのが今日の最初の数当てゲームです。
数字が簡単なので昔から手品に使われていたらしく、
3~5世紀ごろの作と言われる中国の数学書「孫子算経」に書かれていることから中国剰余定理と呼ばれています。
Th.10 Alg.6,Alg.8 の計算量は O(klog2M) である。
特に k が 小さく固定されている場合は O(log2M) になる。
まとめ
- 互いに素な法 m1, ⋯ mk については、「mod m1×⋯×mk の情報」は
「mod mi の情報の組」に読み替えられる。
- その読み替えの計算量は log2 オーダーである。
自宅学習の例
- デモプログラムでビット数・式の個数を変えて計算量を体感する。
- 違う数字で数当てゲームを作ってみる。
- html の ソースを読んで、Javascript の BigInt の使い方を覚える。
戻る