・ 電話でジャンケン 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
と素因
数分解してくれる。
電話だと、相手がパソコンを使っているかどうか分からないので、パソコンを使って直ぐ
素因数分解できる程度の数では勝負の公平さは保てない。ある程度大きな数である必要
がある。
「時間をかければ計算(素因数分解)できるが、直ぐにはできない」といった、計算の手間
の時間差を利用したセキュリティ方法が、現在行われている「公開鍵暗号方式」と呼ばれる
ものである。(→ 参考:公開鍵暗号の作り方)
一松先生の、とても面白いジャンケン方法に出会い、公開鍵暗号がよく理解でき感動しま
した!