Qiskit SDKにおけるビット順序
パッケージバージョン
このページのコードは、以下の要件を使用して開発されました。 これらのバージョンまたはそれ以降のバージョンの使用を推奨します。
qiskit[all]~=2.3.0
個のビット(または量子ビット)のセットがある場合、通常は各ビットにのラベルを付けます。異なるソフトウェアやリソースは、コンピューターメモリと画面表示の両方でこれらのビットを順序付ける方法を選択する必要があります。
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>
回路図
回路図では、量子ビットが最上部の量子ビットで、量子ビットが最下部の量子ビットです。QuantumCircuit.drawのreverse_bits引数を使用してこれを変更できます(Qiskitでの順序の変更を参照)。
qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘
整数
ビットを数値として解釈する場合、ビットが最下位ビットで、ビットが最上位ビットです。これは、各ビットが値(labelはQuantumCircuit.qubits内の量子ビットのインデックス)を持つため、コーディング時に便利です。たとえば、次の回路実行は、ビットが0、ビットが1で終了します。これは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}
文字列
ビット(または量子ビット)のリストを文字列として表示または解釈する場合、ビットが左端のビットで、ビットが右端のビットです。これは、通常、最上位桁を左側に書く数値の表記法に従っており、Qiskitでは、ビットが最上位ビットとして解釈されるためです。
たとえば、次のセルは、1量子ビット状態の文字列からStatevectorを定義します。この場合、量子ビットは状態にあり、量子ビットは状態にあります。
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)}
これは、ビット文字列を解釈する際に時々混乱を引き起こします。左端のビットがビットであると期待するかもしれませんが、通常はビットを表します。
状態ベクトル行列
状態ベクトルを複素数(振幅)のリストとして表現する場合、Qiskitはこれらの振幅を、インデックスの振幅が計算基底状態を表すように順序付けます。
print(sv[1]) # 状態 |01> の振幅
print(sv[2]) # 状態 |10> の振幅
(0.7071067811865475+0j)
0j
ゲート
Qiskitの各ゲートは、独自の方法で量子ビットのリストを解釈できますが、制御ゲートは通常(control, target)の規則に従います。
たとえば、次のセルは、量子ビットが制御 で、量子ビットがターゲットである制御Xゲートを追加します。
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘
Qiskitで前述したすべての規則に従うと、このCXゲートは変換を実行するため、次の行列を持ちます。
Qiskitでの順序の変更
量子ビットを逆順(つまり、量子ビットが下部)で回路を描画するには、reverse_bits引数を使用します。これは生成される図にのみ影響し、回路には影響しません。Xゲートは依然として量子ビットに作用します。
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ゲートが量子ビットに作用することに注意してください。
次のステップ
- Groverのアルゴリズムチュートリアルで回路の使用例を参照してください。
- QuantumCircuit APIリファレンスを探索してください。