量子コンピュータを利用した公平なガチャ

はじめに

ソーシャルゲームなどに実装された「ガチャ」は、ユーザーがお金を投入すると確率で景品が貰えるという仕組みである。最近は景品のレアさなどに応じた確率を表示する実装が主流となっているが、ガチャの運営が表示した確率と実際の実装が正しいという保証はない。公平なガチャとは、このようなソーシャルゲームのガチャの景品の出現確率を実装に基づいて検証できるようにする研究である。 量子コンピュータ(量子計算機)は現在のコンピュータ(古典計算機)とは異なる性質を持つコンピュータである。量子コンピュータが古典計算機と大きく異なることは、計算の状態に虚数や負の数の確率を持つことができる点である。この性質を上手く利用することでたとえば高速な素因数分解といった古典計算機では難しいと考えられている計算を実現している。 この記事では擬似的ではない真の確率を取り扱える量子コンピュータの性質を利用した真に公平なガチャについて解説する。まず、古典計算機で研究されてきた公平なガチャに関して軽く説明しその課題を述べる。次に量子コンピュータに関する解説をし、これを利用した公平なガチャについて述べる。 また、この記事を読み分かりにくいことや質問がある場合には、気軽にコメントなどで教えてほしい。

古典計算機における公平なガチャ

今までに研究されてきた公平なガチャには、「コミットメント」という暗号技術を利用する方法と「ブロックチェーン」を利用する方法がある。この節ではこの2つの方法について簡単な説明をし、それぞれの課題を述べる。ただし、古典計算機におけるコミットメントについては簡単におさえておかないと恐らく量子コンピュータで何を改善しようとしているのかが伝わらない可能性があるため、ブロックチェーンによる公平なガチャに比べてやや説明が多めである。

コミットメントを利用した公平なガチャ

コミットメントとは次のような性質を持つ関数Cを利用したプロトコルである。

コミット
送信者はコミットしたい情報bと、付加的な情報 rで作製した暗号文c:=C(b,r)を受信者へ送信する
公開
送信者はコミットした情報bと付加的な情報rを受信者に送信し、受信者はc=C(b,r)を検証する

そして、この2つの操作には次のようなことが言える。

隠蔽
コミットのステップでは、受信者はコミットされた値cから情報bについてなにも分からない
束縛
送信者は受信者へ暗号文cを送信した後、コミットした値bを変更することができない

このような関数を仮定することで、アリスをガチャの運営、ボブをガチャのユーザーとして次のようにガチャを作ることができる。

  1. アリスは乱数m,rを生成する
  2. アリスはボブにc:=C(m,r)を送信する
  3. ボブはアリスに乱数nを送信する
  4. アリスはボブにnmと対応する景品を送信し、またmrをボブへ公開する1
  5. ボブはc=C(m,r)を検証する

ところがコミットメントを利用したガチャには問題がある。 最初の問題は上述した隠蔽・束縛を同時に満す実装は不可能であり、どちらかを無条件に満すならば片方は計算の複雑さに依存させるしかないことである。簡単のため、今は0または1の1ビットのデータをコミットメントする場合を考える。このときコミットメントCの第1引数は1ビットからなるコミットメントbであり、第2引数はnビットからなる付加的な情報rである。 今、関数Cが隠蔽・束縛を無条件に満すコミットメント関数であると仮定する。アリスがコミットメントc:=C(b,r)をボブに送信するとき、c=C(1b,r)を満すようなrが存在しなければならない。そうでなければ、ボブは無限の計算資源を用いて総当たりをするなどしてrbを特定することができる。ボブがrbを特定できるということは、隠蔽の条件を破っているということになる。しかし、もしアリスも無限の計算資源を持っていれば、c=C(1b,r)を見つけることができるので、1bをさもコミットメントしたかのように装うことができ、これは束縛の条件を破っているということになる。 このような背理法によって、隠蔽・束縛をどちらも無条件に満すようなコミットメントは実現できない。すると、どちらかが無条件ではなく計算の複雑さに依存していることで厳密な公平性は次のように崩れてしまう。

