太郎くんは $n$ 次元ベクトル $\bm{a}=(a_1,\dots,a_n)$ を持っています。

花子さんは $n$ 次元ベクトル $\bm{b}=(b_1,\dots,b_n)$ を持っています。

二人は二つのベクトルの内積 $\bm{a}\cdot \bm{b} = \sum_{i=1}^n a_ib_i$ を知りたいと思っています。

ただし太郎くんは $\bm{a}\cdot \bm{b}$ の値を花子さんと共有することを除いて、 $\bm{a}$ についての情報を花子さん含め他者に一切知られたくありません。(具体的な値だけでなく、例えば $a_i$ の偶奇性のような少しの情報も知られてはいけません)

花子さんも同様に、 $\bm{a}\cdot \bm{b}$ の値を太郎くんと共有することを除いて、 $\bm{b}$ についての情報を太郎くん含め他者に一切知られたくありません

二人の希望を実現するアルゴリズムを考えてください。

秘密計算_問題ページ1 (1).png

数式に慣れていない人向けの補足

まず $n$ 次元ベクトルはここでは単に数 $n$ つ組みのことです.

例えば $n=4$ の場合であれば太郎くんが $(2,5,1,10)$ のような数4つ組みを持ち、花子さんも同様に $(1,7,0,1)$ のような数4つ組みを持っていると考えてください。

そして内積は二人の持つ4つ組みの同じ場所に位置する数同士を掛け算した値の合計ことです。

例えば上の例だと $(2\times 1) + (5\times 7) + (1\times 0) + (10\times 1) = 47$ なので、二人が「お互いの持っている4つ組みの同じ場所に位置する数同士を掛け算した値の合計が $47$ 」と知ることがゴールになります。

もちろん花子さんが太郎くんに「私の持っている数は $(1,7,0,1)$ です」と伝えられれば太郎くんは自分で計算して $47$ を求めることが出来ますが、二人とも自分の持ってる値を一切明かさずにこの値を求める方法は?というのが本問題になります。

問題(1)解説