Loading [MathJax]/jax/output/CommonHTML/jax.js

アルゴリズム論特論(塩田) 2020年度教材 第13回

  • 出席代わりに、塩田 ( shiota@is.kochi-u.ac.jp ) 宛てにメールを出してください。
  • 件名は「アルゴリズム論特論第13回出席」としてください。

今日のテーマ

  • 中国剰余アルゴリズム
 拡張ユークリッドアルゴリズムを応用した中国剰余アルゴリズムを今日は勉強します。 暗号の分野では、離散対数問題の解法や、秘密分散法に応用される基本的なアルゴリズムです。

1. 数当てゲーム

 まずは次のゲームで遊んでみてください。 セレクトボックスで数字を選んで「答」のボタンを押せば答が表示されます。
数当てゲーム 2桁の自然数をひとつ思い浮かべてください。 その数を当てて見せましょう。
  • 3で割った余りはいくつですか 
  • 5で割った余りはいくつですか 
  • 7で割った余りはいくつですか 
 2桁の数字をループで回して条件を満たす数を表示させてるだけじゃないの、 と思かもしれませんが、もっと巨大な数でもできます。 「乱数生成」ボタンで乱数で余りを設定したら「答」ボタンを押してください。
数当てゲーム 128-bit ver. m1, m2, m3 で割った余りから数 x を当てて見せます。
  • m1= 230124716650549976185474819950998379623 で割った余りは?
  • m2= 295634491014310397963938655059927583721 で割った余りは?
  • m3= 323632775919026045574633053738759034049 で割った余りは?



 これだって、x を先に作って余りを表示して、それらしく検算を書いてるだけじゃないの、 と思うかもしれませんが、入力欄は自分でも入力できますので、 違う数字を入れてみてください。 (mi を超える数字が入力されたら mi で割った余りに取り換えます。)
 もはや全検索で求められるサイズではありませんが瞬時に答えが出ていますよね。 その仕組みを今日は勉強します。

2. 中国剰余定理・中国剰余アルゴリズム

Th.1(中国剰余定理、Chinese Remainder Theorem) mn を互いに素な 2 つの法とするとき、連立合同式
{xa(modm)xb(modn)
mod(m×n) で唯一の解 x を持つ。
証明 唯一性 x, y が共に解であれば
{xay(modm)xby(modn)
ですから、xymn の公倍数であり、gcd(m,n)=1 から
xy(mod(m×n))
存在 は次のアルゴリズムを実行します。
Algorithm 2(中国剰余アルゴリズム、Chinese Remainder Algorithm) Th.1 の状況で
  • 入力:a, b, m, n
  • 出力:x
  1. m, n を引数として拡張ユークリッドアルゴリズムを実行し
    mu+nv=1
    を満たす u, v を求める。
  2. x={a(nv)+b(mu)}%(m×n) とおく。
証明 1° より
  • modm では 1=mu+nvnv,    mu0
  • modn  では 1=mu+nvmu,   nv0
となります。わかり易く表にまとめると
numu
modm10
modn01
従って
  • modm では xa(nv)+b(mu)a×1+b×0=a
  • modn  では xa(nv)+b(mu)a×0+b×1=b
(証明終)
Ex.3 Alg.2 に従って連立合同式
{x3(mod 7 )x5(mod17)
を解いてみましょう。
Rem.4
  • 代数学用語を使って書けば、mn が互いに素のとき
    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) の情報が知りたいときにmodmmodn で計算しておいて最後に CRA を使う、 という工夫ができます。(ある意味で分割統治法になっています。)

3. 式が 3 個以上のときの中国剰余アルゴリズム

Th.5(中国剰余定理) m1, mk を互いに素な k 個の法とするとき、連立合同式
{xa1(modm1)xak(modmk)
mod(m1××mk) で唯一の解 x を持つ。
証明 唯一性は Th.1 と同様に示せます。 解は次の Alg.6Alg.8 で構成できます。
Algorithm 6(中国剰余アルゴリズム) Th.5 の状況で
  • 入力:a1, ak; m1, mk
  • 出力:x
A=a1, M=m1
for i=2 to n :
  新A= 連立合同式 {xA(modM)xai(modmi) の解  ... Alg.2 を用いて求める
  新M=M×mi
A を出力
証明 ループ変数が i のときの 新A は、連立合同式
{xa1(modm1)xai(modmi)
の解になっていて、この i 個の合同式と
xA (modM)
が同値になっています。(証明終)

 図のようなトーナメントで合同式を制覇してゆくイメージです。
トーナメントはどんな組み方をしても答えは同じになります。
Ex.7 Alg.5 に従って連立合同式
{(1)x 3 (mod 7 )(2)x 5 (mod17)(3)x11(mod37)
を解いてみましょう。Ex.3 から
(1) かつ (2) x73(mod119)
でした。ですから
{x73(mod119)x11(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
  1. M=m1××mk とおく。
  2. i=1,,k に対し、Mi=M/mi とおく。
  3. i=1,,k に対し、mi, Mi を引数として拡張ユークリッドアルゴリズムを実行し
    miui+Mivi=1
    を満たす ui, vi を求める。
  4. x=ki=1ai(Mivi)%M とおく。
証明 Mimi 以外の法の積なので、Alg.2 の証明と同様に
M1v1M2v2Mkvk
modm1100
modm2010
modmk001
が成り立ちます。従って mod mj では
xki=1ai(Mivi)aj(Mjvj)+ijai(Mivi)aj×1+ijai×0=aj
(証明終)
Ex.9 m1=3, m2=5, m3=7 のとき、
  1. M=3×5×7=105
  2. M1=5×7=35,   M2=3×7=21,   M3=3×5=15
  3. 3×(23)+35×2=1,   5×(4)+21×1=1,   7×(2)+15×1=1
  4. x=(70×a1+21×a2+15×a3)%105
 これを使ったのが今日の最初の数当てゲームです。 数字が簡単なので昔から手品に使われていたらしく、 3~5世紀ごろの作と言われる中国の数学書「孫子算経」に書かれていることから中国剰余定理と呼ばれています。
Th.10 Alg.6,Alg.8 の計算量は O(klog2M) である。 特に k が 小さく固定されている場合は O(log2M) になる。

参考

  • 中国剰余アルゴリズムデモプログラムCRA.py

まとめ

  • 互いに素な法 m1, mk については、「mod m1××mk の情報」は 「mod mi の情報の組」に読み替えられる。
  • その読み替えの計算量は log2 オーダーである。

自宅学習の例

  • デモプログラムでビット数・式の個数を変えて計算量を体感する。
  • 違う数字で数当てゲームを作ってみる。
  • html の ソースを読んで、Javascript の BigInt の使い方を覚える。

戻る