Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/translations/ja/ch-algorithms/simon.ipynb
3855 views
Kernel: Python 3

サイモンのアルゴリズム

このセクションでは、最初にSimon(サイモン)の問題を紹介し、古典コンピューターと量子コンピューターのそれぞれでその問題を解く方法を紹介します。その後、Qiskitを用いて量子アルゴリズムを実装し、シミュレーターとデバイス上で実行してみます。

目次

  1. はじめに 1.1 サイモンの問題 1.2 サイモンのアルゴリズム

  2. Qiskit による実装 3.1 シミュレーター上での実行 3.2 実機上での実行

  3. 量子オラクル

  4. 演習

  5. 参考文献

1. はじめに

サイモンのアルゴリズム[1]は、特定の問題を解く古典的なアルゴリズムに比べて指数関数的な高速化を実現した最初の量子アルゴリズムです。このアルゴリズムに触発され、量子フーリエ変換として知られている離散フーリエ変換の量子アルゴリズムが生まれました。これは最も有名な量子アルゴリズムである ショアの素因数分解アルゴリズムの内部で使われています。

1.1. サイモンの問題

まず、1対1対応関数、または2対1対応関数 f f を考えます。f f は以下のような特徴を持ちます:

  • 1対1対応: 全ての出力値に対して唯一の入力値が対応する。例えば4つの入力を取る関数は:

f(1)1,f(2)2,f(3)3,(4)4.f(1) \rightarrow 1, \quad f(2) \rightarrow 2, \quad f(3) \rightarrow 3, \quad (4) \rightarrow 4.
  • 2対1対応: 全ての出力値に対して、必ず2つの入力値が対応する。例えば4つの入力を取る関数は: f(1)1,f(2)2,f(3)1,f(4)2. f(1) \rightarrow 1, \quad f(2) \rightarrow 2, \quad f(3) \rightarrow 1, \quad f(4) \rightarrow 2. この2対1対応写像は、ある秘密ビット列 b b を用いたもので、2つの入力 x1,x2 x_1, x_2 について f(x1)=f(x2) f(x_1) = f(x_2) が成り立つとき、x1x2=b x_1 \oplus x_2 = b が必ず成り立ちます。ここで \oplus はビットごとのXORです。

与えられたブラックボックス関数 f f が、1対1対応関数なのか2対1対応関数なのか、どうしたら高速に判定できるでしょうか? さらにもし f f が2対1対応関数の場合、どうしたら高速に b b を特定できるでしょうか? これらは 秘密ビット列 b b を特定する問題に帰着されます。なぜなら b=000... b={000...} の場合は f f は 1対1対応関数とわかり、そうでないなら2対1対応関数と即座にわかるためです。

1.2. サイモンのアルゴリズム

古典的な解法

与えられた関数 f f に対し秘密ビット列 b b が全ての入出力に対して矛盾がないことを確認するためには、最大で 2n1+1 2^{n−1}+1 個の入力値と出力値を確認しなければなりません。ここで n n は入力値のビット数です。つまり、同じ出力値に対して2つの入力値を見つけるまで、可能な全ての入力値の半分を確認することを意味しています。Deutsch-Jozsaの問題と同様に、運が良ければ最初の2回の試行だけでこの問題は解決します。しかしもし f f が1対1対応関数だった場合や、2対1対応関数を最も不幸な順で確認した場合に、 2n1+1 2^{n−1}+1 回の確認が必要となります。古典コンピューター上で、回数の下限が Ω(2n/2) \Omega(2^{n/2}) となるアルゴリズム[2]が知られていますが、やはり必要な確認回数は n n に対して指数関数的に増加します。

量子的な解法

サイモンのアルゴリズムを実装した量子回路を以下に示します。

images/simon_steps.jpeg

ここで、問い合わせ関数 Qf \text{Q}_f は、2つの量子レジスターx,a \lvert x \rangle, \lvert a \rangle を入力として働きます。Qf \text{Q}_f 適用前後の全体の状態は

xaxaf(x)\lvert x \rangle \lvert a \rangle \rightarrow \lvert x \rangle \lvert a \oplus f(x) \rangle

となります。2個目の量子レジスターは状態 0=000 |0\rangle = |00 \dots 0 \rangle で初期化され、そのままQf \text{Q}_f に入力されるため、Qf \text{Q}_f 適用前後の全体の状態は

x0xf(x)\lvert x \rangle \lvert 0 \rangle \rightarrow \lvert x \rangle \lvert f(x) \rangle

となります。