隠蔽が計算量に依存している場合
隠蔽が計算の複雑さに依存しているので、ユーザーは計算資源を投入すればコミットメントから元のメッセージを復元することができる。よってユーザーが有利である
束縛が計算量に依存している場合
一方で束縛が計算の複雑さに依存しているので、運営が莫大な計算資源を投入すればコミット後に値を変更できる。よって運営が有利である

このようにコミットメントも完全に公平ではない。より詳細を知りたい方は次のページを見て欲しい。

つまりコミットメントを利用したプロトコルは隠蔽・束縛のどちらかを計算の複雑さに依存させるため、究極的には不公平になってしまう。

ブロックチェーンを利用した公平なガチャ

ブロックチェーンを利用したガチャの詳細は省くが、直感的なアイディアはブロックチェーンの次のブロックのハッシュ値を予測することが困難である、ということとブロックチェーンを維持するマイナーは不正をしないという仮定のもとに公平であるガチャを構成する。詳細を知りたい方は次のページを見て欲しい。

上記の記事のコメントで @lotz さんが指摘しているように、ブロックチェーンのマイナーは自分の利益を最大にしようとするはずなので、景品の価値がマイニング報酬を上回るような場合にはマイナーが公平かどうかに疑問が生じる。もしマイナーが不正をするならばこのガチャは公平ではなくなる。

古典計算機と量子コンピュータ

プロトコルの説明をする前に量子コンピュータの基礎的なことについて言及する。量子コンピュータの説明にはいろいろな方法があると思われるが、この節ではまず古典計算機をベクトルとそれを操作する演算子(行列)で表し、それを拡張して量子コンピュータを構成する。

記法

まずは記法について解説する。量子コンピュータの界隈ではブラケット記法(ディラック記法)と呼ばれる記法を採用することが多いため、この記事でも同じ記法を用いる。この記法では縦のベクトルを次のように表す。

|a(αβ)

この縦ベクトル|aを横にして複素共役2をとったものをa|とし次のようになる。

a|(α,β)

そして、|bを次であるとする。

|b(γδ)

このときa|bをベクトル|a,|bの内積であるとして次のように定義する。

a|b=a||b=(α,β)(γδ)=αγ+βδ

またn×n行列Aが次のようにあるとする。

A=(a11a1nan1ann)

この記事ではこのような行列Aを次のように表現する。

A=(aij)n×n

また|ab|は外積を表す。次のような|ϕ,|ψがあるとする。

|ϕ=(α1αn),|ψ=(β1βn)

このとき、これらの外積|ϕψ|は次のようになる。

|ϕψ|=(aij)n×nwhereaij=αiβj

ベクトルによる古典計算機

まず、古典計算機の状態を次の二つのベクトルを用いて表すことにする。

|0(10),|1(01)

これらを用いてビットの0|0、ビットの1|1と考える。たとえばビット列“101”といった1ビットより大きなビットについては|0,|1テンソル積を用いて表す。テンソル積を 記号で表すとして、ビット列101は次のように表す。

|1|0|1=(0(10)1(10))|1=(0010)|1=(0(01)0(01)1(01)0(01))=(00000100)

また|1|0|1といったテンソル積は記号を省略して|1|0|1または|101と書くこともある。 さて、このような状態を表現するベクトルに対して演算子を作用させて計算を進めていくことができる。たとえば次のような演算子Xを考える。

X(0110)

この演算子Xをたとえば|0,|1にそれぞれ作用させると次のようになる。

X|0=(0110)(10)=(0+01+0)=(01)=|1X|1=(0110)(01)=(0+10+0)=(10)=|0

つまり、演算子Xはビットの反転と対応すると言える。このように演算子をベクトルに作用させていくことで、古典計算機で可能な任意の計算を作ることができる。

ベクトルによる量子コンピュータ

量子ビットと確率振幅

量子コンピュータでは、上述したベクトル表現の計算機に複素数で表現される確率振幅を利用して拡張したものである。1量子ビット|ψは次のようになる。

|ψc0|0+c1|1

ここで複素数c0,c1は確率振幅と呼ばれ、次を満す必要がある3

|c0|2+|c1|2=1

複素数c0,c1はベクトル |0,|1のどちらに収束する可能性が高いのかを表す。たとえば次の量子ビット|+を考える。

|+12|0+12|1

