メインコンテンツへスキップ

Qiskit SDKにおけるビット順序

パッケージバージョン

このページのコードは、以下の要件を使用して開発されました。 これらのバージョンまたはそれ以降のバージョンの使用を推奨します。

qiskit[all]~=2.3.0

nn個のビット(または量子ビット)のセットがある場合、通常は各ビットに0n10 \rightarrow n-1のラベルを付けます。異なるソフトウェアやリソースは、コンピューターメモリと画面表示の両方でこれらのビットを順序付ける方法を選択する必要があります。

Qiskitの規則

Qiskit SDKが異なるシナリオでビットを順序付ける方法は次のとおりです。

量子回路

QuantumCircuitクラスは、その量子ビットをリスト(QuantumCircuit.qubits)に格納します。このリスト内の量子ビットのインデックスが、量子ビットのラベルを定義します。

from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Qubit

qc = QuantumCircuit(2)
qc.qubits[0] # 量子ビット "0"

Qubit(QuantumRegister(2, "q"), 0)
<Qubit register=(2, "q"), index=0>

回路図

回路図では、量子ビット00が最上部の量子ビットで、量子ビットn1n-1が最下部の量子ビットです。QuantumCircuit.drawreverse_bits引数を使用してこれを変更できます(Qiskitでの順序の変更を参照)。

qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

整数

ビットを数値として解釈する場合、ビット00が最下位ビットで、ビットn1n-1が最上位ビットです。これは、各ビットが値2label2^\text{label}(labelはQuantumCircuit.qubits内の量子ビットのインデックス)を持つため、コーディング時に便利です。たとえば、次の回路実行は、ビット000、ビット111で終了します。これは10進整数2として解釈されます(確率1.0で測定)。

from qiskit.primitives import StatevectorSampler as Sampler

qc.measure_all()

job = Sampler().run([qc])
result = job.result()
print(f" > Counts: {result[0].data.meas.get_counts()}")
> Counts: {'10': 1024}

文字列

ビット(または量子ビット)のリストを文字列として表示または解釈する場合、ビットn1n-1が左端のビットで、ビット00が右端のビットです。これは、通常、最上位桁を左側に書く数値の表記法に従っており、Qiskitでは、ビットn1n-1が最上位ビットとして解釈されるためです。

たとえば、次のセルは、1量子ビット状態の文字列からStatevectorを定義します。この場合、量子ビット00は状態+|+\rangleにあり、量子ビット11は状態0|0\rangleにあります。

from qiskit.quantum_info import Statevector

sv = Statevector.from_label("0+")
sv.probabilities_dict()
{np.str_('00'): np.float64(0.4999999999999999),
np.str_('01'): np.float64(0.4999999999999999)}

これは、ビット文字列を解釈する際に時々混乱を引き起こします。左端のビットがビット00であると期待するかもしれませんが、通常はビットn1n-1を表します。

状態ベクトル行列

状態ベクトルを複素数(振幅)のリストとして表現する場合、Qiskitはこれらの振幅を、インデックスxxの振幅が計算基底状態x|x\rangleを表すように順序付けます。

print(sv[1])  # 状態 |01> の振幅
print(sv[2]) # 状態 |10> の振幅
(0.7071067811865475+0j)
0j

ゲート

Qiskitの各ゲートは、独自の方法で量子ビットのリストを解釈できますが、制御ゲートは通常(control, target)の規則に従います。

たとえば、次のセルは、量子ビット00が制御で、量子ビット11がターゲットである制御Xゲートを追加します。

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘

Qiskitで前述したすべての規則に従うと、このCXゲートは変換0111|01\rangle \leftrightarrow |11\rangleを実行するため、次の行列を持ちます。

(1000000100100100)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ \end{pmatrix}

Qiskitでの順序の変更

量子ビットを逆順(つまり、量子ビット00が下部)で回路を描画するには、reverse_bits引数を使用します。これは生成される図にのみ影響し、回路には影響しません。Xゲートは依然として量子ビット00に作用します。

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘

reverse_bitsメソッドを使用して、量子ビットのラベルが逆転した新しい回路を返すことができます(これは元の回路を変更しません)。

qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

この新しい回路では、Xゲートが量子ビット11に作用することに注意してください。

次のステップ

推奨事項