[超基礎]量子コンピュータのための量子論その2  嵐を呼ぶユニタリー演算子

#こんな人に役に立つと思いまして

- 量子コンピュータやりたい
- なんか勉強してるとユニタリー演算子とか出てくるけどユニタリー演算子ってそもそも何？
- きもいのはわかっているが量子コンピュータが好きで好きでたまらない

自分の中のまとめも兼ねているため悪しからず。また、今回ゲート式の量子コンピュータに限って話をします。(最近話題の光量子コンピュータものぞく)

こちらと一緒に読むとわかりやすいと思います。
[[超基礎]量子コンピュータのための量子論](https://qiita.com/OnigawaraTheTAKERIVER/items/8215311c65b6e589d9cb)

#量子コンピュータでの演算子の役割とは？

まずはここから。量子コンピュータは量子ビットを用いて計算します。量子コンピュータにとって「ビットに演算子を作用させる」とは計算におけるビットの操作を行うことです。

具体的に言いましょう。量子コンピュータは状態を表すとき|x>|y>という謎の記号を慣例的に使用します。例えば1ビット目が0で、2ビット目が1の状態は|0>|1>という感じです。

では操作をした結果、例えばどのような状態になるでしょう。|0>|0>のような、別のビットの状態でも良いですし、1/√2(|0>|1>+|0>|0>)のような量子固有の「状態の和」でも良いです。このようにビットの状態を変えるのが量子コンピュータでの演算子の役割です。演算子を複数回作用させて特定の計算を行います。

量子コンピュータで計算に用いる演算子は全て共通の特徴を持っています。全ての演算子はユニタリー演算子と呼ばれるものです。ユニタリー演算子とはなんなのか？以下ご覧ください。

#確率とユニタリー演算子

###係数ととりうる確率について

状態1/√2(|0>|1>+|0>|0>)の場合、なぜ係数が1/√2なのでしょうか。1/2ではダメでしょうか？実はコレ、係数の2乗がその状態をとる確率になるのです。つまり、1/√2(|0>|1>+|0>|0>)という状態のビットを測定した時に、1ビット目が0で2ビット目が1を得られる確率は1/2、同じく1ビット目が0で2ビット目が0を得られる確率は1/2となるのです。

確率は全て足して1になることはご存知の通り。先ほどの例で、仮に係数が1/2だった場合、1ビット目が0で2ビット目が1を得られる確率は1/4、同じく1ビット目が0で2ビット目が0を得られる確率は1/4となります。全て足して1/2、残り1/2はどうなるの？という話です。

演算子を作用させる前も後も当然係数を2乗して全て足すと1にならなければなりません。そのような性質を持った演算子でなければなりません。よって量子コンピュータの操作(演算子)には次のような制約が課せられます。

**演算した結果、係数の2乗の和を取ると変わらず1になる**

###ユニタリー演算子について

ユニタリー演算子は上記制約に基づく性質を持っている演算子の総称です。以下でもう少し詳細を議論します。

2ビットの場合、状態は以下4パターン存在します。これをベクトルに対応させましょう。

![AB2CDC32-5AEF-4BE7-BC4C-E3F74F5B7F3B.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/45aeb138-3191-93bc-a6e1-cb828c3db0d1.jpeg)
![E81AC021-A126-4B7B-BAEC-8AB028C9BB98.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/367cb754-a24c-7b5b-9cb1-0491c65f4a9d.jpeg)
![074B1CEB-6626-4E16-B39A-33EC9755E545.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/51c75ce1-8557-0d9e-18a6-2f65df4f4ab6.jpeg)
![A27D2CEB-24E9-42E0-9093-BF856514DA52.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/4602a483-8d83-64a7-3f2e-6419761968d2.jpeg)

実は、それぞれのベクトルは直交しますが、それを説明するとまた一苦労なので、本当に直交するかはいつか書くであろうエルミート演算子の記事を参考にしたください。何書いてあるかよくわからないWikipediaを参考にのせておきます。[Wikipedia エルミート演算子](https://ja.m.wikipedia.org/wiki/エルミート作用素)この4つのベクトルは4次元空間を張ることになります。4次元=ドラえもんのポケットではなく、つまり、2ビットのいかなる状態の和も、上の4通りのベクトルの和で表せるということです。4つの元が必要な空間という意味で、4次元空間になります。

この4次元空間の状態の「内積」という値を考えます。高校の時に習ったあれです。

![3A13C2C7-89E3-487C-83B0-B80CF55C80FF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/83bd184b-0ea5-aa87-5792-19651680588f.jpeg)
![42277943-2210-4AB3-A69B-B343D95AF012.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/bbda200c-8a0c-1a94-f0b8-71f917d73e2f.jpeg)

係数の2乗の和になっています。係数の2乗は確率であり、その和は1でした。ベクトルの内積の値が1であることと同じなのです。

さて内積の値は、同時にベクトルの長さの二乗でもあります。最初状態ベクトルの長さが1で、そこに状態を操作する演算子を作用させます。こうしてできた新しい状態ベクトルも長さが1ということは、演算子は長さを変えない演算子である必要があります。これを長さの単位を変えない、単位的(ユニット的)という思いをこめて、ユニタリー演算子と言います。量子コンピュータでビット操作をした結果、係数の2乗の和は必ず1でなければなりません。結果、演算子は総じてユニタリー演算子であるべきなのです。

#もっとユニタリー演算子を知ろう

みんな嫌いな数学記号で表しましょう。状態|v>にユニタリー演算子**U**を作用させましょう。状態|v>は一般的な状態です。ユニタリー演算子を作用させた後の状態の内積が何か、議論したいです。

![64F1D76B-A71A-43D1-9AB2-77A414F11D5D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/1db7efef-5ca5-0c4d-1373-dca59e4f1cf3.jpeg)

ここで少し難しい話をします。そしてここを乗り越えなければユニタリー演算子を数学的に理解することができません。数学嫌いな人はスキップしてね。今、演算子を状態に作用させたもの「同士」の内積を求めようとしました。でもここでは、実は演算子を作用させて(**U**)そのあとさらにもう一つの演算子を作用させた(**U^+**)状態と元の状態の内積を考えましょう。演算子を作用させた(**U**)もの同士の内積と、この値が同じになる場合、演算子**U^+**が存在すると言えます。この演算子**U^+**を**U**の「共役な演算子」と呼び、この+はダガーと呼びます。

![A6E270F1-E188-4B8C-B7AE-36C5A64B0954.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/7da13f9f-2634-4075-e4d6-4a7a30977b51.jpeg)

さらにこの値は、元の状態|v>の内積から値は変化しないという条件を演算子に課します。

![CAFB2724-BD1E-4235-A969-353C8255F54E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/6af9deb8-cf3c-f82c-2d39-26c057422e9c.jpeg)
![CA51B859-9987-4BB9-A224-22566D5C0707.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/3d59d18a-9e25-64fa-8593-be0917fcf40f.jpeg)
![2FCD3FB3-86C1-4D94-8914-4C1A3B8CB82A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421609/6058db87-6aca-183a-9e74-b7301a86f76e.jpeg)

これが、ユニタリー演算子の数学的な定義です。共役な演算子と逆演算子が一致する場合、それはユニタリー演算子です。ちなみに**U^-1**は逆演算子で、状態変化**U**を元に戻す演算子のことです。

証明は省略しますが、状態をフリップさせる演算子や、位相反転させる演算子、cNOT演算子など全てユニタリー演算子です。

直感的には、状態ベクトルの長さが変わらなければ、良いわけです。

#まとめ

- 量子コンピュータのビット操作は全てユニタリー演算子に相当している。
- ユニタリー演算子は、状態ベクトルの長さを変えない。
- 状態ベクトルの長さとは、自身との内積のこと。
- 共役な演算子と逆演算子が等しい場合、それはユニタリー演算子

こちらも一緒にお読みください。
[量子コンピュータで最初のアルゴリズム、ドイチュの問題](https://qiita.com/OnigawaraTheTAKERIVER/items/7aa2450c6f54dd92a09e)