The new Qiskit Textbook beta is now available. Try it out now
Set 2. 1量子ビットゲートの合成の基礎
from qiskit import *
from qiskit.tools.visualization import plot_histogram
%config InlineBackend.figure_format = 'svg' # 画像をいい感じに表示する
import numpy as np

1

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

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

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

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

2

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

$$ 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$ について成り立ちます。 有限の $n$ について実装をすると、得られるゲートは $n$ が大きくなるとアダマールゲートに漸近していく近似となっているでしょう。

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

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

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

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)
2020-11-29T19:42:36.765052 image/svg+xml Matplotlib v3.3.3, https://matplotlib.org/

3

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

$$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'}