フラクショナルゲート
パッケージバージョン
このページのコー ドは、以下の要件を使用して開発されました。 これらのバージョン以降を使用することをお勧めします。
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
このページでは、IBM Quantum® QPUフリートで新たにサポートされた2種類のゲートタイプを紹介します。これらのフラクショナルゲートは、Heron QPUで次の形式でサポートされています:
- (の範囲)
- (任意の)
このページでは、フラクショナルゲートの実装がワークフローの効率を向上させるユースケースと、IBM Quantum QPUでこれらのゲートを使用する方法について説明します。
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
フラクショナルゲートの使用方法
内部的には、これらのフラクショナルゲートは任意の角度に対しておよび回転を直接実行することで動作します。ゲートを使用すると、任意角度の1量子ビット回転の時間とエラーを最大2倍削減できます。ゲートの回転を直接実行することで、複数のCZGateオブジェクトへの分解を避け、同様にCircuitの時間とエラーを削減します。これは、量子システムのダイナミクスをシミュレートする場合や、多くのパラメータを持つ変分アンザッツを使用する場合など、多くの1量子ビットおよび2量子ビット回転を含むCircuitに特に有効です。
これらのゲートタイプはQuantumCircuitが持てる標準ゲートのライブラリに含まれていますが、特定のIBM Quantum QPUでのみ使用でき、use_fractional_gatesフラグをTrueに設定して読み込む必要があります(以下を参照)。このフラグにより、フラクショナルゲートがTranspiler用のBackendのTargetに含まれるようになります。
service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)
このコード例では、フラクショナルゲートを使用してイジング鎖のダイナミクスをシミュレートするワークフローの文脈でフラクショナルゲートを使用する方法を示します。その後、Circuit時間をフラクショナルゲートを使用しないBackendと比較します。
フラクシ ョナルゲートが有効なBackendのTargetで報告されるエラー値は、非フラクショナルゲートに対応するもののコピーにすぎません(同一でない場合があります)。これは、フラクショナルゲートのエラーレートの報告がまだサポートされていないためです。
ただし、フラクショナルゲートと非フラクショナルゲートのゲート時間は同じであるため、エラーレートは比較可能であると合理的に仮定できます――特にCircuit内のエラーの主要な要因が緩和によるものである場合はなおさらです。
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple
from qiskit_ibm_runtime import QiskitRuntimeService
num_qubits = 5
num_time_steps = 3
rx_angle = 0.1
rzz_angle = 0.1
ising_circuit = QuantumCircuit(num_qubits)
for i in range(num_time_steps):
# rx layer
for q in range(num_qubits):
ising_circuit.rx(rx_angle, q)
for q in range(1, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
# 2nd rzz layer
for q in range(0, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
ising_circuit.barrier()
ising_circuit.draw("mpl")
フラクショナルゲートを有効にしたものと無効にしたものの2つのBackend オブジェクトを指定し、両方をトランスパイルします。
service = QiskitRuntimeService()
backend_fractional = service.backend("ibm_torino", use_fractional_gates=True)
backend_conventional = service.backend(
"ibm_torino", use_fractional_gates=False
)
pm_fractional = generate_preset_pass_manager(
optimization_level=3, backend=backend_fractional, scheduling_method="alap"
)
pm_conventional = generate_preset_pass_manager(
optimization_level=3,
backend=backend_conventional,
scheduling_method="alap",
)
ising_circuit_fractional = pm_fractional.run(ising_circuit)
ising_circuit_conventional = pm_conventional.run(ising_circuit)
2種類のゲートを使用したCircuitのタイムラインを表示します。
# Draw timeline of circuit with conventional gates
draw_timeline(
ising_circuit_conventional,
idle_wires=False,
target=backend_conventional.target,
time_range=(0, 500),
style=IQXSimple(),
)
# Draw timeline of circuit with fractional gates
draw_timeline(
ising_circuit_fractional,
idle_wires=False,
target=backend_fractional.target,
time_range=(0, 500),
style=IQXSimple(),
)
角度の制約
2量子ビットのゲートについては、IBM Quantumハードウェア上で実行できる角度はからの間のみです。Circuitにこの範囲外の角度を持つ