数学は苦手ですが、便利なツールは使いたいということで、任意のユニタリ演算を分解するKAK分解の概要について確認をし、使い方を見てみたいと思います。理論的な内容を詳しく追おうとも考えていましたが、まったく時間がとれなさそうなので表面だけ触ります。。。
機械学習においてのモチベーション
任意のユニタリ演算を量子回路に置き換えたい需要は様々あります。ここでは以前勉強会で取り扱った、QCNNにおける畳み込みに対応する関数をユニタリ演算でおき、そのユニタリ演算を量子回路で表現するというものでした。
概要
U(4)を4つのSU(2)と3パラメータの
論文
A universal quantum circuit for two-qubit transformations with three CNOT gates
量子回路1
量子回路2
利用する主なゲート
1量子ビットの任意回転ゲートおよび2量子ビットの任意回転ゲートを利用します。
1量子ビット任意回転ゲート
from https://qiita.com/KeiichiroHiga/items/f5117efcf6a96c9d10b8
2量子ビット任意回転ゲート
from https://qiita.com/KeiichiroHiga/items/d9377060fbc97817d849
量子回路2構成
Tensorflow Quantumより引用(1量子ビットの任意回転ゲートがずれているのは実機の仕様かと思われます)
from blueqat import Circuit
import numpy as np
def singleU(angle, qubit):
return Circuit().rx(angle[0])[qubit].ry(angle[1])[qubit].rz(angle[2])[qubit]
def doubleU(angle, qubit_array):
return Circuit().rzz(angle[0])[qubit_array[0],qubit_array[1]].ryy(angle[1])[qubit_array[0],qubit_array[1]].rxx(angle[2])[qubit_array[0],qubit_array[1]]
params = [2*np.pi*np.random.rand() for _ in range(15)]
a = Circuit()
a += singleU(params[0:3],0) + singleU(params[3:6],1) + doubleU(params[6:9],[0,1]) + singleU(params[9:12],0) + singleU(params[12:15],1)
a.m[:].run(shots=100)
Counter({'11': 41, '00': 34, '01': 17, '10': 8})
このように回路ができました。今後はなるべくこの回路を使って計算をするようにしたいと思います。以上です。