Python(Qiskitサンプル_1ビット和算)

■Qiskitの1ビット和算(X, CX, CCXゲート)。
よく分かっていないので、とても簡単なサンプルでイメージをつかんでいきたい。今回1ビットの和算を試す。1ビットは1桁のみで0か1(2進数)がとれる。そのため、和算は単純に 0+0=00、1+0=01、0+1=01、1+1=10 の組み合わせだけ。

サンプルコードが下。

from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram
from qiskit import QuantumCircuit
import matplotlib.pyplot as plt

qc = QuantumCircuit(4, 2)

qc.x(0)
qc.x(1)

qc.cx(0, 2)
qc.cx(1, 2)
qc.ccx(0, 1, 3)

qc.draw('mpl')

# 測定
qc.measure(2, 0)
qc.measure(3, 1)

# シミュレーション
backend_sim = AerSimulator()
job_1 = backend_sim.run(qc, shots=512)
counts = job_1.result().get_counts(qc)
plot_histogram(counts)
plt.show()

ここで、qc = QuantumCircuit(4, 2) で量子ビット4つ、古典ビット2つを作成。x(0)で、1つ目の量子ビットを反転(0→1)。cx(0, 2)では、制御が1つ目の引数(0)、対象が2つ目の引数(2)で、制御が1の場合は反転なので、3つ目の量子ビットを反転(0→1、(0)はx(0)で1となっているので制御が1、3つ目の量子ビットはqc(2)で何もしていないので0のまま)。cx(1, 2)も同様に制御が1のため反転(1→0)。後の測定でこれが結果の1桁目になる。
ccx(0, 1, 3)では、制御1(0)、制御2(1)ともに1のときだけ反転。つまり繰り上がりの部分で、結果の2桁目になる。

上のコードは、1+1= の計算なので実行すると結果が下の10となる。

図では下のような感じ’(コード中のdrawで作成)。qが量子ビット、cが古典ビット。q0を見ると左から、まずxで反転、次にq0を制御、q2を対象としてq2を反転(1桁目の演算)、最後にq0, q1を使ってq3を反転(2桁目の演算)。

ここまでは重ね合わせなど量子コンピュータらしいことは行っておらず、結果は必ず10になる。qc.x(0), qc.x(1) のx部分をh(重ね合わせ)にすると下の結果となった。
1つ目、2つ目の量子ビットがそれぞれ0と1の状態を同時に持っていることになるため、0+0=00, 1+0=01, 0+1=01, 1+1=10 のすべての結果が出てくる。0と1の状態は同確率で持つため、01の結果は他の2倍になっているよう。


Chat GPTで問い合わせると乗算や除算はかなり複雑になるらしい。できれば、Shorのアルゴリズムを少し見てみたいけど...。