「アダマールテストって直感に反しない？」という疑問を計算で解決する

# はじめに
こんにちは、ユーゴです。今回は、量子コンピュータについてお話ししたいと思います。この節は余談的なのでスキップ可です。

最近は量子コンピュータの勉強をしており、直近では[Quantum Computation using Qiskit v0.2X](https://www.ibm.com/training/certification/ibm-certified-associate-developer-quantum-computation-using-qiskit-v02x-C0010300)を取得しました。[認定バッジ](https://www.credly.com/badges/fd36a671-c554-425f-a49b-08a591689954/public_url)も載せておきます。
さらに見識を深めるため、最近では[Quantum Native Dojo](https://dojo.qulacs.org/ja/latest/index.html)というページで学習を進めています。今回紹介するのは、こちらのページを進めていたときに、「アダマールテスト」という直感に反する現象を確認したので、紹介します。

# 本題
量子コンピュータの分野で、「[アダマールテスト](https://dojo.qulacs.org/ja/latest/notebooks/2.2_Hadamard_test.html)」というものがあります。回路は以下のように組みます。

![35be965f942fe2330f950cef2cb04f30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/c7f5e6e3-0757-f5f2-487a-7021be906eb2.png)

$|\psi\rangle$は任意の状態ベクトルですが、今回は$|0\rangle$としておきます。
ここで直感的に、最終的な状態ベクトルはどのようになると思いますか？
僕は以下のようになると思いました。

```math
|0\rangle\otimes|+\rangle
```

1量子目は$|0\rangle$にアダマールゲートを2回適用しているので、$HH|0\rangle=|0\rangle$
絶対に$|0\rangle$で測定されるから、アダマールテストって何の意味があるんだ？という謎がありました。

# 結論
1量子目が2量子目に干渉することによって、確率に変化が起きます。あくまで制御ユニタリゲートが直接1量子目に影響したのではなく、2量子目に干渉したことによる間接的な結果です。
これが量子の不思議な性質で、直感に反する原因だと考えています。

# 計算
具体的な計算で確認しましょう。
以下のような、制御アダマールゲートを使用したアダマールテストを考えます。

![スクリーンショット 2024-06-12 12.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/8c2e2ab0-abc7-6dea-2219-63740078cb20.png)

また、初期状態は以下とします。
```math
q[0] = |0\rangle
```
```math
q[1] = |0\rangle
```

ここで、回路を層に分けて計算します。

![スクリーンショット 2024-06-12 12.10.21 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/fd6b98c8-c6a4-2b03-c703-d2c8c3bb66ba.png)

並列回路におけるゲートの合成は、テンソル積で計算できます。

```math
U_1 = H \otimes I = \frac{1}{\sqrt2}\left(\begin{matrix} 1&0&1&0 \\ 0&1&0&1 \\ 1&0&-1&0 \\ 0&1&0&-1 \end{matrix}\right)
```

```math
U_2 = CH_{(0,1)} = \left(\begin{matrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0& \frac{1}{\sqrt{2}} &\frac{1}{\sqrt{2}} \\ 0&0&\frac{1}{\sqrt{2}}&-\frac{1}{\sqrt{2}} \end{matrix}\right)
```

```math
U_3 = H \otimes I = \frac{1}{\sqrt2}\left(\begin{matrix} 1&0&1&0 \\ 0&1&0&1 \\ 1&0&-1&0 \\ 0&1&0&-1 \end{matrix}\right)
```

ここで、合成されたゲートを適用していきます。

```math
U_3U_2U_1|00\rangle = U_3U_2\frac{1}{\sqrt2}\left(\begin{matrix} 1&0&1&0 \\ 0&1&0&1 \\ 1&0&-1&0 \\ 0&1&0&-1 \end{matrix}\right) \left(\begin{matrix} 1\\0\\0\\0 \end{matrix}\right)
```
```math
=U_3U_2\frac{1}{\sqrt2}\left(\begin{matrix} 1\\0\\1\\0 \end{matrix}\right)
```
```math
=U_3\left(\begin{matrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0& \frac{1}{\sqrt{2}} &\frac{1}{\sqrt{2}} \\ 0&0&\frac{1}{\sqrt{2}}&-\frac{1}{\sqrt{2}} \end{matrix}\right)\frac{1}{\sqrt2}\left(\begin{matrix} 1\\0\\1\\0 \end{matrix}\right)
```
```math
= U_3\frac{1}{\sqrt2}\left(\begin{matrix} 1\\0\\\frac{1}{\sqrt2}\\\frac{1}{\sqrt2} \end{matrix}\right)
```
```math
= \frac{1}{\sqrt2}\left(\begin{matrix} 1&0&1&0 \\ 0&1&0&1 \\ 1&0&-1&0 \\ 0&1&0&-1 \end{matrix}\right) \frac{1}{\sqrt2}\left(\begin{matrix} 1\\0\\\frac{1}{\sqrt2}\\\frac{1}{\sqrt2} \end{matrix}\right)
```
```math
= \frac{1}{2} \left(\begin{matrix} \frac{\sqrt2+1}{\sqrt2}\\ \frac{1}{\sqrt2}\\ \frac{\sqrt2-1}{\sqrt2}\\ -\frac{1}{\sqrt2}\\  \end{matrix}\right)
```
```math
= \left(\frac{\sqrt2+1}{2\sqrt2}|00\rangle + \frac{1}{2\sqrt2}|01\rangle + \frac{\sqrt2-1}{2\sqrt2}|10\rangle - \frac{1}{2\sqrt2}|11\rangle\right)
```

1量子目の測定結果が0となる確率$p_0$は、

```math
p_0 = \left| \frac{\sqrt2+1}{2\sqrt2} \right|^2 + \left| \frac{1}{2\sqrt2} \right|^2 = \frac{4+2\sqrt2}{8}
```

2量子目の測定結果が0となる確率$p_1$は、

```math
p_1 = \left| \frac{\sqrt2-1}{2\sqrt2} \right|^2 + \left| \frac{1}{2\sqrt2} \right|^2 = \frac{4-2\sqrt2}{8}
```

つまり、初期状態が$q[0]=|0\rangle$、$q[1]=|0\rangle$のアダマールテストにおいて、制御アダマールゲートを使用した時、1量子目の測定は

```math
p_0 = \frac{4+2\sqrt2}{8} \approx 0.85
```

```math
p_1 = \frac{4-2\sqrt2}{8} \approx 0.15
```

となり、$|1\rangle$も出現することがわかりました。

(人力なので、計算にミスがあれば教えてください)

# コードで確認する
GitHubにqiskitでアダマールテストを実行するコードを公開しました！
ぜひお試しください！
[HadamardTest](https://github.com/mu5dvlp/HadamardTest)：シミュレータ版
[QiskitRemoteJobTemplate](https://github.com/mu5dvlp/QiskitRemoteJobTemplate)：実機版

シミュレータ版は大体83%〜87%で理想的です。
実機版は1回しか試していませんが、82.7%とこちらも大方正しいです。(無料クレジット節約のため)

# 余談
アダマールテストも分からずよく[Quantum Computation using Qiskit v0.2X](https://www.ibm.com/training/certification/ibm-certified-associate-developer-quantum-computation-using-qiskit-v02x-C0010300)に受かったな...と思っています。ちなみにこちらの資格はqiskitというIBMが出している量子コンピューティング用のPythonライブラリについての技能を証明するものです。もちろん、前提として量子ビットの状態を計算できる必要があるので、事実としてこの資格を取ることで「qiskitを使ったプログラミング技能」と「量子状態の計算技能」の2つを証明できます。量子コンピュータ分野で働くことにご興味がある方は、ぜひ挑戦してみてください。

### 注意点
#### 1. 英語のテストのみ
英語が苦手だと、初見の質問パターンに対応できないことがあるかもしれません。(自分も1,2問英語が分からないという理由でスキップしました)。一応「Assessment」というテストが受けられるので、そちらで質問パターンを把握しておくと、かなり効果的です。

#### 2. qiskit v0.2.xの環境構築が大変
pipからだと0.2.xは古すぎて持ってこれません。現在は1.1.0が最新版であり、かなりコードも違います。僕は諦めてリファレンスを読み漁りました。

#### 3. お値段が高い
2万円します。キャンセル料は2,000円です。僕はテストのホストが鯖落ちしていたせいでテストを受けられず、1度キャンセル扱いとなり2,000円失いました🫠 補填もありません。
読者様が試験を受けるときは、鯖が落ちていないことを祈ります。

### 勉強したい人ウェルカム！
勉強方法、勉強時間など詳しく知りたい方は、ぜひ[@Yugo_dvlp](https://x.com/Yugo_dvlp)までご連絡ください！

# まとめ
いかがだったでしょうか。今回は、量子コンピューティングのアダマールテストについて解説しました。
このように、コンピュータ系の基礎的な話から、Unity, GAS, AWSなど実践的なプログラミングやツールなどについても紹介していきます。
お役に立てましたら、いいね,フォロー等よろしくお願いします！