メインコンテンツへスキップ
このプロジェクトはベータ版です。バグを見つけましたか?GitHub Issueを開く。質問やアイデアがありますか?Discussionsで質問する — フィードバックをお待ちしています!
このページの翻訳品質はいかがですか?

Qiskit SDKにおけるビット順序

パッケージバージョン

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

qiskit[all]~=2.5.2

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

Qiskitの規則​

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

プリミティブ​

デフォルトでは、Qiskit はリトルエンディアンのビット順序規則に従います。ただし、BitArray のデフォルトは big(エンディアン)であるため、プリミティブがこの設定を変更するかどうかによって、プリミティブの出力に違いが生じます。たとえば、IBM® Quantum Compute Service の Sampler および Estimator プリミティブはビッグエンディアンの結果を返しますが、Executor はリトルエンディアンの結果を返します。

量子回路​

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

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Qubit

qc = QuantumCircuit(2)
qc.qubits[0] # qubit "0"

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

回路図​

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

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

整数​

ビットを数値として解釈する場合、ビット00が最下位ビットで、ビットn−1n-1が最上位ビットです。これは、各ビットが値2label2^\text{label}(labelはQuantumCircuit.qubits内の量子ビットのインデックス)を持つため、コーディング時に便利です。たとえば、次の回路実行は、ビット00が0、ビット11が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}

文字列​

ビット(または量子ビット)のリストを文字列として表示または解釈する場合、ビットn−1n-1が左端のビットで、ビット00が右端のビットです。これは、通常、最上位桁を左側に書く数値の表記法に従っており、Qiskitでは、ビットn−1n-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であると期待するかもしれませんが、通常はビットn−1n-1を表します。

状態ベクトル行列​

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

print(sv[1]) # amplitude of state |01>
print(sv[2]) # amplitude of state |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ゲートは変換∣01⟩↔∣11⟩|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に作用することに注意してください。

次のステップ​

推奨事項