#こんな人に役に立つと思いまして
- 量子コンピュータやりたい
- なんか勉強してるとユニタリー演算子とか出てくるけどユニタリー演算子ってそもそも何?
- きもいのはわかっているが量子コンピュータが好きで好きでたまらない
自分の中のまとめも兼ねているため悪しからず。また、今回ゲート式の量子コンピュータに限って話をします。(最近話題の光量子コンピュータものぞく)
こちらと一緒に読むとわかりやすいと思います。
[超基礎]量子コンピュータのための量子論
#量子コンピュータでの演算子の役割とは?
まずはここから。量子コンピュータは量子ビットを用いて計算します。量子コンピュータにとって「ビットに演算子を作用させる」とは計算におけるビットの操作を行うことです。
具体的に言いましょう。量子コンピュータは状態を表すとき|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パターン存在します。これをベクトルに対応させましょう。
実は、それぞれのベクトルは直交しますが、それを説明するとまた一苦労なので、本当に直交するかはいつか書くであろうエルミート演算子の記事を参考にしたください。何書いてあるかよくわからないWikipediaを参考にのせておきます。Wikipedia エルミート演算子この4つのベクトルは4次元空間を張ることになります。4次元=ドラえもんのポケットではなく、つまり、2ビットのいかなる状態の和も、上の4通りのベクトルの和で表せるということです。4つの元が必要な空間という意味で、4次元空間になります。
この4次元空間の状態の「内積」という値を考えます。高校の時に習ったあれです。
係数の2乗の和になっています。係数の2乗は確率であり、その和は1でした。ベクトルの内積の値が1であることと同じなのです。
さて内積の値は、同時にベクトルの長さの二乗でもあります。最初状態ベクトルの長さが1で、そこに状態を操作する演算子を作用させます。こうしてできた新しい状態ベクトルも長さが1ということは、演算子は長さを変えない演算子である必要があります。これを長さの単位を変えない、単位的(ユニット的)という思いをこめて、ユニタリー演算子と言います。量子コンピュータでビット操作をした結果、係数の2乗の和は必ず1でなければなりません。結果、演算子は総じてユニタリー演算子であるべきなのです。
#もっとユニタリー演算子を知ろう
みんな嫌いな数学記号で表しましょう。状態|v>にユニタリー演算子Uを作用させましょう。状態|v>は一般的な状態です。ユニタリー演算子を作用させた後の状態の内積が何か、議論したいです。
ここで少し難しい話をします。そしてここを乗り越えなければユニタリー演算子を数学的に理解することができません。数学嫌いな人はスキップしてね。今、演算子を状態に作用させたもの「同士」の内積を求めようとしました。でもここでは、実は演算子を作用させて(U)そのあとさらにもう一つの演算子を作用させた(U^+)状態と元の状態の内積を考えましょう。演算子を作用させた(U)もの同士の内積と、この値が同じになる場合、演算子U^+が存在すると言えます。この演算子U^+をUの「共役な演算子」と呼び、この+はダガーと呼びます。
さらにこの値は、元の状態|v>の内積から値は変化しないという条件を演算子に課します。
これが、ユニタリー演算子の数学的な定義です。共役な演算子と逆演算子が一致する場合、それはユニタリー演算子です。ちなみにU^-1は逆演算子で、状態変化Uを元に戻す演算子のことです。
証明は省略しますが、状態をフリップさせる演算子や、位相反転させる演算子、cNOT演算子など全てユニタリー演算子です。
直感的には、状態ベクトルの長さが変わらなければ、良いわけです。
#まとめ
- 量子コンピュータのビット操作は全てユニタリー演算子に相当している。
- ユニタリー演算子は、状態ベクトルの長さを変えない。
- 状態ベクトルの長さとは、自身との内積のこと。
- 共役な演算子と逆演算子が等しい場合、それはユニタリー演算子
こちらも一緒にお読みください。
量子コンピュータで最初のアルゴリズム、ドイチュの問題