皆さん、こんにちは!
2回目の投稿になります。
今回は量子フーリエ変換(Quantum transformatio, QFT)を実装していきます。詳しい解説はQuantum Native DojoやNielsen & Chuangなどの書籍を参照してください。
1. 必要なライブラリをインポート
import numpy as np
from qulacs import QuantumState, QuantumCircuit
from qulacs.gate import Z, H, S, T, DenseMatrix, to_matrix_gate
今回使うライブラリに絞って、インポートしました。
2 制御Rnゲートの実装
def control_R(j, target, control):
if j == 1:
gate = to_matrix_gate(Z(target))
if j == 2:
gate = to_matrix_gate(S(target))
if j == 3:
gate = to_matrix_gate(T(target))
else:
gate = DenseMatrix(target, [[1 , 0], [0, np.exp(1j * 2.0*np.pi / 2.0**j)]])
gate.add_control_qubit(control, 1)
return gate
Sympy(にはあるのか知らないが、)と違って、Qlacsには、DenseMatrixが実装されているので、これで、$R_4$以降のゲートの演算子を与える事ができる。
3 量子フーリエ変換の回路
回路図(参考リンク参照)に従って実装、再帰的に書かれているので、
割とコンパクトに書ける。
def qft_circuit(n):
circuit = QuantumCircuit(n)
for target in range(n):
circuit.add_gate(H(target))
for control in range(target+1, n):
j = control + 1
circuit.add_gate(control_R(j, target, control))
return circuit
4. Qubitの用意
Quantum native Dojoのやり方に従って4Qubitを用意してみる。4QubitならDenseMatrixも使うので、n=3の場合の拡張になっている。
n = 4
state = QuantumState(n)
state.set_computational_basis(0)
buffer = QuantumState(n)
for i in range(1, 2**n):
buffer.set_computational_basis(i)
state.add_state(buffer)
state.multiply_coef(1 / np.sqrt(2**n))
print("実行前: " , state)
結果
実行前: *** Quantum State ***
* Qubit Count : 4
* Dimension : 16
* State vector :
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
(0.25,0)
5 回路を作用させる
circuit = qft_circuit(n)
circuit.update_quantum_state(state)
print("実行後: ", state)
結果
実行後: *** Quantum State ***
* Qubit Count : 4
* Dimension : 16
* State vector :
(1,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
(0,0)
n=3の場合の結果と一致している。
6 感想
Sympyの方がビジュアル的にはわかりやすいが、慣れれば色々な機能があるので、Qulacsの方が応用範囲は広そうだ。今後もたくさん練習していろいろ書けるようになりたい。
7 参考文献
- Quantum Native Dojo!
https://dojo.qulacs.org/ja/latest/ - Qulacs使ってみた報告
https://zenn.dev/2201/articles/8c773e3ba29200