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

フラクショナルゲート

パッケージバージョン

このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以降を使用することをお勧めします。

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

このページでは、IBM Quantum® QPUフリートで新たにサポートされた2種類のゲートタイプを紹介します。これらのフラクショナルゲートは、Heron QPUで次の形式でサポートされています:

  • RZZ(θ)R_{ZZ}(\theta)0<θπ/20 \lt \theta \leq \pi/2の範囲)
  • RX(θ)R_X(\theta)(任意のθ\theta

このページでは、フラクショナルゲートの実装がワークフローの効率を向上させるユースケースと、IBM Quantum QPUでこれらのゲートを使用する方法について説明します。

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime

フラクショナルゲートの使用方法

内部的には、これらのフラクショナルゲートは任意の角度に対してRZZ(θ)R_{ZZ}(\theta)およびRX(θ)R_X(\theta)回転を直接実行することで動作します。RX(θ)R_X(\theta)ゲートを使用すると、任意角度の1量子ビット回転の時間とエラーを最大2倍削減できます。RZZ(θ)R_{ZZ}(\theta)ゲートの回転を直接実行することで、複数の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量子ビットのRZZ(θ)R_{ZZ}(\theta)ゲートについては、IBM Quantumハードウェア上で実行できる角度は00からπ/2\pi/2の間のみです。Circuitにこの範囲外の角度を持つRZZ(θ)R_{ZZ}(\theta)ゲートが含まれている場合、標準のトランスパイルパイプラインは通常、適切なCircuit変換(FoldRzzAngleパスを通じて)でこれを修正します。ただし、1つ以上のParameterを含むRZZ(θ)R_{ZZ}(\theta)ゲートについては、Transpilerはこれらのパラメータが実行時にこの範囲内の角度に割り当てられると仮定します。Qiskit RuntimeへのPUBに指定されたパラメータ値のいずれかがこの範囲外の場合、ジョブは失敗します。

フラクショナルゲートを使用する場面

歴史的に、IBM Quantum QPUで利用可能なBasis Gateは**CZXRZSXID**であり、π/2\pi / 2の倍数でない1量子ビットおよび2量子ビット回転を持つCircuitを効率的に表現できませんでした。例えば、RX(θ)R_X(\theta)ゲートはトランスパイル時に一連のRZRZゲートとX\sqrt{X}ゲートに分解する必要があり、1つではなく有限時間を持つ2つのゲートを含むCircuitが作成されます。

同様に、RZZ(θ)R_{ZZ}(\theta)ゲートなどの2量子ビット回転がトランスパイルされる場合、分解には2つの**CZ**ゲートといくつかの1量子ビットゲートが必要となり、Circuit深度が増加します。これらの分解は以下のコードに示されています。

qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")

前のコードセルの出力

# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)

前のコードセルの出力

from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager

from qiskit_ibm_runtime import QiskitRuntimeService

qc = QuantumCircuit(2)
param = Parameter("θ")
qc.rzz(param, 0, 1)
qc.draw("mpl")

前のコードセルの出力

# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)

前のコードセルの出力

多くの1量子ビットRX(θ)R_X(\theta)または2量子ビット回転を必要とするワークフロー(変分アンザッツや量子システムの時間発展をシミュレートする場合など)では、この制約によってCircuit深度が急速に増大します。しかし、フラクショナルゲートはこの要件を取り除きます。なぜなら、1量子ビットおよび2量子ビット回転が直接実行され、より効率的な(つまりエラーが抑制された)量子Circuitが作成されるからです。

フラクショナルゲートを使用すべきでない場面

フラクショナルゲートは実験的な機能であり、use_fractional_gatesフラグの動作は将来変更される可能性があることに注意することが重要です。詳細については、Qiskit Runtimeの新バージョンのリリースノートをご覧ください。また、use_fractional_gatesについて説明しているQiskitRuntimeService.backendのAPIリファレンスドキュメントも参照してください。

また、QiskitのTranspilerには最適化パスでRZZ(θ)R_{ZZ}(\theta)を使用する機能が限られています。そのため、これらの命令を含むCircuitの設計と最適化においてより注意が必要です。

最後に、フラクショナルゲートは以下の用途ではサポートされていません:

特定の量子ワークロードに対するエラー緩和および抑制技術のカスタマイズについては、プリミティブオプションのガイドをお読みください。

次のステップ

推奨事項