Skip to main content
IBM Quantum Platform

分断ゲート

  • このページのコードは、以下の要件に基づいて開発された。 これらのバージョンまたは新しいバージョンの使用をお勧めします。

    qiskit[all]~=2.3.1
    qiskit-ibm-runtime~=0.45.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でこれらのゲートを使用する方法について説明します。


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

内部的には、これらのフラクショナルゲートは、任意の角度に対する RZZ(θ)R_{ZZ}(\theta) および RX(θ)R_X(\theta) の回転を直接実行することで機能する。 RX(θ)R_X(\theta) ゲートを使用することで、任意の角度の単一量子ビット回転の所要時間と誤差を最大2倍まで削減できる。 RZZ(θ)R_{ZZ}(\theta) ゲート回転の直接実行により、複数の CZGate オブジェクトへの分解が回避され、同様に回路の持続時間と誤差が低減される。 これは特に、量子システムのダイナミクスをシミュレートする場合や、多くのパラメータを持つ変分アンザッツを使用する場合など、単一量子ビットおよび二量子ビット回転を多く含む回路において有用である。

これらのタイプのゲートは、QPU QuantumCircuit 保有できる標準ゲートのライブラリに含まれていますが、特定の IBM Quantum QPUでのみ使用可能であり、かつフラグが(以下に use_fractional_gates 示す True ように)に設定された状態でロードされている必要があります。 このフラグを設定すると、トランスパイラ用の Target バックエンドに小数点ゲートが確実に含まれるようになります。

service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)

このコード例では、分数ゲートを使用してイジング鎖のダイナミクスをシミュレートするワークフローの中で、分数ゲートを使用する方法を示します。 そして、分数ゲートを使用しないバックエンドと回路の持続時間を比較する。

報告されたエラー率に関する注意

分数ゲートが有効になっているバックエンドの Target に報告されるエラー値は、分数ゲートでない方のエラー値のコピーに過ぎない(同じではないかもしれない)。 これは、分数ゲートのエラー率の報告がまだサポートされていないためである。

しかし、分数ゲートと非分数ゲートのゲート時間は同じであるため、両者のエラー率が同等であるというのは妥当な仮定である。

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")

Output:

Output of the previous code cell

分数ゲートが有効なバックエンドオブジェクトと無効なバックエンドオブジェクトを指定し、両者をトランスパイルする。

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種類のゲートを使用した回路のタイムラインを表示する。

# 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(),
)

Output:

Output of the previous code cell
# 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(),
)

Output:

Output of the previous code cell

角度制約

2量子ビットの RZZ(θ)R_{ZZ}(\theta) ゲートについては、 IBM Quantum ハードウェア上では、 00π/2\pi/2 の間の角度のみを実行可能です。 回路内に、この範囲外の角度を持つ RZZ(θ)R_{ZZ}(\theta) ゲートが含まれている場合、標準的なトランスピレーション・パイプラインは、通常、適切な回路変換(パス FoldRzzAngle を通じて)を行うことでこれを修正します。 ただし、1つ以上の「 Parameters」を含む RZZ(θ)R_{ZZ}(\theta) ゲートについては、トランスパイラーは、実行時にこれらのパラメータにこの範囲内の角度が割り当てられるものとみなします。 IBM Quantum Compute Service に送信された PUB で指定されたパラメータ値のいずれかがこの範囲外の場合、ジョブは失敗します。


フラクショナルゲートはどこで使用するか

歴史的に、 IBM Quantum QPUで利用可能な基底ゲートは次のとおりです。 CZ, X, RZ, **SX**であった。 IDπ/2\pi / 2 例えば、 RX(θ)R_X(\theta) ゲートは、トランスパイルすると、 RZRZX\sqrt{X} の一連のゲートに分解する必要があり、1つのゲートではなく、有限時間の2つのゲートを持つ回路を作成します。

同様に、 RZZ(θ)R_{ZZ}(\theta) ゲートのような2量子ビットの回転がトランスパイルされる場合、分解には2つのゲートといくつかの1量子ビットゲートが必要となる。 CZ ゲートと複数の単一量子ビットゲートが必要となり、回路深度が深くなる。 これらの分解を以下のコードに示す。

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

Output:

Output of the previous code cell
# 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)

Output:

Output of the previous code cell
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")

Output:

Output of the previous code cell
# 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)

Output:

Output of the previous code cell

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


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

フラクショナルゲートは実験的な機能であり、この use_fractional_gates フラグの動作は将来変更される可能性があることに留意してください。 詳細 qiskit-ibm-runtime については、新バージョンのリリースノートをご覧ください。 QiskitRuntimeService.backend の API リファレンスドキュメントも参照してください。そこには、以下の内容が記載されています use_fractional_gates

さらに、Qiskitトランスパイラには、最適化パスで RZZ(θ)R_{ZZ}(\theta)。 このため、これらの命令を含む回路の設計や最適化には、より慎重を期す必要がある。

最後に、分数ゲートの使用はサポートされていない:

プリミティブ・オプションのガイドを読んで、特定の量子ワークロード用にエラー緩和と抑制技術をカスタマイズする方法について詳しく学んでください。


どのバックエンドが小数ゲートをサポートしていますか?

すべてのバックエンドが小数点以下のゲートをサポートしているわけではありません。 そうしている人たちを見つけるために走り出そう service.backends(use_fractional_gates=True) 。 偽のバックエンドが分数ゲートをサポートするのは、関連する「実際の」バックエンドがそれをサポートしている場合に限られます。

なお、偽のバックエンドは、デフォルトで分数ゲートをサポートしていません。これは、分数ゲートがデフォルトで無効になっているためです。 フラクショナルゲートをサポートするフェイクバックエンドでフラクショナルゲートを有効にするには、その設定を更新してください。

例:

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

次のステップ

推奨事項
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。