何かにおいて、2人のうちどちらが先にするかを決めたいとき、よくやるのはジャンケンである。サッカーの試合のときは、コイントス(開始前に審判の投げたコインの表裏で、場所や先行を決める)が行なわれる。
2人が同じ場にいなくて、どちらが先にするかを電話で決めたいときは、どうしたらいいだろう。ジャンケンを言葉でやるという方法もあるが、同時に発しては聞き取りにくいし、遅出しした、しないでもめる。コイントスは、相手がコインを投げた場合、自分が「表」と言えば、「残念でした、裏でした」と言われるに違いない。 というわけで、電話ではジャンケンもコイントスも使えない。何かいい方法があるだろうか、ということが今回の話題である。 この問題について、Blum(ブラム)という人の考え出した方法があり、「暗号がわかる本」(イオタゼミ著:オーム社)という本で紹介されている。「法による素因数分解」という、ちょっとした数学を使うのである。少々面倒ですぐには理解できないが、これがおもしろい原理である。受け売りであるが、他人に話せずにはおられない。 太郎と花子が、電話でコイントス(太郎がコインを投げて、花子が表か裏を言い当てれば花子の勝ち、はずれれば太郎の勝ち)をしたいのであるが、先に述べたようにこれは電話ではできない。そこで、コイントスと同じことを、別な方法でやろうというのである。 話をわかり易くするために、先に要点となる状況を述べておきたい。 ○ 花子が、ある問題を解けたら花子の勝ち、解けなかったら太郎の勝ち、とする。 ○ この問題は、2つの数 a と b を知っていれば解けるが、1つしか知らないと解けないものである。 花子は a、b のどちらか1つしか知らないので、問題が解けない。 太郎は a、b の両方を知っていて、花子にどちらかを教えなければならないのだが、花子がどちらの数を知っているのかは知らない。 ○ だから、太郎が花子の知らない数を教えてしまうと、花子は問題が解けるので花子の勝ち、花子が既に知っている数を教えたら、花子は問題が解けないので太郎の勝ち、となる。 花子に出される問題とは、太郎が勝手に決めた2つの素数の積 n を、逆に2つの整数の積にせよ(素因数分解するという)というものであるが、上のような状況をどのようにして作るか、ということになる。 理解を助けるために、わかりやすい小さな数値を用いて具体例で行うが、一般論を右枠に示しておく。
最後の (4)のところを詳しく述べる。 a2 も b2 も n で割ったとき、余りが同じ r である ということは、 a2−r も b2−r も n で割りきれる ということである。だから、これらの差 (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 の約数で割り切れなくてはならない。したがって、 a+b と n の最大公約数、および a−b と n の最大公約数 が n の約数である p か q のどちらかになる、というわけである。 実際にこれを行うには、太郎は(3)の手順で計算機を使わないと大変である(離散対数問題の困難性)。出された問題を解く花子の方は電卓程度でよいだろう。いずれにしても、2つの素数 p と q を相当大きな数に選ばなくてはならないだろうという気がするが、Blum(ブラム)氏の方法の理屈はとてもおもしろい。 (2005. 1.30)
|
素因数分解の困難性: 「n=840036709 は2つの素数の積であるが、その2つの素数を見つけよ」 といわれたらどうするか。 いずれにしても計算機(パソコン)を使わなくてはならないが、私なら nの平方根以下の素数をすべて求めるプログラムでも作って、片っ端から求めた素数で n を割ってみるだろう。 n がこの程度の大きさなら、なんとかできる。だが、n が 300 桁くらいのものを与えられたら、現在のどんな計算機を用いても不可能(少なくとも地球が消滅してしまわない時間内には)で、このことが、現代の暗号の原理とされている。
|