|12|2+|12|2=1より確率振幅の条件を満す。|0,|1の確率振幅が等しいので、これは半分の確率(|12|2=12)で|0となり、残りの半分の確率で|1へ収束する量子ビットとなる。

測定

では、このように表現された量子ビットが収束した後を表現する方法を考える。この測定もひとつの演算子(行列)として考えることができ、演算子なのでこれは計算のひとつであるといえる。測定は基底と呼ばれる内積が0となるベクトルの組を用いる。たとえば2つのベクトル|0,|1の内積0|1は次のようになる。

0|1=1×0+0×1=0

従って{|0,|1}は測定に用いることができる。基底として{|0,|1}を用いたとすると、測定に用いる演算子P0,P1は次のようになる。

P0|00|=(1000),P1|11|=(0001)

このような演算子P0,P1をさきほどの演算子Xのように量子ビットを表すベクトルへ作用させてはならない。なぜなら、古典計算機とは異なり量子コンピュータにおいては演算子を作用させた後であっても確率振幅が式(1)を満す必要がある。このような条件を満す演算子をユニタリ演算子と呼び、演算子A(aij)n×nがユニタリであるとき次を満す。

A=A=(bij)n×nwherebij=aji

さて演算子P0,P1をユニタリ演算子とするために、測定前のベクトル|ψに演算子Pを作用させたベクトルと|ψとの内積の平方根ψ|P|ψで割る必要がある。最終的に|ψ=c0|0+c1|1を測定した後のベクトル|ψ0,|ψ1は次のようになる。

|ψ0=P0ψ|P0|ψ|ψ,|ψ1=P1ψ|P1|ψ|ψ

たとえば|+12(|0+|1)があり、P0を利用して測定すると測定後のベクトル|+0は次のようになる。

|+0=P0+|P0|+|+=2P0|+=2(1000)12(11)=(1+00+0)=(10)=|0

測定が演算子で表されることから分かるように、ある量子ビットを測定した場合、測定後は一般的に状態が変化してしまう。この例では簡単のためP0,P1の中からP0を選んだが、測定の際にどの演算子が選ばれるかは確率振幅に基づく確率による。たとえば|+|0,|1の確率振幅が等しいため、P0P1のどちらかが等しく12の確率で選ばれる。 また、さきほどの例では基底{|0,|1}を用いたP0,P1で測定を行ったが、実は他のベクトルを利用して測定することも可能である。たとえば次のようなベクトル|+,|を利用して基底{|+,|}で測定することもできる。

|+12(|0+|1),|12(|0|1)

二つのベクトル|+,|の内積は次のように0である。

+|=(1212)(1212)=1212=0

では{|+,|}を用いて同じように次のような演算子P+を計算する。

P+|++|=(1212)×(1212)=(12121212)=12(1111)

今、|+の確率振幅に基づく確率により演算子P+が選ばれたとすると、|+の測定後のベクトル|++は次のようになる4

|++=P++|P+|+|+=12(1111)12(11)=122(22)=12(11)=|+

混合状態と密度演算子

1,,nn個の量子ビット|ϕ1,,|ϕnがあるとする。この量子ビットが確率λiで発生するとき、それを混合状態と呼び、その状態ρを次のように表す。

ρni=1λi|ϕiϕi|

この状態ρのことを密度演算子と呼ぶ。たとえば今23の確率で|ϕ1であり、13の確率で|ϕ2であるとき、これらの密度演算子は次のようになる。

23|ϕ1ϕ1|+13|ϕ2ϕ2|

混合状態は、測定する前の量子ビットのような状態がどのビットに収束するかが確定していない状態とは異なり、単に測定する前にどのビットであるか判定することができない状態である。つまり、前者の測定前の量子ビットはまだ状態が確定していないことに対して、後者の混合状態はすでに状態が確定しているものの測定前にはどれかが判断ができないという状態となる。

量子コイントス

ここまでの量子コンピュータの知識を利用して、公平なガチャと関連する量子コイントスについて説明する。量子コイントスとはアリスとボブが量子コンピュータ(と量子通信回線)を用いてコインが裏か表かを公平に予想するためのプロトコルである。コイントスは1ビットの情報であるから、これをn回繰り返すことで2n個の景品があるガチャを容易に実装できるため、簡単のためまずは量子コイントスについて説明する。