このアルゴリズムは以下のステップで実行されていきます。

  1. 2つの nn 量子ビットの入力レジスターをゼロに初期化します:
  2. ψ1=0n0n\lvert \psi_1 \rangle = \lvert 0 \rangle^{\otimes n} \lvert 0 \rangle^{\otimes n}
  3. 1つ目のレジスターにアダマール変換を適用します:
  4. ψ2=12nx{0,1}nx0n\lvert \psi_2 \rangle = \frac{1}{\sqrt{2^n}} \sum_{x \in \{0,1\}^{n} } \lvert x \rangle\lvert 0 \rangle^{\otimes n}
  5. 問い合わせ関数 Qf\text{Q}_f を適用します:
  6. ψ3=12nx{0,1}nxf(x)\lvert \psi_3 \rangle = \frac{1}{\sqrt{2^n}} \sum_{x \in \{0,1\}^{n} } \lvert x \rangle \lvert f(x) \rangle
  7. 2つ目の量子レジスタを測定します。ある値 f(x) f(x) が測定されたものとします。この問題の設定上、測定値 f(x) f(x) は2つの入力 x x y=xb y = x \oplus b に対応します。したがって、1つ目のレジスターは以下のようになります:
  8. ψ4=12(x+y)\lvert \psi_4 \rangle = \frac{1}{\sqrt{2}} \left( \lvert x \rangle + \lvert y \rangle \right)

    ここで、2つ目のレジスタは測定されているため省略しました。ここで ψ4 \lvert \psi_4 \rangle はこれまでの 2n 2n ではなく n n 量子ビットで構成されていることに注意してください。

  9. 1つ目のレジスターにアダマール変換を適用します:
  10. ψ5=12n+1z{0,1}n[(1)xz+(1)yz]z\lvert \psi_5 \rangle = \frac{1}{\sqrt{2^{n+1}}} \sum_{z \in \{0,1\}^{n} } \left[ (-1)^{x \cdot z} + (-1)^{y \cdot z} \right] \lvert z \rangle

    ここで xy x \cdot y はドット積と呼ばれる二項演算で、ビットごとの積のXOR x0y0x1y1xnyn x_0 y_0 \oplus x_1 y_1 \oplus \cdots \oplus x_n y_n の値です。

  11. 1つ目のレジスターの測定は、以下の出力を与えます:
  12. (1)xz=(1)yz(-1)^{x \cdot z} = (-1)^{y \cdot z}

    つまり xz=yzxz=(xb)zxz=xzbzbz=0 (mod 2) x \cdot z = y \cdot z \\ x \cdot z = \left( x \oplus b \right) \cdot z \\ x \cdot z = x \cdot z \oplus b \cdot z \\ b \cdot z = 0 \text{ (mod 2)}

    b b との内積が 0 0 となる数値 z z が測定されます。すなわち、このアルゴリズムをおよそn n 回計算することで、n n 個の異なる z z を得ます。そして、以下のような連立方程式を考えます:

    {bz1=0bz2=0bzn=0\begin{cases} b \cdot z_1 = 0 \\ b \cdot z_2 = 0 \\ \quad \vdots \\ b \cdot z_n = 0 \end{cases}

    この連立方程式を(例えばガウスの消去法などを使って)解くことによって、秘密ビット列b b を特定することができます。

    この問題に対しては、量子アルゴリズムは古典アルゴリズムに比べて指数関数的に少ない回数しか実行されません。繰り返しになりますが、このアルゴリズムの実用的な応用を考えるのは難しいです。しかしながら、このアルゴリズムは具体的な問題の解決を量子コンピューターを利用して指数関数的に高速化した最初の例となり、ショアのアルゴリズムの発見に寄与しました。

    2. 例

    サイモンのアルゴリズムの実行例を、2 量子ビットで 秘密ビット列 b=11 b=11 の場合について見ていきます。もし y=xb y = x \oplus b ならば、f(x)=f(y) f(x) = f(y) となるような関数が対象となります。この問題を解く量子回路は以下のようになります。

    images/simon_steps.jpeg

    1. 2つの 22-量子ビットの入力レジスターはゼロで初期化されます:
    ψ1=001002\lvert \psi_1 \rangle = \lvert 0 0 \rangle_1 \lvert 0 0 \rangle_2
  13. 1 1 個目のレジスターにアダマールゲートを適用します:
  14. ψ2=12(001+011+101+111)002\lvert \psi_2 \rangle = \frac{1}{2} \left( \lvert 0 0 \rangle_1 + \lvert 0 1 \rangle_1 + \lvert 1 0 \rangle_1 + \lvert 1 1 \rangle_1 \right) \lvert 0 0 \rangle_2
  15. 秘密ビット列 b=11 b = 11 に対して、上の図にあるように問い合わせ関数はQf=CX1a2aCX1a2bCX1b2aCX1b2b\text{Q}_f = CX_{1_a 2_a}CX_{1_a 2_b}CX_{1_b 2_a}CX_{1_b 2_b} と実装されます。すなわち、問い合わせ関数適用後の状態は
  16. ψ3=12(  001  000,0002$5pt]+011  001,0012$6pt]+101  010,0102$6pt]+111  011,0112  )\begin{aligned} \lvert \psi_3 \rangle = \frac{1}{2} ( \; & \lvert 0 0 \rangle_1 \; \lvert 0\oplus 0 \oplus 0, & 0 \oplus 0 \oplus 0 \rangle_2 &$5pt] + & \lvert 0 1 \rangle_1 \; \lvert 0\oplus 0 \oplus 1, & 0 \oplus 0 \oplus 1 \rangle_2 &$6pt] + & \lvert 1 0 \rangle_1 \; \lvert 0\oplus 1 \oplus 0, & 0 \oplus 1 \oplus 0 \rangle_2 &$6pt] + & \lvert 1 1 \rangle_1 \; \lvert 0\oplus 1 \oplus 1, & 0 \oplus 1 \oplus 1 \rangle_2 & \; )\\ \end{aligned}

    したがって、

    ψ3=12(001002$6pt]+011112$6pt]+101112$6pt]+111002  )\begin{aligned} \lvert \psi_3 \rangle = \frac{1}{2} ( \quad & \lvert 0 0 \rangle_1 \lvert 0 0 \rangle_2 & $6pt] + & \lvert 0 1 \rangle_1 \lvert 1 1 \rangle_2 & $6pt] + & \lvert 1 0 \rangle_1 \lvert 1 1 \rangle_2 & $6pt] + & \lvert 1 1 \rangle_1 \lvert 0 0 \rangle_2 & \; )\\ \end{aligned}

    となります。

  17. ここで、2 つ目のレジスターを測定します。50% 50\% の確率で 002\lvert 00 \rangle_2 または 112 \lvert 11 \rangle_2 が測定されます。ここでは 112\lvert 11 \rangle_2 が測定されたものと仮定します。状態ベクトルは以下のようになります:
  18. ψ4=12(011+101)\lvert \psi_4 \rangle = \frac{1}{\sqrt{2}} \left( \lvert 0 1 \rangle_1 + \lvert 1 0 \rangle_1 \right)

    ここで、2 2 つ目のレジスターは測定されているため省略して表記しました。

  19. 1つ目のレジスターにアダーマール変換を適用します。
  20. ψ5=122[(0+1)(01)+(01)(0+1)]=122[001011+101111+001+011101111]=12(001111)\begin{darray}{rcl} \lvert \psi_5 \rangle &=& \frac{1}{2\sqrt{2}} \left[ \left( \lvert 0 \rangle + \lvert 1 \rangle \right) \otimes \left( \lvert 0 \rangle - \lvert 1 \rangle \right) + \left( \lvert 0 \rangle - \lvert 1 \rangle \right) \otimes \left( \lvert 0 \rangle + \lvert 1 \rangle \right) \right] \\ &=& \frac{1}{2\sqrt{2}} \left[ \lvert 0 0 \rangle_1 - \lvert 0 1 \rangle_1 + \lvert 1 0 \rangle_1 - \lvert 1 1 \rangle_1 + \lvert 0 0 \rangle_1 + \lvert 0 1 \rangle_1 - \lvert 1 0 \rangle_1 - \lvert 1 1 \rangle_1 \right] \\ &=& \frac{1}{\sqrt{2}} \left( \lvert 0 0 \rangle_1 - \lvert 1 1 \rangle_1 \right) \end{darray}
  21. このあと1つ目のレジスターを測定すれば、001\lvert 0 0 \rangle_1 または 111\lvert 11 \rangle_1 を得ます。
  22. ここでは 111 \lvert 11 \rangle_1 を測定したものとすると、
  23. b11=0b \cdot 11 = 0

    という方程式が一つ得られます。これにより、b b 01 01 でもなく 10 10 でもない事がわかります。すなわち求める b b 00 00 または 11 11 だとわかります。b b 2 2 ビットなので、これだけでは特定することができません。もう一つの方程式が得られるまで何回かアルゴリズムを実施する必要があります。何回か実行して、以下のような2種類の方程式を得られたとします。

    b11=0b \cdot 11 = 0b00=0b \cdot 00 = 0

    この連立方程式を満たす b b を求めれば 11 11 ただ一つに定まります。 得られた b=11 b=11 は適当に選んだ入力 xix_i とその出力 f(xi)=f(xib) f(x_i) = f(x_i \oplus b) を調べることで検証できます。例えば、

    01b=1001 \oplus b = 10f(01)=f(10)=11.f(01) = f(10) = 11 .

    3. Qiskit による実装

    3 3 量子ビット、秘密ビット列 b=110 b=110 の場合を解く サイモンのアルゴリズムを qiskit で実装します。

    # Qiskit をインポートする from qiskit import IBMQ, BasicAer from qiskit.providers.ibmq import least_busy from qiskit import QuantumCircuit, execute # 基本的なプロットツールをインポートする from qiskit.visualization import plot_histogram # Simonオラクルをインポートする from qiskit_textbook.tools import simon_oracle

    上でインポートされる関数 simon_oracle はビット列 b b に対応するSimonオラクルを生成する関数です。ここでは説明無しで使用しますが、 section 4で解説します。インポートするには、Setting Up Your Environmentを参考にqiskit_textbookモジュールをインストールする必要があります。

    Qiskit では、測定は量子回路の最後で行います。そのため、このSimonのアルゴリズムでは、1つ目のレジスターの測定を最後に移動させます。また、ここでは2つ目のレジスターについては無視します。

    b = '110' n = len(b) simon_circuit = QuantumCircuit(n*2, n) # オラクルに入力する前にアダマールゲートを適用する simon_circuit.h(range(n)) # 可視性の向上のため、境界を挿入する simon_circuit.barrier() simon_circuit += simon_oracle(b) # 可視性の向上のため、境界を挿入する simon_circuit.barrier() # 入力レジスターにアダマールゲートを適用する simon_circuit.h(range(n)) # 量子ビットを測定する simon_circuit.measure(range(n), range(n)) simon_circuit.draw(output='mpl')
    Image in a Jupyter notebook

    3.1 シミュレーター上での実行

    シミューレーターを用いて上記の回路を実行します。

    # ローカルシミュレーターを利用する backend = BasicAer.get_backend('qasm_simulator') shots = 1024 results = execute(simon_circuit, backend=backend, shots=shots).result() counts = results.get_counts() plot_histogram(counts)
    Image in a Jupyter notebook

    3ビット数値の可能性は 000 000 から 111 111 までの 8 8 種類ですが、ここでは z z として 4 4 種類しか測定されませんでした。以下のように、ビット列 b=110 b = 110 をこの z z で検証すれば、4 4 種類全てで bz=0(mod2) b \cdot z = 0 \pmod{2} が成り立つことがわかります。

    # 4つの z の出力とのドット内積を計算し検証する def bdotz(b, z): accum = 0 for i in range(len(b)): accum += int(b[i]) * int(z[i]) return (accum % 2) for z in counts: print( '{}.{} = {} (mod 2)'.format(b, z, bdotz(b,z)) )
    110.000 = 0 (mod 2) 110.111 = 0 (mod 2) 110.001 = 0 (mod 2) 110.110 = 0 (mod 2)

    この得られた4種類のz z を用いて、連立方程式を解いて b=110 b = 110 を求める事ができます。例えば、最初の測定値 001から

    ParseError: KaTeX parse error: Undefined control sequence: \require at position 1: \̲r̲e̲q̲u̲i̲r̲e̲{cancel} \begin…

    すなわち、 b0=0 b_0=0 である事がわかります。そして次に 111 を測定し

    ParseError: KaTeX parse error: Undefined control sequence: \require at position 1: \̲r̲e̲q̲u̲i̲r̲e̲{cancel} \begin…

    が得られ、 b2=b1 b_2 = b_1 が明らかになります。つまり b b

    b2=b1=0,b=000b_2 = b_1 = 0, \quad b = 000

    または

    b2=b1=1,b=110b_2 = b_1 = 1, \quad b = 110

    のいずれかであることがわかります。

    このうち自明な解 b=000 b = 000 の場合は f f は1対1対応関数となります。b=110 b = 110 は自明でない解で、この場合は f f は 2対1対応となります。こうした連立方程式は O(n3) O(n^3) で動作するガウスの消去法 で解くことができます。

    3.2. 実機上での実行

    section 3.1 の量子回路は 2n=6 2n = 6 量子ビットを使います。しかしこの記事の執筆時、殆どのIBM 量子デバイスは 5 量子ビットしか持っていません。そのため、同じコードを使いますが section2 と同じようにb=11 b = 11 を用いれば必要な量子ビット数は 4<5 4 < 5 となり実機の動作範囲に収まります。

    b = '11' n = len(b) simon_circuit_2 = QuantumCircuit(n*2, n) # オラクルに入力する前にアダマールゲートを適用する simon_circuit_2.h(range(n)) # オラクルに入力する simon_circuit_2 += simon_oracle(b) # 入力レジスターにアダマールゲートを適用する simon_circuit_2.h(range(n)) # 量子ビットを測定する simon_circuit_2.measure(range(n), range(n)) simon_circuit_2.draw(output='mpl')
    Image in a Jupyter notebook

    この回路は section 2 と比較すると少し異なります。出力は異なりますが、衝突関係は同じです。すなわち、f(x)=f(x11) f(x) = f(x \oplus 11) が成り立っています。

    # IBMQ アカウントを読み込み、5 量子ビットのデバイスを取得する IBMQ.save_account('YOUR_TOKEN') IBMQ.load_account() provider = IBMQ.get_provider(hub='ibm-q') backend = least_busy(provider.backends(filters=lambda x: x.configuration().n_qubits >= n and not x.configuration().simulator and x.status().operational==True)) print("least busy backend: ", backend) # ジョブを実行し監視する from qiskit.tools.monitor import job_monitor shots = 1024 job = execute(simon_circuit_2, backend=backend, shots=shots, optimization_level=3) job_monitor(job, interval = 2) # 結果を取得しプロットする device_counts = job.result().get_counts() plot_histogram(device_counts)
    least busy backend: ibmqx2 Job Status: job has successfully run
    Image in a Jupyter notebook
    # 4つの z の出力とのドット内積を計算し検証する def bdotz(b, z): accum = 0 for i in range(len(b)): accum += int(b[i]) * int(z[i]) return (accum % 2) print('b = ' + b) for z in device_counts: print( '{}.{} = {} (mod 2) ({:.1f}%)'.format(b, z, bdotz(b,z), device_counts[z]*100/shots))
    b = 11 11.00 = 0 (mod 2) (49.2%) 11.11 = 0 (mod 2) (32.0%) 11.10 = 1 (mod 2) (9.1%) 11.01 = 1 (mod 2) (9.7%)

    ここで、最も重要な結果は bz=0 b \cdot z = 0 (mod 2) です。この情報と古典コンピューターを利用して連立方程式を解くことで、秘密ビット列 b=11 b = 11 を得ることができます。それ以外の測定結果は間違いですが、低い測定確率を持ちます。間違いを観測することは起こりにくいと仮定すれば、得られた測定値から古典コンピューターを用いて連立方程式を解き、b b を求めることができます。このn=2 n = 2 の場合、b=11 b = 11 です。

    4. 量子オラクル

    上のSimonのアルゴリズムの実装 は、特定の秘密ビット列に特化しています。このアルゴリズムを任意の秘密ビット列に対応するように拡張するには、問い合わせ関数についてより詳細に考察する必要があります。

    サイモンのアルゴリズムは秘密ビット列 b{0,1}n b \in \{0,1\}^n を、全ての x{0,1}nx \in \{0,1\}^n と対応する y=xby = x \oplus b に対して fb(x)=fb(y)f_b(x) = f_b(y) が成り立つようなオラクル fb f_b から探し出します。ここで、\oplus はビットごとの XOR 演算子です。したがって、もし b=00b = 0\ldots 0 (全てのビットが 00) ならば、fbf_b は 1対1対応関数であることがわかります。もし b00b \neq 0\ldots 0 ならば、fbf_b は 2対1対応関数であることがわかります。

    このアルゴリズムでは、オラクルは x0|x\rangle |0\rangle を入力として受け取ります。事前に定められた bb のもと、全ての x{0,1}nx \in \{0,1\}^n に対して f(x)=f(xb)f(x) = f(x\oplus b) となるようにオラクルは2つめの量子レジスタに書き込み、入力をxfs(x)|x\rangle|f_s(x)\rangle に変換します。

    このようなブラックボックス関数は、以下のような手順で実装できます。

    1. 1個目のレジスタの内容を2個目のレジスタにコピーします。 x0xx |x\rangle|0\rangle \rightarrow |x\rangle|x\rangle

    2. (1対1 または 2対1 写像を作る) もし b b 0 0 でない場合, j j ビットめの値が bj=1b_j = 1 となる最も小さなインデックス j j が存在します。もし xj=0x_j = 0 ならば、22個目のレジスターに b b に関して XOR を適用します。そうでなければ、何もしません。 xxxxb (もし xj=0 ならば) |x\rangle|x\rangle \rightarrow |x\rangle|x \oplus b\rangle ~\mbox{(もし}~x_j = 0~\mbox{ならば)}

    3. (ランダムな置換を行う) 22個目のレジスターの量子ビットをランダムに置換します。 xyxfb(y) |x\rangle|y\rangle \rightarrow |x\rangle|f_b(y)\rangle

    5. 演習

    1. Qiskitを使って、一般の サイモンの量子オラクルを実装して下さい。

    2. シミュレーターまたは実機上で実装した サイモンの量子オラクルに対して、秘密ビット列 b=1001b=1001 をテストして下さい。結果が想定通りだったか確認し、どうしてそうなったか説明してみてください。

    6. 参考文献

    1. Daniel R. Simon (1997) "On the Power of Quantum Computation" SIAM Journal on Computing, 26(5), 1474–1483, doi:10.1137/S0097539796298637

    2. Guangya Cai and Daowen Qiu. Optimal separation in exact query complexities for Simon's problem. Journal of Computer and System Sciences 97: 83-93, 2018, https://doi.org/10.1016/j.jcss.2018.05.001

    import qiskit qiskit.__qiskit_version__
    {'qiskit-terra': '0.16.1', 'qiskit-aer': '0.7.1', 'qiskit-ignis': '0.5.1', 'qiskit-ibmq-provider': '0.11.1', 'qiskit-aqua': '0.8.1', 'qiskit': '0.23.1'}

    翻訳担当: 野ヶ山尊秀 (nogayama @jp.ibm.com)

    訳注

    section 1.1 で使用される ドット積とXORの分配法則の証明

    Step 6 にて、(xy)z=(xz)(yz) (x \oplus y ) \cdot z = (x \cdot z ) \oplus ( y \cdot z ) と変換されていくが、これはドット積とXORの間に分配法則が成り立つためである。以下にこの分配法則を証明する。

    (xy)z =i=0n(xiyi)zi=i=0nxiziyizi=(i=0nxizi)(i=0nyizi)=(xz)(yz)\begin{darray}{rcl} (x \oplus y ) \cdot z \ & = & \bigoplus_{i=0}^{n} ( x_i \oplus y_i ) z_i \\ & = & \bigoplus_{i=0}^{n} x_i z_i \oplus y_i z_i \\ & = & \left( \bigoplus_{i=0}^{n} x_i z_i \right) \oplus \left( \bigoplus_{i=0}^{n} y_i z_i \right) \\ & = & (x \cdot z ) \oplus ( y \cdot z ) \end{darray}

    ここで、(xiyi)zi (x_i \oplus y_i) z_i = xiziyizi x_i z_i \oplus y_i z_i は以下の表を用いて導出した。

    xi x_i yi y_i zi z_i xiyi x_i \oplus y_i xizi x_i z_i yizi y_i z_i (xiyi)zi (x_i \oplus y_i) z_i xiziyizi x_i z_i \oplus y_i z_i
    00000000
    00100000
    01010000
    01110111
    10010000
    10111011
    11000000
    11101100

    section 2 の量子回路で構成される関数 f f xxに対する値と対応する y y b b とのドット積

    xf(x)y (=x \oplus b)x \cdot b
    0000110
    0111101
    1011011
    1100000

    シミュレーターでは xb=0 x \cdot b = 0 となる x x だけが測定される。

    section 3 の量子回路で構成される関数 f f xxに対する値と対応する y y b b とのドット積

    xf(x)y (=x \oplus b)x \cdot b
    0000001100
    0010011110
    0101001001
    0111011011
    1001000101
    1011010111
    1100000000
    1110010010

    シミュレーターでは xb=0 x \cdot b = 0 となる x x だけが測定される。

    section 3.2 の量子回路で構成される関数 f f xxに対する値と対応する y y b b とのドット積

    xf(x)y (=x \oplus b)x \cdot b
    0000110
    0110101
    1010011
    1100000

    ノイズを持つ実機では xb=0 x \cdot b = 0 となる x x の測定確率が高く、そうでない x x の測定確率は低い。