量子ビットをイメージでつかむ（量子フーリエ変換編）

　本記事では[こちらを教科書](https://www.amazon.co.jp/IBM-Quantum%E3%81%A7%E5%AD%A6%E3%81%B6%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF-%E6%B9%8A%E9%9B%84%E4%B8%80%E9%83%8E/dp/4798062804/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3FF2DREBY73NG&dib=eyJ2IjoiMSJ9.wrsK9ZUNyNK8MZsBL-TISgTccLv1cAvI4B1Cod6a_lV22-PF0N_7w5FCMsrvDT4iCn5PepoKccEV4hDfNk9PD5_a5-nDAYJGT6zF1U_Kd3RBXApKuwgG1i3Fx4YW1P4dOVZyzKADIsfm_V_mD9VbFg.hZkSyHN2vXn8hLd2yiUhLpwA921WZWzvTDwSbDmpytA&dib_tag=se&keywords=IBMQ&qid=1740563210&sprefix=ibmq%2Caps%2C173&sr=8-1)として、今回は量子フーリエ変換を取り上げたいと思います。Jupyter notebookを https://github.com/sin-gee/ImageOfQuantumBit/blob/main/ImageOfFourieTransform.ipynb に置いておきますのでよろしければ試してみてください。
***
　「フーリエ変換とは何か」を語るのは、この記事のキャラ外と思い、量子フーリエ変換でやりたいことをまず模式的に表してみます。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/a497a1f1-ffae-46b2-a54b-a4e82382e9fc.png)
　左から、各量子ビットに$1$又は$0$を設定すると、各量子ビットの位相差に変換される、というものです。
　ここで、「数式、うっ！」となった方のために、少し解説しますが、不要な方は次の量子回路の説明まで読み飛ばしてください。
　まず、$k=2^2k_2+2^1k_1+2^0k_0$のクダリですが、（$1$又は$0$をとる量子）bitで数値を表現する手法です。パソコンをお持ちの方は、電卓アプリを立ち上げて「プログラマー」設定に替えてBIN（Binary）で数値（1又は0）を打ち込んでみてください。3bitの場合は0～7、4bitの場合は0～15の整数を表現することができます。
　一方の、$e^{2\pi i x}$ですが、$\pi$は御存知、円周率≒3.14、$i$は虚数２乗すると$-1$、$e$はネイピア数≒2.72です。円周率が数学界のキングならネイピア数はクイーン、虚数はジョーカーといった感じでしょうか。ネイピア数を円周率×虚数乗する式になっている訳ですが、この「$n$乗する」は「$n$回掛ける」という意味ではもはやなく、数学でよく行われる”矛盾なく意味を拡張”したものです。で、図にするとこんな感じ。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/9d6d7f18-2687-4f51-a349-50219fb17e76.png)
 横軸を実数、縦軸を虚数にした平面の半径$1$の円上の位置を表しています。勘の良い方は御気づきのとおり、ブロッホ球を北極方向から見た赤道に相当します。なお、左端の$-1=e^{\pi i}$は最も美しい式の呼び声も高いオイラーの公式です。
***

さて、今回、取り上げる量子回路はこれ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/096c64c9-70b6-41e1-b065-64ba9da63271.png)
　$q_2$に対する操作、$q_1$に対する操作、$q_0$に対する操作、SWAP（量子ビットの入れ替え）で最後に測定となっています。断っておきますが、この測定はダミーです。というのも、どういう条件であっても各ビットは$\lvert0\rangle$と$\lvert1\rangle$の50/50の混合状態になるからです。本当は、各ビットの位相（のずれ）を測定できるとよいのですが、オーセンティックな量子コンピュータ（のシミュレータ）ではそれはできません。ですので、通常、量子フーリエ変換がベタな形で使われることは無いと思います。使われ方としては、次回、解説するつもりである（量子フーリエ変換を逆転させた）量子位相推定でしょう。

　では始めます。まず$q_2$への操作ですが、SWAP後に$q_0$として出力されるビットを作っています。$q_0$としては$\lvert0\rangle$と$\lvert1\rangle$の混合状態で、$\lvert1\rangle$の位相は$e^{2\pi i k/2^3}$でした。これは
 $e^{2\pi i k/2^3}=e^{2\pi i (2^2k_2+2^1k_1+2^0k_0)/2^3}=e^{\pi i (k_2+1/2^1k_1+1/2^2k_0)}=e^{\pi i k_2}e^{\pi i/2 k_1}e^{\pi i/4 k_0}$
 と回路と式は符合します。 「ん？$e^{\pi i k_2}$は？」と思われた方、これはアダマールゲート（H）が該当します。アダマールゲートは$k=0$の場合は$\lvert0\rangle+\lvert1\rangle$に、$k=1$の場合に$\lvert0\rangle-\lvert1\rangle$となるわけですが、$e^{\pi i 0}=1$、$e^{\pi i 1}=-1$ことから説明できます(後者はオイラーの公式でした)。
　$q_1$以降も、$e^{2\pi i}=1$であることに注意が必要な他は同様です。
***
　用意したJupyter notebookでやってみます。 まず量子ビットを用意します
  ```python:
  #量子bit×3の生成
import dataclasses
@dataclasses.dataclass
class Qbit:
    phi: float # ブロッホ球での|0>からの角度
    shift: float # 位相差

#量子bit0
Q1 = Qbit(math.pi*1,math.pi*0)
#量子bit1
Q2 = Qbit(math.pi*0,math.pi*0)
#量子bit2
Q3 = Qbit(math.pi*1,math.pi*0)
  ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/8f92b6ce-d436-4f84-9020-ad3fdbfb7fed.png)
　今回は$\lvert101\rangle=5$を設定してみました。で、結果はこちら。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921213/0616d3d6-9a42-43f8-86e3-7f4578c26b5c.png)
　$q_0$の位相は$\lvert001\rangle$の$1.25\pi$、$q_1$の位相は$\lvert010\rangle$の$0.5\pi$、$q_2$の位相は$\lvert100\rangle$の$1.0\pi$となりました。