BB84プロトコル

初期に提案された量子コイントスのプロトコルである。後に説明するようにこのプロトコルには致命的な脆弱性があるが、最も簡単であるためまずはこのプロトコルを説明する。

  1. アリスはランダムに1ビットずつの値a,x{0,1}を作製し、アリスは1量子ビット|ψa,xを次の中から選び、|ψa,xをボブへ送信する

    {|ψ0,0|0|ψ0,1|1|ψ1,0|+|ψ1,1|where|±12(|0±|1)
  2. ボブはランダムにˆa{0,1}を作製し、Bˆaを利用して|ψa,xを測定する。ただしBˆaは次のようになる

    Bˆa{|ψˆa,0,|ψˆa,1}
  3. ボブは(2)で測定した結果をˆxとし、ランダムな1ビットbをアリスへ送信する
  4. アリスはa,xを公開する
  5. ボブはa=ˆaならばx=ˆxであることを検証する。もしこれが成り立たない場合、プロトコルを中止する
  6. abをコイントスの結果とする

ところが、このプロトコルはいくつかの問題がある。まず、ボブは受け取った|ψa,xが4つのうちのどれなのかを知ることができるかどうかを考える。このときに密度演算子を利用することができる。もしアリスがa=0であった場合の密度演算子ρ0は次のようになる。

ρ0=12|00|+12|11|=12(1000)+12(0001)=12(1001)

また、アリスがa=1であった場合の密度演算子ρ1は次のようになる。

ρ1=12|++|+12||=12(1111)+12(1111)=12(1001)

つまりρ0=ρ1である 。このように密度演算子が等しい場合、ボブは測定によってアリスのaがどちらかを識別することはできない。従ってこのプロトコルはボブが不正をすることはできない。 しかし、アリスは(3)でボブからbを受け取った時にabを計算し、これがアリスにとって望ましくない結果であったならば不正をすることができる。ボブがアリスの不正を検出できるのは(5)でa=ˆaのときのみであり、そうでなければ無条件でプロトコルは成功となる。今、ab=0ならばアリスが勝利し、一方でab=1ならばボブが勝利するとする。アリスがa=0を選んでいたときに次のような条件分岐となる。

  1. ボブがb=0のとき
  • この場合は何もしなくともアリスは勝利するため、アリスはプロトコルを誠実に実行すればよい
  1. ボブがb=1のとき
  • この場合、アリスが誠実に振る舞えばボブが勝利してしまう。したがってアリスは不正をしたい。このときのアリスの不正が成功する場合は次のようになる
    1. ボブがˆa=0のとき、アリスが(4)でa=1だと不正をしたとしてもボブはaˆaより検証ができないため、アリスはxをどのように選んで公開したとしても不正が成功する
    2. ボブがˆa=1のとき、アリスはボブの測定したˆxを特定しなければならない。今アリスはa=0を選んだため|ψ0,x|0,|1のどちらかである。ボブはアリスから受け取った|ψ0,xを測定する際に、ˆa=1より{|+,|}を用いる。このとき測定後のベクトルは次のようになる

      |ψ+=P+ψ0,x|P+|ψ0,x|ψ0,x=|+|ψ=Pψ0,x|P|ψ0,x|ψ0,x=|
      • |+,|は共に12の確率で|0となり12の確率で|1となる。よってボブの測定結果ˆx12の確率で0となり12の確率で1となる。アリスの不正が成功するためには(4)でxを送信するときにこのボブの測定結果ˆxと等しいxを当てなければならないが、どちらになるかは完全に等しく12のランダムである。

これを整理すると、アリスがこの勝負に勝利する確率は次のようになる。

  • 普通に勝利する …… 12
  • アリスのaとボブのˆaが一致しない場合、アリスはaを偽ってもボブはそれを検証できずに勝利する …… 14
  • アリスのaとボブのˆaが一致する場合、アリスはx12でボブの測定と一致させたとき勝利する …… 18

つまり、アリスが勝利する確率は12+14+18となる。このようなどちらかに有利であるようなプロトコルの有利さをバイアスという言葉で表現する。たとえばアリスに対してϵバイアスなプロトコルと言った場合、そのプロトコルでアリスが勝利する確率は12+ϵである。いまこのBB84プロトコルはアリスが 14+18=0.375有利なので0.375バイアスなプロトコルである。公平なプロトコルとはアリスもボブもどちらも同じ ϵバイアスなプロトコルでなければならない。つまりBB84プロトコルは公平なプロトコルではない。 また、さらに致命的な弱点としてBB84プロトコルは“remote steering”という攻撃が可能である。この攻撃について説明するためにまずは古典計算機をベクトルで表現する際に用いたテンソル積によるビット表現について考える。量子コンピュータにおいても次のようにあるテンソル積で複数の量子ビットを取り扱うことができる。

|ψ1|ψ2|ψn=|ψ1ψ2ψn

上記のようなn量子ビットの表現はたとえある1量子ビットに演算子を作用させたとしても、他の量子ビットに影響を与えない。このような多量子ビット状態をセパラブルであると言う。そして量子コンピュータにおいては、ある量子ビットへの演算が他の量子ビットに影響を与えるような多量子ビット状態を考えることができる。たとえば次のようなベル状態と呼ばれる2量子ビットのベクトル|ψを考える。

|ψ12(|00+|11)

たとえば、これを次のような演算子P0,P1で測定するとする。

P0|00|I=(1000010000000000),P1|11|I=(0000000000100001)whereI=(1001)

このように多量子ビットを測定する際は単位行列Iとのテンソル積を取る。|ψの測定後のベクトルをそれぞれ|ψ0,|ψ1とすると次のようになる。

|ψ0=P0ψ|P0|ψ|ψ=2P0|ψ=(1000)=|00|ψ1=P1ψ|P1|ψ|ψ=2P1|ψ=(0001)=|11

つまり、測定のときに演算子P0が選ばれた場合は2つの量子ビットがどちらも|0となり、逆にP1が選ばれた場合は2つの量子ビットがどちらも|1となる。このようにいずれかの量子ビットに演算子を作用させると、他の量子ビットにも作用が発生する。なお、このような作用は多量子ビットがどういった距離にあっても発生すると考えられている。従ってアリスはこのような多量子ビットを用いた次のような攻撃が可能である。

  1. アリスは2量子ビット|ψ12(|00+|11)を作製し、片方の量子ビットをボブへ送信する
  2. ボブが(2)で測定した後、アリスは|ψのもう片方の量子ビットを測定することで、アリスはボブの測定結果ˆxを知ることができる

アリスはボブの測定結果ˆxを知ることができるため、さきほどの議論によりアリスは自由に不正ができる。従ってこのプロトコルは0.5バイアスとなり完全に壊れる。

ロス耐性プロトコル

次にBB84プロトコルを改良したプロトコルを紹介する。

  1. アリスはランダムにa,x{0,1}を選び、次の量子ビット|φa,xを選択しボブへ送信する

    {|φ0,0α|0+β|1|φ0,1β|0α|1|φ1,0α|0β|1|φ1,1β|0+α|1
    • ただし1>α>β>0かつα2+β2=1である
  2. ボブはランダムにˆa{0,1}を作製し、Bˆaを利用して|φa,xを測定する。ただしBˆaは次のようになる

    Bˆa{|φˆa,0,|φˆa,1}
  3. ボブは(2)で測定した結果をˆxとし、ランダムな1ビットbをアリスへ送信する
  4. アリスはa,xを公開する
  5. ボブはa=ˆaならばx=ˆxであることを検証する。もしこれが成り立たない場合、プロトコルを中止する
  6. xbをコイントスの結果とする
  • BB84とは異なりxbのXORを計算していることに注意せよ

まず、量子ビット|φa,xについて考える。これを図とすると次のようになる。

image.png

この図はα,βの値については正確ではないが、|φ0,0,|φ0,1が直交5していることや|φ1,0,|φ1,1が直交していることは正確である。 このプロトコルにおけるアリスのバイアスを ϵAとし、またボブのバイアスをϵBとする。このときα,βを上手く設定することによりϵA=ϵBを達成することができる。

アリスの不正戦略

まずはアリスがこのプロトコルに対してどのように不正ができるかを考える。今xb=0ならばアリスの勝利であり、xb=1ならばボブの勝利とする。まずアリスは(1)で|φa,xではなく|+を送信する。そしてアリスは(4)の公開のときにaとして0bを公開しxとしても0bを公開するすると次のようになる。ただし0はアリスが勝利する結果のことである。

  1. (3)でボブがbを公開したとき、ˆa0bである場合
  • このときアリスの不正をボブは検出することができないため、アリスの不正は常に成功する
  • なぜならˆa0bよりボブはアリスの不正を検出できない
  1. (3)でボブがbを公開したとき、ˆa=0bである場合
  • アリスが(4)で公開する値により、ボブはアリスが(1)で|φ0b,0bを選んだと考える。ところがアリスが(1)で本当に送信した量子ビットは|+である。従って|+を測定した後の結果が|φ0b,0bへ収束する確率が、アリスの不正が成功する確率となる。この確率は次のようになる

    |+|φ0b,0b|2={|+|α|0+β|1|2=|12(α+β)|2|+|β|0+α|1|2=|12(β+α)|2}=(α+β)22
  • a2+b2=1より、(α+β)22=1+2αβ2である

したがって、アリスの勝率は次のようになる。

12+12(1+2αβ2)

バイアスの定義より上記の式から12を引いて、このプロトコルにおけるアリスのバイアスϵAは次のようになる。

ϵA=1+2αβ4

ボブの不正戦略

まず、アリスがx0または1のどちらにしたかによる密度演算子をϱ0,ϱ1とすると次のようになる。ただし、BB84とは異なりボブはxについて情報を得たいため次のようになる。

ϱ0=12|φ0,0φ0,0|+12|φ1,0φ1,0|=(α200β2)ϱ1=12|φ0,1φ0,1|+12|φ1,1φ1,1|=(β200α2)

このように密度演算子が異なる場合、ボブは測定によってxを当てられる確率は次のようになる。ただしTrは行列の対角成分の和を求める関数である。

12+14Tr(|ϱ0ϱ1|)

まず、ϱ0ϱ1について考える。ϱ0ϱ1は次のようになる。

ϱ0ϱ1=(α2β200β2α2)

これの絶対値|ϱ0ϱ1|1>α>β>0より次のようになる。

|ϱ0ϱ1|=(α2β200α2β2)

従って、式(2)は次のようになる。

12+14Tr(|ϱ0ϱ1|)=12+12(α2β2)

よってボブのバイアスϵBは次のようになる。

ϵB=12(α2β2)=12(2α21)=α212

公平なバイアス

ここまでの議論でアリスとボブのバイアスはそれぞれ次のようになると分った。

ϵA=1+2αβ4,ϵB=α212

よって、この2つが等しいという次の方程式を解けばよい。ただし1>α>β>0である。

{1+2αβ4=α212α2+β2=1

するとα,βは次のようになる。

α=0.9,β=0.1

そしてアリスとボブのバイアスはともにϵA=ϵB=0.4となる。このプロトコルは2人のバイアスが等しいため、公平に不正ができるプロトコルという意味で公平であると言える。

まとめ

量子コンピュータを利用して公平なガチャの最も簡単なものであるコイントスを実装する方法を紹介した。これを公平なガチャへ拡張するのは容易だろうと思われるが、実は具体的なプロトコルを構築してはいないので、もし次があれば具体的な公平な量子ガチャのプロトコルを考案したい。また、このプロトコルは量子コンピュータが実用化したときに実用できるかというと、筆者はそうではないと考えている。なぜならこのプロトコルには量子ビットをそのまま送信できる量子通信回線を必要とするからである。最後に、この記事を読み量子コンピュータや量子コイントスについて興味を持った方は、ぜひ参考文献を読んでみてほしい。

謝辞

この記事を書くにあたって、量子コンピュータの説明などに関して様々な助言を頂いた@kamakiri_ysさんに感謝する。また量子コンイトスについて私に教えてくださった@iKodackさんに感謝する。

参考文献


  1. ”はビットのXORを表す。

  2. 複素数α=x+yiとしてαの複素共役はα=xyiとなる。

  3. |a|”はaの絶対値を表す。

  4. |+=1|++0|となるため、この場合は必ずP+が選ばれることとなる。

  5. ベクトルが直交しているとは、それらの内積が0であることを意味する。

コメント