・ 電話でジャンケン                 S.H氏

 講談社の読書人の雑誌「本」10月号をパラパラとめくっていたら、一松 信さんの書かれ
た「電話でジャンケンをする」という話に目が止まった。

 全員一同に会してジャンケンするという状況を、電話という逐次交互の交信しかできない
道具を使って、どのようにジャンケンをするかという問題に興味を引かれた。

 全員が一同に会していれば、多少手の出し方に時間差があっても公平に勝負はつくが、
電話だと、いくら同時にジャンケンの手を言おうとしても、多少の時間差はやむを得ず、決
定的な勝負の分かれにもなりうる。イントロクイズのように、相手のわずかな出だしの発音
で手の出し方を微妙に変えることが可能だからだ。

 一松先生は、次のような方法を紹介している。

 電話によるジャンケンの仕方

 AさんとBさんがジャンケンするものとする。2人のジャンケンなので、二者択一でよい。

(1) AさんはBさんに、非常に大きい数(素因数2個の積)を送る。

(2) AさんはBさんに、

      「2つの素因数のうち、大きい方を 4 で割った余りは、『1』か『3』か?

   を問う。

(3) Aさんは事前に答えを知っており、Bさんは知らない。Bさんの答えの如何によって互
   いの勝ち負けが決まる。

(4) Bさんの答えが正しければ、Bさんの勝ち、Bさんの答えが間違っていれば、Aさんの
   勝ちとなる。

例 AさんとBさんが電話でジャンケンをすることになった。Aさんは、Bさんに「828263
  という数を送った。Bさんは瞬時に、この数を2つの素因数に分解することはできないの
  で、当てずっぽうに答えることになる。「1」と答えるも「3」と答えるも確率的には半々で
  ある。ちょうどこの状態は、2人がコイントスをする状況に似ている。いまBさんは、「1」
  と答えたとする。果たして、Aさん、Bさんの勝負は如何に?

   Aさんは、828263 という数が、971×853 と素因数分解されることを知っている。
  (むしろ、971×853 を計算して、828263 という数を作り出したと言った方が正確
   かもしれない。)

   したがって、971を4で割った余りは、3 なので、Bさんの答えは間違いとなり、Aさん
  の勝ちとなる。

 上記の例は、あくまでも例であって、6桁程度の数ではジャンケンの平等性は保証されな
いかもしれない。ある程度の数だったら、パソコンで瞬時に素因数分解できるからだ。

 表計算ソフト Excel の VBA を用いると、次のようなプログラムで素因数分解ができる。
私の愛用のプログラムの一つである。

Function f(n, d)
If n < d * d Then
f = n
Else
If n - Int(n / d) * d = 0 Then
f = d & "x" & f(n / d, d)
Else
If d = 2 Then
d = 3
Else
If d = 3 Then
d = 5
Else
If d Mod 6 = 1 Then d = d + 4 Else If d Mod 6 = 5 Then d = d + 2
End If
End If
f = f(n, d)
End If
End If
End Function


 Excel を起動し、[ツール]−[マクロ]−[Visual Basic Editor] とクリックして、Editor
を起動し、[挿入]−[標準モジュール] を選択して、上記を記述すればよい。後は、Excelの
任意のセルに、例えば、 =f(828263,2) と打ち込むと、瞬時に、853×971 と素因
数分解してくれる。

 電話だと、相手がパソコンを使っているかどうか分からないので、パソコンを使って直ぐ
素因数分解できる程度の数では勝負の公平さは保てない。ある程度大きな数である必要
がある。

 「時間をかければ計算(素因数分解)できるが、直ぐにはできない」といった、計算の手間
の時間差を利用したセキュリティ方法が、現在行われている「公開鍵暗号方式」と呼ばれる
ものである。(→ 参考:公開鍵暗号の作り方


 一松先生の、とても面白いジャンケン方法に出会い、公開鍵暗号がよく理解でき感動しま
した!


                                             投稿一覧に戻る