> 『数学的思考(?)エッセイ』 の試み

76. 電話でコイントス
 何かにおいて、2人のうちどちらが先にするかを決めたいとき、よくやるのはジャンケンである。サッカーの試合のときは、コイントス(開始前に審判の投げたコインの表裏で、場所や先行を決める)が行なわれる。
 2人が同じ場にいなくて、どちらが先にするかを電話で決めたいときは、どうしたらいいだろう。ジャンケンを言葉でやるという方法もあるが、同時に発しては聞き取りにくいし、遅出しした、しないでもめる。コイントスは、相手がコインを投げた場合、自分が「表」と言えば、「残念でした、裏でした」と言われるに違いない。
 というわけで、電話ではジャンケンもコイントスも使えない。何かいい方法があるだろうか、ということが今回の話題である。

 この問題について、Blum(ブラム)という人の考え出した方法があり、「暗号がわかる本」(イオタゼミ著:オーム社)という本で紹介されている。「法による素因数分解」という、ちょっとした数学を使うのである。少々面倒ですぐには理解できないが、これがおもしろい原理である。受け売りであるが、他人に話せずにはおられない。

 太郎と花子が、電話でコイントス(太郎がコインを投げて、花子が表か裏を言い当てれば花子の勝ち、はずれれば太郎の勝ち)をしたいのであるが、先に述べたようにこれは電話ではできない。そこで、コイントスと同じことを、別な方法でやろうというのである。
 話をわかり易くするために、先に要点となる状況を述べておきたい。

 ○ 花子が、ある問題を解けたら花子の勝ち、解けなかったら太郎の勝ち、とする。
 ○ この問題は、2つの数 a と b を知っていれば解けるが、1つしか知らないと解けないものである。 花子は a、b のどちらか1つしか知らないので、問題が解けない。 太郎は a、b の両方を知っていて、花子にどちらかを教えなければならないのだが、花子がどちらの数を知っているのかは知らない。
 ○ だから、太郎が花子の知らない数を教えてしまうと、花子は問題が解けるので花子の勝ち、花子が既に知っている数を教えたら、花子は問題が解けないので太郎の勝ち、となる。

 花子に出される問題とは、太郎が勝手に決めた2つの素数の積 n を、逆に2つの整数の積にせよ(素因数分解するという)というものであるが、上のような状況をどのようにして作るか、ということになる。
 理解を助けるために、わかりやすい小さな数値を用いて具体例で行うが、一般論を右枠に示しておく。


具体例 一般論
(1)  まず、太郎が勝手に2つの素数 1329 を選ぶ。そして、その積 13×29=377 を花子に伝える。  まず、太郎が勝手に2つの素数 を選ぶ。そして、その積 p×q= を花子に伝える。
(2)  このままでは、花子は素因数分解できない。そこで、花子は好きな数 120 を決め、1202=14400 を 377 で割ると、商は 38 で、余りは 74 を得るが、余り 74 を太郎に伝える。
 一般には、n は大きな数なので、花子は素因数分解できない。そこで、花子は好きな数 を決め、a2 を n で割ったっときの余りを とするとき、r を太郎に伝える。
(3)  太郎は、74 に最初の 377 の何倍かを加えた数が、正の整数の2乗になるものを、次のように計算機で調べる。
 x2=74+0×377 より x= 8.6… ダメ
 x2=74+1×377 より x=21.2… ダメ
 x2=74+2×377 より x=28.7… ダメ
 x2=74+3×377 より x=34.7… ダメ
    …
 x2=74+10×377 より x=62   ◎
    …
 x2=74+38×377 より x=120  ◎

 ここで得られる2つの数 62120 のうち、どちらか1つを花子に教える。
 太郎は、r に最初の n の何倍かを加えた数が、正の整数の2乗になるものを、計算機で調べる。
 x2=r+0×n
 x2=r+1×n
 x2=r+2×n
 x2=r+3×n
    …
 x2=r+k1×n より x=b
    …
 x2=r+k2×n より x=c

 n が2つの素数の積のときは、このような正の整数が2つ存在するのだそうである(なぜだ? → 3つ以上あるわけがない。なぜなら、n の約数が 1、n を除くと 2つしかないから)。
 ここで得られる2つの正の整数 b、c のうちの1つは花子が使った a である。太郎には、どちらが a に等しいのかはわからない。 b を花子に教えるとする。
(4)  もし、太郎が教えた数が 62 であれば、花子が先に用いた 120 の数とを用いて
  120+62=182377 の最大公約数
あるいは、
  120-62=58377 の最大公約数
を求める。この場合、
 182=2×7×13、 58=と2×29
なので、これらと 377 の最大公約数より、それぞれ 1329 を得る。よって、花子は
  377=13×29
のように素因数分解でき、花子の勝ちとなる。
 もし、太郎が教えた数が 120 であれば、花子は上のようなことができない。よって、377 の素因数分解ができないので、太郎の勝ちとなる。
 もし、太郎が教えた数 でなければ、花子は
   の最大公約数
あるいは、
   の最大公約数
を求めると、それらが最初太郎が選んだ素数 になるので、花子は n の素因数分解ができ、花子の勝ちになる。
 もし、太郎が教えた数が a であれば、花子は上のようなことができない。よって、n の素因数分解ができないので、太郎の勝ちとなる。

 最後の (4)のところを詳しく述べる。
 22 も n で割ったとき、余りが同じ である
ということは、
 2−r2−rn で割りきれる
ということである。だから、これらの差
 (a2−r)−(b2−r)= a2−b2 は n で割りきれる
でなくてはならないが、
 a2−b2= (a+b)(a−b)
なので、  (a+b)(a−b)n で割り切れる
 ところが、(a+b) および (a−b) は n で割り切れないので、(a+b) および (a−b) が n の約数で割り切れなくてはならない。したがって、
   の最大公約数、および  の最大公約数
が n の約数である のどちらかになる、というわけである。

 実際にこれを行うには、太郎は(3)の手順で計算機を使わないと大変である(離散対数問題の困難性)。出された問題を解く花子の方は電卓程度でよいだろう。いずれにしても、2つの素数 p と q を相当大きな数に選ばなくてはならないだろうという気がするが、Blum(ブラム)氏の方法の理屈はとてもおもしろい。
(2005. 1.30)
 素因数分解の困難性: 「n=840036709 は2つの素数の積であるが、その2つの素数を見つけよ」 といわれたらどうするか。 いずれにしても計算機(パソコン)を使わなくてはならないが、私なら nの平方根以下の素数をすべて求めるプログラムでも作って、片っ端から求めた素数で n を割ってみるだろう。 n がこの程度の大きさなら、なんとかできる。だが、n が 300 桁くらいのものを与えられたら、現在のどんな計算機を用いても不可能(少なくとも地球が消滅してしまわない時間内には)で、このことが、現代の暗号の原理とされている。

**********************************************************************************
Copyright(C) Yokahiyokatoki