Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/translations/ja/ch-ex/ex2.ipynb
3855 views
Kernel: Python 3

1量子ビットゲートの合成の基礎

from qiskit import * from qiskit.tools.visualization import plot_histogram %config InlineBackend.figure_format = 'svg' # 画像をいい感じに表示する import numpy as np

1

アダマールゲートが次の2つの形で書けることを示してください。

H=X+Z2exp(iπ2X+Z2).H = \frac{X+Z}{\sqrt{2}} \equiv \exp\left(i \frac{\pi}{2} \, \frac{X+Z}{\sqrt{2}}\right).

ここで、\equivはグローバル位相の違いを除いて等しいということを示すために使用されています。 したがって、得られたゲートは物理的に等価です。

ヒント: 固有値が ±1\pm 1 の任意の行列 MM が、M2=IM^2=I を満たしていることと、 eiπ2MMe^{i\frac{\pi}{2} M} \equiv M が成り立つことを証明するのが簡単かもしれません。

2

アダマールゲートは次のように rxrz の操作から構成することが出来ます。

Rx(θ)=eiθ2X,   Rz(θ)=eiθ2Z,Hlimn( Rx(θn)  Rz(θn) )n.R_x(\theta) = e^{i\frac{\theta}{2} X}, ~~~ R_z(\theta) = e^{i\frac{\theta}{2} Z},\\ H \equiv \lim_{n\rightarrow\infty} \left( ~R_x\left(\frac{\theta}{n}\right) ~~R_z \left(\frac{\theta}{n}\right) ~\right)^n.

この等式は適切に選んだ θ\theta について成り立ちます。 有限の nn について実装をすると、得られるゲートは nn が大きくなるとアダマールゲートに漸近していく近似となっているでしょう。

次で、誤ったθ\theta を選んで、Qiskit で実装した例を示しています。(グローバル位相は無視しています。)

  • θ\theta の正しい値を決定してください。

  • (正しい θ\theta を用いているときに)エラーが nn が増えるにつれて二次的に減少していくことを示してください。

q = QuantumRegister(1) c = ClassicalRegister(1) error = {} for n in range(1,11): # 空の量子回路を作る qc = QuantumCircuit(q,c) # 近似アダマールを実装する theta = np.pi # ここで theta として誤った値 π を設定 for j in range(n): qc.rx(theta/n,q[0]) qc.rz(theta/n,q[0]) # 上の近似がどのくらい良いか測る必要があります。これを行う簡単な方法があります。 # Step 1: 上の近似アダマールをキャンセルする実際のアダマールを使います。 # 良い近似ならば, 量子ビットは0状態になるでしょう。悪い近似ならば、何かしらの重ね合わせ状態になっているでしょう。 qc.h(q[0]) # Step 2: 量子回路を実行して、どのくらい測定値 1 が出るのかを調べます。 # (良い近似ならば)確実に0 が出るはずなので、1 が出る割合は誤差の指標となります。 qc.measure(q,c) shots = 20000 job = execute(qc, Aer.get_backend('qasm_simulator'),shots=shots) try: error[n] = (job.result().get_counts()['1']/shots) except: pass plot_histogram(error)
Image in a Jupyter notebook

3

近似の改善版が次の式から得られます。

Hlimn( Rz(θ2n)  Rx(θn)  Rz(θ2n) )n.H \equiv \lim_{n\rightarrow\infty} \left( ~ R_z \left(\frac{\theta}{2n}\right)~~ R_x\left(\frac{\theta}{n}\right) ~~ R_z \left(\frac{\theta}{2n}\right) ~\right)^n.

これを実装し、エラーのスケーリングを調べてみてください。

import qiskit qiskit.__qiskit_version__
{'qiskit-terra': '0.16.1', 'qiskit-aer': '0.7.1', 'qiskit-ignis': '0.5.1', 'qiskit-ibmq-provider': '0.11.1', 'qiskit-aqua': '0.8.1', 'qiskit': '0.23.1'}