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

フラクショナルゲート

パッケージバージョン

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

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0

このページでは、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 — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_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")

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

内部的には、これらのフラクショナルゲートは任意の角度に対してRZZ(θ)R_{ZZ}(\theta)およびRX(θ)R_X(\theta)回転を直接実行することで動作します。RX(θ)R_X(\theta)ゲートを使用すると、任意角度の1量子ビット回転の時間とエラーを最大で半分に削減できます。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_name = service.least_busy(operational=True, simulator=False).name
backend_fractional = service.backend(backend_name, use_fractional_gates=True)
backend_conventional = service.backend(
backend_name, 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 はこれらのパラメータが実行時にこの範囲内の角度に割り当てられると仮定します。IBM Quantum Compute Service への PUB に指定されたパラメータ値のいずれかがこの範囲外の場合、ジョブは失敗します。

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

歴史的に、IBM Quantum QPUで利用可能なBasis Gateは**CZ、X、RZ、SX、ID**であり、π/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.least_busy(operational=True, simulator=False)
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.least_busy(operational=True, simulator=False)
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-ibm-runtime の新バージョンのリリースノートを参照してください。また、use_fractional_gates について説明しているQiskitRuntimeService.backendのAPIリファレンスドキュメントも参照してください。

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

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

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

どのBackendがフラクショナルゲートをサポートしていますか?​

すべてのBackendがフラクショナルゲートをサポートしているわけではありません。サポートしているものを見つけるには、service.backends(use_fractional_gates=True)を実行してください。qiskit-ibm-runtime v0.48のリリースにより、フラクショナルゲートをサポートする最も空いているBackendを見つけるために、service.least_busy(fractional_gates=True)を実行することもできます。フェイクBackendは、関連する「実際の」Backendがそれらをサポートしている場合にのみ、フラクショナルゲートをサポートします。

フラクショナルゲートはデフォルトで無効になっているため、フェイクBackendはデフォルトではフラクショナルゲートをサポートしないことに注意してください。フラクショナルゲートをサポートするフェイクBackendでそれらを有効にするには、その設定を更新してください。

Example:

service = QiskitRuntimeService()
fake_backend = FakeBoston()
fake_backend.refresh(service=service, use_fractional_gates=True)

次のステップ​

推奨事項