Skip to main content
IBM Quantum Platform

QuantumCircuit クラス

class qiskit.circuit.QuantumCircuit(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())

GitHub

ベース: object

量子回路のコアQiskit表現。

詳細は QuantumCircuit パッケージの他の部分とどのように組み合わされているのか、またQiskitにおける量子回路記述のさまざまな領域について、モジュールレベルのドキュメントを参照してください。 qiskit パッケージとの関係、Qiskitにおける量子回路記述のさまざまな領域については、モジュールレベルのドキュメント qiskit.circuit.

例:

from qiskit import QuantumCircuit

# Create a new circuit with two qubits
qc = QuantumCircuit(2)

# Add a Hadamard gate to qubit 0
qc.h(0)

# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0, 1)

# Return a text drawing of the circuit.
qc.draw()
     ┌───┐
q_0: ┤ H ├──■──
     └───┘┌─┴─┐
q_1: ─────┤ X ├
          └───┘

回路属性

QuantumCircuit には少数のパブリック属性があるが、そのほとんどは古い機能である。 その機能のほとんどはメソッドを通じてアクセスされる。

ごく一握りの属性は意図的に変更可能であり、残りは不変とみなされるべきデータ属性である。

変更可能な属性
サマリー
global_phaseラジアン単位で測定される回路のグローバル位相。
metadataQiskitがトランスパイラを通して保持するが、それ以外は完全に無視する任意のユーザーマッピング。
name回路のオプションの文字列名。
不変のデータ属性
サマリー
ancillasのリスト AncillaQubit回路によって追跡される
cregsのリスト ClassicalRegister回路によって追跡される
clbitsのリスト Clbit回路によって追跡される
data回路を構成する CircuitInstruction回路を構成する個々のリスト。
_dataPython - C API QkCircuit オブジェクトへのスペースハンドル。
durationトランスパイラのパスをスケジューリングすることによって追加される回路の合計時間。 この属性は非推奨である。 estimate_duration() を代わりに使うべきである。
layoutトランスパイラによって追加されたハードウェアレイアウトと配線情報。
num_ancillas回路内のアンシラ量子ビットの数。
num_clbits回路のビット数。
num_captured_vars捕捉されたリアルタイムのクラシック変数の数。
num_captured_stretchesキャプチャされたストレッチの数。
num_declared_vars外側の回路スコープでローカルに宣言されたリアルタイム・クラシック変数の数。
num_declared_stretches外回りのスコープでローカルに宣言されたストレッチの数。
num_input_vars入力されるリアルタイム・クラシック変数の数。
num_parametersコンパイル時 Parameterの数。
num_qubits回路内の量子ビット数。
num_vars外側回路スコープ内のリアルタイム古典変数の総数。
num_stretches外回りのスコープにおけるストレッチの総数。
num_identifiers外回りの変数とストレッチの総数。
op_start_timesトランスパイラ・パスのスケジューリングによって追加される、スケジュールされたオペレーションの開始時刻。
parametersコンパイル時 Parameter回路によって追跡される
qregsのリスト QuantumRegister回路によって追跡される
qubitsのリスト Qubit回路によって追跡される
unitフィールドの単位。 duration フィールドの

中核となる属性は です data。 これは、順序付けられた形式で含まれる s CircuitInstructionを公開する、シーケンスのようなオブジェクトです。 通常、このオブジェクトを直接変更すべきではありません。 QuantumCircuit これは追記専用操作のみを想定して設計されています(その場合は を使用してください append())。 回路をその場で変更する操作のほとんどは、トランスパイラ・パス (qiskit.transpiler) として記述する必要があります。C API は、内部オブジェクトである とやり取りしますが _data、これは、C API 呼び出しに渡すハンドルとして使用される場合を除き、 Python の公開 API の一部ではありません。

data

回路データ(命令とコンテキスト)。

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2)
qc.measure([0], [1])
print(qc.data)
[CircuitInstruction(operation=Instruction(name='measure', num_qubits=1,
num_clbits=1, params=[]), qubits=(Qubit(QuantumRegister(2, 'q'), 0),),
clbits=(Clbit(ClassicalRegister(2, 'c'), 1),))]

戻り値

回路内の CircuitInstruction インスタンスを含むリスト状のオブジェクト。

と並んで dataと並んで global_phase を記述するために回路が使用される場合、回路の出力に何らかの影響を与える可能性がある。 Gate 制御されることがある。 これはラジアン単位で、直接設定できる。

global_phase

ラジアン単位の電流回路スコープのグローバル位相。

from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.h(0)
circuit.cx(0, 1)
print(circuit.global_phase)
0.0
from numpy import pi

circuit.global_phase = pi/4
print(circuit.global_phase)
0.7853981633974483

回路の name の名前になります。 Instruction または Gate から生じる to_instruction()to_gate() の呼び出しの名前になります。

name

タイプ: str

人間が読める回路名。

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, name="my_circuit")
print(qc.name)
my_circuit

回路に任意の metadata を付けることができます。 Qiskitのコアのどの部分も、これを検査したり、メタデータに基づいて動作を変えたりしませんが、トランスパイラを通して忠実に渡されるので、回路に自分でタグを付けることができます。 QPYで回路をシリアライズする場合( qiskit.qpyを参照)、メタデータはJSONシリアライズされ、その中でJSON互換性のないオブジェクトを扱うためにカスタムシリアライザを渡す必要があるかもしれません。 qpy.dump() を参照)。 このフィールドは、 OpenQASM 2または3へのエクスポート時には無視される。

metadata

回路のメタデータのユーザー定義辞書。

Qiskitはこのマッピングの内容を調べませんが、トランスパイラを通過させて出力に再アタッチするので、独自のメタデータを追跡することができます。

from qiskit import QuantumCircuit

qc = QuantumCircuit(2, 2, metadata={'experiment_type': 'Bell state experiment'})

print(qc.metadata)
{'experiment_type': 'Bell state experiment'}

QuantumCircuit は、内部の量子ビットと古典ビット、レジスタを追跡するデータ属性を公開する。 これらは Python として表示されます listしかし、それらは不変として扱うべきです。変更してもせいぜい何の効果もなく、むしろシステムの内部データが壊れるだけでしょう。 QuantumCircuit

qregs

のリスト。 Qubitを追加された順に並べたもの。 変異させてはいけない。

cregs

のリスト。 Clbitを追加された順に並べたもの。 変異させてはいけない。

qubits

のリスト。 Qubitを追加された順に並べたもの。 変異させてはいけない。

ancillas

のリスト。 AncillaQubitを追加された順に並べたもの。 変異させてはいけない。

clbits

のリスト。 Clbitを追加された順に並べたもの。 変異させてはいけない。

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit

qr1 = QuantumRegister(2)
qr2 = QuantumRegister(1)
cr1 = ClassicalRegister(2)
cr2 = ClassicalRegister(1)
qc = QuantumCircuit(qr1, qr2, cr1, cr2)

print("List the qubits in this circuit:", qc.qubits)
print("List the classical bits in this circuit:", qc.clbits)
List the qubits in this circuit: [Qubit(QuantumRegister(2, 'q0'), 0),
Qubit(QuantumRegister(2, 'q0'), 1), Qubit(QuantumRegister(1, 'q1'), 0)]
List the classical bits in this circuit: [Clbit(ClassicalRegister(2, 'c0'), 0),
Clbit(ClassicalRegister(2, 'c0'), 1), Clbit(ClassicalRegister(1, 'c1'), 0)]

回路上の命令に存在するコンパイル時のパラメータは parameters. の場合を除き、ほとんどレキシカルである)。 ParameterVectorのリスト形式を使うときのパラメーターの順番と同じである。 assign_parameters()また set-をサポートしています。

parameters

回路で定義されたパラメータ。

この属性は Parameter オブジェクトをアルファベット順にソートして返します。 でインスタンス化されたパラメータは ParameterVector でインスタンス化されたパラメータは依然として数値でソートされることに注意。

以下のスニペットは、パラメーターの挿入順序は問題ではないことを示している。

>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
>>> circuit = QuantumCircuit(1)
>>> circuit.rx(b, 0)
>>> circuit.rz(elephant, 0)
>>> circuit.ry(a, 0)
>>> circuit.parameters  # sorted alphabetically!
ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])

アルファベット順の並べ替えは、数字に関しては直感的でない可能性があることに留意してほしい。 アルファベット順に並べると、"10 "は "2 "の前に来る。

>>> from qiskit.circuit import QuantumCircuit, Parameter
>>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
>>> circuit = QuantumCircuit(1)
>>> circuit.u(*angles, 0)
>>> circuit.draw()
   ┌─────────────────────────────┐
q:U(angle_1,angle_2,angle_10)
   └─────────────────────────────┘
>>> circuit.parameters
ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])

数値ソートを尊重するには ParameterVector が使える。

>>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
>>> x = ParameterVector("x", 12)
>>> circuit = QuantumCircuit(1)
>>> for x_i in x:
...     circuit.rx(x_i, 0)
>>> circuit.parameters
ParameterView([
    ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
    ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
    ..., ParameterVectorElement(x[11])
])

戻り値

ソートされた Parameter オブジェクトをソートする。

回路をトランスパイルして物理回路を作成した場合、トランスパイラが保存している layout 属性で、トランスパイラが保存している、ソース回路の仮想量子ビットが物理回路のハードウェア量子ビットにどのようにマッピングされるかについての情報を、回路の開始時と終了時の両方で調べることができます。

layout

回路に関連するレイアウト情報を返す。

この属性には、オプションの TranspileLayout オブジェクトが含まれます。 これは通常 transpile() または PassManager.run() の出力に設定され、転置によって入力回路に生じた順列に関する情報を保持する。

によって引き起こされる順列には2種類あります。 transpile() 関数によって引き起こされる順列には2種類あります。 Targetで選択された物理量子ビットに基づいて量子ビットを並べ替える初期レイアウトと SwapGateによって引き起こされる出力順列です。

from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager

# Create circuit to test transpiler on
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.swap(1, 2)
qc.cx(0, 1)

# Add measurements to the circuit
qc.measure([0, 1, 2], [0, 1, 2])

# Specify the QPU to target
backend = GenericBackendV2(3)

# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled = pass_manager.run(qc)

# Print the layout after transpilation
print(transpiled.layout.routing_permutation())
[0, 1, 2]

回路がトランスパレーションの一部としてもスケジューリングされている場合、各命令の個々のタイミングと回路の合計が表示されます。 duration を表示します。

duration

スケジューリング・トランスパイラのパスによって設定される回路の合計時間。 その単位は unit.

バージョンから非推奨 1.3.0

プロパティ qiskit.circuit.quantumcircuit.QuantumCircuit.duration は Qiskit 1.3.0 で非推奨となりました。 Qiskit 3.0.0 で削除されます。

unit

単位 duration で指定される。

バージョンから非推奨 1.3.0

プロパティ qiskit.circuit.quantumcircuit.QuantumCircuit.unit は Qiskit 1.3.0 で非推奨となりました。 Qiskit 3.0.0 で削除されます。

op_start_times

運転開始時間のリストを返す。

この属性は、スケジュールされた回路内の演算の推定開始時間を計算し、制御フローや他の古典的なフィードフォワード演算を持たない単純な回路に対してのみ機能する。

この属性は、スケジューリング解析パスの1つが量子回路上で実行されると有効になる。

from qiskit import QuantumCircuit
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit.transpiler import generate_preset_pass_manager

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()

# Print the original circuit
print("Original circuit:")
print(qc)

# Transpile the circuit with a specific basis gates list and print the resulting circuit
backend = GenericBackendV2(2, basis_gates=['u1', 'u2', 'u3', 'cx'])
pm = generate_preset_pass_manager(
    optimization_level=1, backend=backend, scheduling_method="alap"
)
transpiled_qc = pm.run(qc)
print("Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:")
print(transpiled_qc)

# Print the start times of each instruction in the transpiled circuit
print("Start times of instructions in the transpiled circuit:")
for instruction, start_time in zip(transpiled_qc.data, transpiled_qc.op_start_times):
    print(f"{instruction.operation.name}: {start_time}")
Original circuit:
        ┌───┐      ░ ┌─┐
q_0: ┤ H ├──■───░─┤M├───
        └───┘┌─┴─┐ ░ └╥┘┌─┐
q_1: ─────┤ X ├─░──╫─┤M├
            └───┘ ░  ║ └╥┘
meas: 2/══════════════╩══╩═
                    0  1

Transpiled circuit with basis gates ['u1', 'u2', 'u3', 'cx']:
            ┌─────────┐          ░ ┌─────────────────┐┌─┐
q_0 -> 0 ───┤ U2(0,π) ├──────■───░─┤ Delay(1255[dt]) ├┤M├
        ┌──┴─────────┴───┐┌─┴─┐ ░ └───────┬─┬───────┘└╥┘
q_1 -> 1 ┤ Delay(196[dt]) ├┤ X ├─░─────────┤M├─────────╫─
        └────────────────┘└───┘ ░         └╥┘         ║
meas: 2/═══════════════════════════════════╩══════════╩═
                                            1          0

Start times of instructions in the transpiled circuit:
u2: 0
delay: 0
cx: 196
barrier: 2098
delay: 2098
measure: 3353
measure: 2098

戻り値

命令の開始予定時刻を表す整数のリスト。 の命令のインデックスに対応する。 QuantumCircuit.data.

レイズ

AttributeError - サーキットが予定されていない場合。

最後に QuantumCircuit は、いくつかの単純なプロパティを動的な読み取り専用の数値属性として公開している。

num_ancillas

アンシラ量子ビットの数を返す。

from qiskit import QuantumCircuit, QuantumRegister, AncillaRegister

# Create a 2-qubit quantum circuit
reg = QuantumRegister(2)
qc = QuantumCircuit(reg)

# Create an ancilla register with 1 qubit
anc = AncillaRegister(1)
qc.add_register(anc)  # Add the ancilla register to the circuit

print("Number of ancilla qubits:", qc.num_ancillas)
Number of ancilla qubits: 1

num_clbits

クラシックビットの数を返す。

from qiskit import QuantumCircuit

# Create a new circuit with two qubits and one classical bit
qc = QuantumCircuit(2, 1)
print("Number of classical bits:", qc.num_clbits)
Number of classical bits: 1

num_captured_vars

スコープからキャプチャされたものとしてマークされた回路内のリアルタイム古典変数の数。

これは iter_captured_vars() の長さである。 これがゼロでない場合 num_input_vars はゼロでなければならない。

num_captured_stretches

スコープからキャプチャされたとしてマークされた回路内のストレッチの数。

これは iter_captured_stretches() の長さである。 これがゼロでない場合 num_input_vars はゼロでなければならない。

num_declared_vars

入力またはキャプチャを除く、この回路スコープで宣言されている回路内のリアルタイム・クラシック変数の数。

これは iter_declared_vars() の長さである。

num_declared_stretches

キャプチャを除く、この回路スコープで宣言されている回路のストレッチの数。

これは iter_declared_stretches() の長さである。

num_input_vars

回路入力としてマークされた回路内のリアルタイム古典変数の数。

これは iter_input_vars() の長さである。 これがゼロでない場合 num_captured_vars はゼロでなければならない。

num_identifiers

回路内のリアルタイム古典変数とストレッチの数。

これは以下と等しい。 num_vars() + num_stretches().

num_parameters

回路内のパラメータオブジェクトの数。

num_qubits

量子ビット数を返す。

num_stretches

回路内のストレッチの数。

これは iter_stretches() の長さである。

num_vars

回路内のリアルタイム古典変数の数。

これは iter_vars() の長さである。


新しい回路の作成

メソッド
サマリー
__init__()命令なし回路のデフォルトコンストラクタ。
copy()既存の回路を完全にコピーする。
copy_empty_like()ある回路から新しい回路へ、何の指示もなしにデータオブジェクトをコピーする。
from_instructions()命令のリストから必要なデータオブジェクトを推測する。
from_qasm_file()レガシー・インターフェース qasm2.load().
from_qasm_str()レガシー・インターフェース qasm2.loads().

デフォルトのコンストラクタ(QuantumCircuit(...))は、初期命令のない回路を生成する。 デフォルトコンストラクタの引数は、量子および古典データストレージを回路にシードし、名前、グローバル位相、および任意のメタデータを提供するために使用することができます。 これらのフィールドはすべて、後で拡張することができる。

__init__

__init__(*regs, name=None, global_phase=0, metadata=None, inputs=(), captures=(), declarations=())

GitHub

のデフォルトコンストラクタです。 QuantumCircuit.

パラメーター

  • regs (Register |int |Sequence[Bit]) –

    回路に含まれるレジスタ。

    • オブジェクトのリストが Register オブジェクトのリストは QuantumRegister または ClassicalRegister オブジェクトを表します。

      例:

      • QuantumCircuit(QuantumRegister(4))
      • QuantumCircuit(QuantumRegister(4), ClassicalRegister(3))
      • QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(2, 'qr1'))
    • int のリストの場合、回路に含める量子ビットおよび/または古典ビットの量。 量子ビットの数だけを表す1つのintか、量子ビットと古典ビットの数をそれぞれ表す2つのintを指定することができる。

      例:

      • QuantumCircuit(4) # A QuantumCircuit with 4 qubits
      • QuantumCircuit(4, 3) # A QuantumCircuit with 4 qubits and 3 classical bits
    • オブジェクトを含む Bit オブジェクトのコレクション Bit のコレクションが回路に追加されます。

  • name (str | None) – 量子回路の名前。 設定されていない場合は、自動生成された文字列が割り当てられる。

  • global_phase (ParameterExpression |float) – 回路のグローバル位相(ラジアン単位)

  • metadata (dict | None) – 回路に関連付ける任意のキー・バリューのメタデータ。 これは、自由形式のデータとして metadata 属性に格納される。 回路に直接使用されることはない。

  • inputs (Iterable[Var]) – この回路で実行時 input 変数として宣言する変数はありますか。 これらは、すでに別の場所から作成済みの expr.Var ノードであるはずです。入力も作成する必要がある場合は、. を使用してください QuantumCircuit.add_input()。 この引数で指定された変数は、直接 に渡されます add_input()。 ある回路において、とが inputs 同時に成立することは capturesない。

  • captures (Iterable[Var |Stretch]) – この回路スコープが、包含するスコープから取得すべき変数。 ここで指定された変数は、直接 に渡されます add_capture()。 ある回路において、とが inputs 同時に成立することは capturesない。

  • declarations (Mapping[Var, Expr] | Iterable[tuple[Var, Expr]]) –

    この回路が宣言し、すぐに初期化すべき変数。 この入力を順番に並べることで、後の宣言が前の宣言(入力やキャプチャを含む)に依存するようにできる。 実行時に後で計算される値に依存する必要がある場合は、回路実行の適切な時点で add_var() を使用します。

    この引数は、すでに作成された変数のセットを持っている場合に、回路の初期化を便利に行うためのものである。 ここで使用する変数は、直接 add_var()に直接渡される。

レイズ

  • CircuitError - もし回路名が与えられていれば、それが有効でない場合。
  • CircuitError - inputscaptures の両方が与えられた場合。

既存の回路をお持ちの場合は、そのコピーを copy()を使ってそのコピーを作ることができる。 これは、部分的な回路を残しながら別の回路を拡張したい場合や、前の回路はそのままに、インプレースで変異させることができるバージョンを持ちたい場合に便利である。

copy

copy(name=None)

GitHub

回路をコピーする。

パラメーター

name (str) – コピーされた回路に与えられる名前。 Noneの場合、名前はそのまま。

戻り値

現在の回路のディープコピー

戻りの型

QuantumCircuit

同様に、同じデータオブジェクト(ビット、レジスタ、変数など)をすべて含み、命令を一切含まない回路を作成したい場合は、 copy_empty_like(). を使用できます。 回路の新しい層を構築して、 compose()それを裏面に転写したり、回路の指令を完全に書き換えたりする場合、これはよくあることです。

copy_empty_like

copy_empty_like(name=None, *, vars_mode='alike')

GitHub

同じ構造を持つが空のselfのコピーを返す。

その構造には以下のようなものがある:

  • 名前とその他のメタデータ
  • グローバルフェーズ
  • レジスタを含むすべてのqubitsとclbits
  • vars キーワード引数に従って処理される。
警告

回路にローカル変数の宣言(回路コンストラクタの引数 declarations によって追加されたもの、または add_var()を使用して追加されたもの)が含まれている場合、それらは出力回路で初期化されていない可能性があります。 店舗指示を手動で追加する必要があります ( StoreQuantumCircuit.store()を参照)を追加して初期化する必要がある。

パラメーター

  • name (str | None) – コピーした回路の名前。 Noneの場合、名前はそのまま。

  • vars_mode (Literal['alike', 'captures', 'drop']) –

    リアルタイム変数を扱うモード。

    同じ

    出力回路の変数は、元の回路と同じ宣言セマンティクスを持つ。 例えば、ソースの input 変数は、出力回路の input 変数になる。 ストアがコピーされないため、ローカル変数が初期化されないことに注意。 このため、ユーザーがイニシャライザー・ストアを追加し直さなければ、回路が潜在的に危険な状態になる可能性がある。

    キャプチャー

    すべての変数はキャプチャ変数に変換される。 これは、既存の回路に新しいレイヤーを追加する場合に便利である。 compose() というのも compose() はキャプチャをベース回路にインライン化できるからです(他の変数はできません)。

    ドロップ

    出力回路には変数が定義されていない。

戻り値

selfの空のコピー。

戻りの型

QuantumCircuit

場合によっては、回路コンテキスト全体とは別に CircuitInstructionのリストを生成し、それから回路を構築するのが最も便利な場合がある。 この from_instructions() コンストラクタは自動的にすべての QubitClbit インスタンスを自動的に取り込み、正しいリソースとすべての命令を持つ新しい QuantumCircuit オブジェクトを生成します。

from_instructions

static from_instructions(instructions, *, qubits=(), clbits=(), name=None, global_phase=0, metadata=None)

GitHub

の反復可能なものから回路を構成する。 CircuitInstructions.

パラメーター

  • instructions (Iterable[CircuitInstruction |tuple[qiskit.circuit.Instruction] | tuple[qiskit.circuit.Instruction, Iterable[Qubit]] | tuple[qiskit.circuit.Instruction, Iterable[Qubit], Iterable[Clbit]]]) – 回路に追加する命令。
  • qubits (Iterable[Qubit]) – 回路に追加する任意の量子ビット。 この引数は、例えば、量子ビットの特定の順序を強制するために使うことができる。
  • clbits (Iterable[Clbit]) – 回路に追加する古典的なビットがあれば何でも。 この引数は、例えば、古典的なビットの特定の順序を強制するために使うことができる。
  • name (str | None) – 回路の名前。
  • global_phase (ParameterValueType) – ラジアン単位の回路のグローバル位相。
  • metadata (dict | None) – 回路に関連付ける任意のキー・バリューのメタデータ。

戻り値

量子回路。

戻りの型

QuantumCircuit

QuantumCircuit のインポーターのレガシー・ラッパーである2つのコンストラクター・メソッドもまだ持っている。 qiskit.qasm2. これらは、従来の互換性設定を自動的に適用します。 load() そして loads()

from_qasm_file

static from_qasm_file(path)

GitHub

OpenQASM 2.0 プログラムをファイルから読み込み、以下のインスタンスに変換する。 QuantumCircuit.

パラメーター

path (str |PathLike) – OpenQASM 2 プログラムのファイルへのパス

戻り値

OpenQASM 2. 入力された QuantumCircuit オブジェクト。

戻りの型

QuantumCircuit

関連資料

qasm2.load()OpenQASM 2インポーターへの完全なインターフェース。

from_qasm_str

static from_qasm_str(qasm_str)

GitHub

OpenQASM 2.0 プログラムを含む文字列を、次のように変換する。 QuantumCircuit.

パラメーター

qasm_str (str) – OpenQASM 2.0 プログラムを含む文字列。

戻り値

OpenQASM 2 入力に対する QuantumCircuit オブジェクト

戻りの型

QuantumCircuit

関連資料

qasm2.loads()OpenQASM 2インポーターへの完全なインターフェース。


回路上のデータオブジェクト

データオブジェクトの追加

メソッド
このようなデータを追加する
add_bits()QubitClbits.
add_register()QuantumRegister そして ClassicalRegister.
add_var()Var ローカルスコープとイニシャライザを持つノード。
add_stretch()Stretch ローカルスコープを持つノード。
add_input()Var 回路の入力として扱われるノード。
add_capture()Var または Stretch スコープからキャプチャされたノード。
add_uninitialized_var()Var ローカルスコープと未定義の状態を持つノード。

通常、ほとんどのデータオブジェクト(Qubit, Clbit, ClassicalRegisterなど)を回路に追加する。 __init__() デフォルトのコンストラクタ copy_empty_like(). ただし、後から追加することも可能だ。 スタンドアローン Var ノード( リアルタイム古典計算参照)のような型付けされた古典データは、別々のメソッドで構築することも追加することもできる。

新しいレジスターレス Qubit および Clbit オブジェクトは add_bits(). これらのオブジェクトは、すでに回路内に存在してはならない。 ビットがすでに回路に存在するかどうかは、次のようにしてチェックできる。 find_bit().

add_bits

add_bits(bits)

GitHub

回路にビットを追加する。

警告

量子回路に既存の layout 属性がある場合 Qubit を追加しても、量子ビットの数が増えるだけです。 レイアウトは更新されない。

パラメーター

bits (Iterable[Bit])

戻りの型

なし

レジスタは add_register(). この方法では、ビットの一部がすでに回路に存在していてもエラーにはならない。 この場合、レジスタはビットの「エイリアス」となる。 これは一般的にハードウェアバックエンドではあまりサポートされていない。 あるビットが入っているレジスタは find_bit().

add_register

add_register(*regs)

GitHub

レジスタを追加する。

警告

量子回路に既存の layout 属性がある場合 QuantumRegister を追加しても、量子ビットの数が増えるだけです。 レイアウトは更新されない。

パラメーター

regs (Register |int |Sequence[Bit])

戻りの型

なし

リアルタイムの型付けされた古典的なデータは、回路上では次のようなノードで表現される。 Var ノードで表現される。 Type. これらを回路とは別にインスタンス化することも可能である ( Var.new()を参照)が、型や式の初期化を自動的に管理してくれる回路メソッドを使う方が便利なことが多い。 最も一般的な2つのメソッドは add_var() (ローカルにスコープされた変数)と add_input() (回路への入力)である。 さらに、この方法は add_stretch() は、回路にストレッチを加えるために使うことができる。

add_var

add_var(name_or_var, /, initial)

GitHub

この回路に、自動記憶とスコープを持つ古典変数を追加する。

変数は回路の最初に "宣言 "されたものとみなされるが、初期化されるのはこのメソッドを呼び出した時点なので、それ以前に定義された変数に依存することができる。

パラメーター

  • name_or_var (str |Var) – 変数名の文字列、または再利用する Var 既存のインスタンスのいずれか。 変数は、回路内で既に使用されている名前を隠蔽することはできません。

  • initial (Any) –

    この変数を初期化する値。 最初の引数が文字列名で与えられた場合、結果の変数の型は最初の式から推測される。 Var.new() を使って手動で希望の型を持つ新しい変数を作成するか、あるいは expr.cast() を使って初期化子を希望の型にキャストします。

    これは Expr ノードか、 expr.lift を使って1つにリフティングできる値でなければならない。

戻り値

作成された変数。 もし Var インスタンスが与えられた場合は、まったく同じオブジェクトが返される。

レイズ

CircuitError - 既存の識別子をシャドウイングするために変数を作成できない場合。

戻りの型

Var

名前とイニシャライザー式だけで新しい変数を定義する:

from qiskit.circuit import QuantumCircuit

qc = QuantumCircuit(2)
my_var = qc.add_var("my_var", False)

関連する回路から取り出したり、手動で構築した変数を再利用し、より複雑な式で初期化する:

from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.classical import expr, types

my_var = expr.Var.new("my_var", types.Uint(8))

cr1 = ClassicalRegister(8, "cr1")
cr2 = ClassicalRegister(8, "cr2")
qc = QuantumCircuit(QuantumRegister(8), cr1, cr2)

# Get some measurement results into each register.
qc.h(0)
for i in range(1, 8):
    qc.cx(0, i)
qc.measure(range(8), cr1)

qc.reset(range(8))
qc.h(0)
for i in range(1, 8):
    qc.cx(0, i)
qc.measure(range(8), cr2)

# Now when we add the variable, it is initialized using the real-time state of the
# two classical registers we measured into above.
qc.add_var(my_var, expr.bit_and(cr1, cr2))

add_input

add_input(name_or_var: str, type_: Type, /) → Var

add_input(name_or_var: Var, type_: None = None, /) → Var

GitHub

変数を回路の入力として登録する。

パラメーター

  • name_or_var (str |Var) – 文字列名、または入力変数として使用する既存の Var ノードのいずれか。
  • - 名前が文字列で指定された場合、これは変数に使用する Type でなければならない。 変数に既存の Varとして与えられた場合、これは与えてはならず、代わりにオブジェクト自体から読み込まれる。
  • type_ (Type | None)

戻り値

作成された変数、または渡された変数と同じ変数。

レイズ

CircuitError - 既存の変数をシャドウイングするために変数を作成できない場合。

戻りの型

Var

add_stretch

add_stretch(name_or_stretch)

GitHub

この回路をスコープとする新しいストレッチを宣言する。

パラメーター

name_or_stretch (str |Stretch) – ストレッチ名の文字列、または再利用する Stretch 既存のインスタンスのいずれか。 ストレッチは、回路内で既に使用されている名前をシャドウすることはできません。

戻り値

創造されたストレッチ。 もし Stretch インスタンスが与えられた場合は、まったく同じオブジェクトが返される。

レイズ

CircuitError - 既存の識別子をシャドウイングするためにストレッチを作成できない場合。

戻りの型

ストレッチ

名前だけ与えられた新しいストレッチを定義し、使用する:

from qiskit.circuit import QuantumCircuit, Duration
from qiskit.circuit.classical import expr

qc = QuantumCircuit(2)
my_stretch = qc.add_stretch("my_stretch")

qc.delay(expr.add(Duration.dt(200), my_stretch), 1)

さらに、プログラムによる回路生成に有用な低レベルの方法が2つある。 インタラクティブに作業する場合、これらの機能は必要ないことが多いだろう。 add_uninitialized_var() のほとんどの使用は copy_empty_like()の一部であり add_capture() のほとんどの使い方は、 コントロール・フロー・ビルダー・インターフェースを使った方がいいだろう。

add_uninitialized_var

add_uninitialized_var(var, /)

GitHub

イニシャライザを持たない変数を追加する。

ほとんどの場合 add_var() を使って変数を初期化する。 この関数を使うには、すでに Var というのも、この関数の使用は通常、コピーの文脈でのみ意味をなすからである。

警告

Qiskitは、初期化されていない変数が実行時にどのように評価されるかを一切保証しておらず、ハードウェアによってはこれをエラーとして拒否する場合があります。

この関数は慎重に扱うべきであり、プログラム的に2つの同じような回路を再構築する特別な場合にのみ役立つ低レベルのプリミティブである。

パラメーター

var (Var) – 追加する変数。

add_capture

add_capture(var: Var)

add_capture(stretch: Stretch)

GitHub

スコープから取り込むべき識別子を回路に追加する。

この方法には Var または Stretch ノードが必要で、これは識別子へのハンドルを持っていることを強制する。

これは低レベルのメソッドであり、コントロール・フロー操作を手動で構築する場合にのみ真に役立つ。 with 制御フローのスコープにビルダー・インターフェースを使用している場合、このメソッドを呼び出す必要は通常ありません。 if_test() やその他のスコープ構文) を使用している場合は、このメソッドを呼び出す必要はありません。 ビルダー・インターフェイスは、スコープ内で使用されている識別子をキャプチャすることで、あなたの代わりに自動的に内部スコープをクロージャにします。

パラメーター

var (Union[expr.Var, expr.Stretch]) – スコープからキャプチャする変数またはストレッチを指定します。

レイズ

CircuitError - 既存の識別子をシャドウイングするために識別子を作成できない場合。

ビットとレジスタの操作

インスタンス Bit は、それ自体としては、単に回路がそれぞれのコンテキストで使用する一意のハンドルに過ぎません。 インスタンスと回路があれば、Bit を使用して find_bit()、そのビットが存在するコンテキスト(回路内での整数インデックスや、そのビットが含まれるレジスタなど)を確認できます。

find_bit

find_bit(bit)

GitHub

ある回路を参照するために使用できる回路内の位置を見つける。 Bit.

特に、この関数は量子ビットの整数インデックスを求めることができ、これはトランスパイルド回路のハードウェアインデックスに対応する。

の回路インデックスは AncillaQubit のインデックスは qubitsのインデックスである。 ancillas.

パラメーター

bit (Bit) – 場所を特定するビット。

戻り値

2タプル。 最初の要素(index)には、 Bit を見つけることができるインデックスが含まれます(以下のいずれか)。 qubits, clbitsのいずれか)。 番目の要素(registers)は、 (register, index) のペアのリストである。 Register を含む。 BitRegister を含む。)

戻りの型

namedtuple (int, リスト[タプル (レジスタ, int )])

レイズ

  • CircuitError - 提供された Bit が未知の型であった場合。
  • CircuitError - 供給された Bit が回路上に見つからなかった。

回路をループし、各操作のqubitとclbitインデックスを取得する:

from qiskit.circuit import QuantumCircuit, Qubit

qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.measure([0, 1, 2], [0, 1, 2])

# The `.qubits` and `.clbits` fields are not integers.
assert isinstance(qc.data[0].qubits[0], Qubit)
# ... but we can use `find_bit` to retrieve them.
assert qc.find_bit(qc.data[0].qubits[0]).index == 0

simple = [
    (
        instruction.operation.name,
        [qc.find_bit(bit).index for bit in instruction.qubits],
        [qc.find_bit(bit).index for bit in instruction.clbits],
    )
    for instruction in qc.data
]

同様に、回路にレジスタが既に追加されているかどうかを問い合わせるには has_register().

has_register

has_register(register)

GitHub

この回路がレジスタrを持っているかどうかをテストする。

パラメーター

register (Register) – 量子レジスターか古典レジスターか

戻り値

レジスタがこの回路に含まれていれば真。

戻りの型

bool

コンパイル時パラメータの操作

関連資料

コンパイル時のパラメトリゼーション

コンパイル時パラメトライゼーションとは何か、そしてそれがQiskitのデータモデルにどのように適合するかについて、より完全な議論を行う。

ビットやレジスタ、リアルタイムに型付けされた古典的なデータとは異なり、コンパイル時のシンボリック・パラメータは手動で回路に追加されることはない。 その存在は、回路やグローバル・フェーズに追加された操作に含まれることで推測される。 現在回路内にある全パラメータの順序付きリストは以下にある。 QuantumCircuit.parameters.

インスタンスに対する最も一般的な操作は Parameter インスタンスを数値や別の記号式で置き換えることである。 これは assign_parameters().

assign_parameters

assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[False] = False, *, flat_input: bool = False, strict: bool = True) → QuantumCircuit

assign_parameters(parameters: Mapping[Parameter, ParameterExpression | float] | Iterable[ParameterExpression | float], inplace: Literal[True] = False, *, flat_input: bool = False, strict: bool = True) → None

GitHub

新しいパラメータや値にパラメータを割り当てる。

parameters 、辞書として渡される場合、キーは現在の回路のインスタンスでなければならない。 Parameter インスタンスでなければならない。 ディクショナリの値は、数値または新しいパラメータ・オブジェクトのいずれかである。

parameters がリストまたは配列として渡された場合、その要素は、アルファベット順に並べられた parameters の順序で現在のパラメータに割り当てられる。 ParameterVector オブジェクトの順序を尊重する)。

値は、現在の回路オブジェクトまたはそのコピーに割り当てることができる。

マッピングとして parameters を指定する場合、パラメータ名の文字列をキーにすることができる。 get_parameter(). また、キーが ParameterVector この場合、辞書の値はベクトルと同じ長さの値のシーケンスでなければなりません。

これらのケースを使用する場合は、 flat_input=False のままにしておかなければならない。 True に変更すると、高速パスが有効になる。 Parameter インスタンスでなければならない。

パラメーター

  • parameters (Mapping[Parameter, ParameterExpression |float] | Iterable[ParameterExpression |float]) – 新しいパラメータ値を指定する辞書または反復可能オブジェクト。
  • inplace (bool) – Falseの場合、バインドされたパラメータを含む回路のコピーが返されます。 Trueの場合、回路インスタンス自体が変更されます。
  • flat_input (bool) – もし Trueparameters 写像型であるならば、それは の写像 {parameter: value}であるとみなされる。 デフォルトでは(False)、マッピングには、対応する値のシーケンスを指すキー ParameterVector が含まれている場合があり、これらはマッピング処理中に展開されます。また、文字列キーが含まれている場合は、convertTo を使用してインスタンス Parameterget_parameter() に変換されます。
  • strict (bool) – もし False、マッピングで指定されたパラメータのうち、回路で使用されないものがあれば、それらは無視されます。 ( True デフォルトの場合)、論理エラーを示すエラーが発生します。

レイズ

  • CircuitError - parametersがdictで、回路に存在しないパラメータを含む場合。
  • ValueError - parametersがリスト/配列で、長さが回路内のフリー・パラメーターの数と不一致の場合。

戻り値

inplace が False の場合、パラメータをバインドした回路のコピー、それ以外の場合は None。

戻りの型

QuantumCircuit | なし

パラメータ化された回路を作成し、パラメータをインプレースで割り当てる。

from qiskit.circuit import QuantumCircuit, Parameter

circuit = QuantumCircuit(2)
params = [Parameter('A'), Parameter('B'), Parameter('C')]
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)
circuit.draw('mpl')
circuit.assign_parameters({params[0]: params[2]}, inplace=True)
circuit.draw('mpl')
先のコードで出力された回路図。先のコードで出力された回路図。

場違いな値をリストでバインドし、元の回路のコピーを得る。

from qiskit.circuit import QuantumCircuit, ParameterVector

circuit = QuantumCircuit(2)
params = ParameterVector('P', 2)
circuit.ry(params[0], 0)
circuit.crx(params[1], 0, 1)

bound_circuit = circuit.assign_parameters([1, 2])
bound_circuit.draw('mpl')

circuit.draw('mpl')
先のコードで出力された回路図。先のコードで出力された回路図。

この回路では、パラメータを Parameter また、 OpenQASM や他の外部フォーマットと相互運用する際の問題を避けるために、同じ名前のパラメータを複数持つことを禁止している。 を使用することができます。 has_parameter()get_parameter() を使うと、指定した文字列名のパラメータを回路に問い合わせることができます。

has_parameter

has_parameter(name_or_param, /)

GitHub

この回路にパラメータ・オブジェクトが存在するかどうかをチェックする。

パラメーター

name_or_param (str |Parameter) – パラメータ、またはチェックするパラメータ名。 これが Parameter ノードである場合、この関数が True を返すためには、パラメータは指定されたものとまったく同じでなければならない。

戻り値

この回路でマッチングパラメータが割り当て可能かどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_parameter()

この回路から Parameter この回路からインスタンスを名前で取得する。

QuantumCircuit.has_var()

これと似た方法だが、コンパイル時変数ではなくランタイム変数 expr.Var 変数の代わりに Parameters.

get_parameter

get_parameter(name: str, default: T) → Parameter | T

get_parameter(name: str, default: builtin_types.EllipsisType = Ellipsis) → Parameter

GitHub

この回路スコープでアクセス可能なコンパイル時のパラメータを名前で取得する。

パラメーター

  • name (str) – 取得するパラメータの名前。
  • default (Any) – 指定された場合、パラメータが存在しないときはこの値が返されます。 指定されていない場合は、 KeyError 代わりに が発生します。

戻り値

対応するパラメータ。

レイズ

KeyError - デフォルトが与えられていないが、パラメータが回路に存在しない場合。

戻りの型

パラメータ

回路から名前を指定してパラメータを取得する:

from qiskit.circuit import QuantumCircuit, Parameter

my_param = Parameter("my_param")

# Create a parametrized circuit.
qc = QuantumCircuit(1)
qc.rx(my_param, 0)

# We can use 'my_param' as a parameter, but let's say we've lost the Python object
# and need to retrieve it.
my_param_again = qc.get_parameter("my_param")

assert my_param == my_param_again

回路から変数を名前で取得し、それが存在しない場合はデフォルトを返す:

assert qc.get_parameter("my_param", None) == my_param
assert qc.get_parameter("unknown_param", None) is None
関連資料

get_var()

似たような方法だが expr.Var の代わりに Parameter コンパイル時パラメータを使用する。

リアルタイム入力された古典的データを用いた作業

関連資料

qiskit.circuit.classical

変数、式、型システムの仕組み、それらを表現するためのオブジェクト、利用可能な古典的操作について、モジュール・レベルのドキュメント。

リアルタイム古典計算

リアルタイム・データがデータ・モデル全体にどのように適合するかについての議論。 qiskit.circuit データ・モデル全体として

データオブジェクトの追加

新しい Var または Stretch 識別子を追加するためのメソッド。

回路に付けられた識別子(例えば Var または Stretchなど)に付けられた識別子を、メソッド get_var(), get_stretch()または get_identifier(). また、回路に指定した識別子が含まれているかどうかは has_var(), has_stretch()または has_identifier().

get_var

get_var(name: str, default: T) → Var | T

get_var(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var

GitHub

この回路スコープでアクセス可能な変数を名前で取得する。

パラメーター

  • name (str) – 取得する変数の名前。
  • default (Any) – 指定された場合、変数が存在しないときはこの値が返されます。 指定されていない場合は、 KeyError 代わりに が発生します。

戻り値

対応する変数。

レイズ

KeyError - デフォルトが与えられず、変数が存在しない場合。

回路から名前を指定して変数を取り出す:

from qiskit.circuit import QuantumCircuit

# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_var = qc.add_var("my_var", False)

# We can use 'my_var' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_var_again = qc.get_var("my_var")

assert my_var == my_var_again

回路から変数を名前で取得し、それが存在しない場合はデフォルトを返す:

assert qc.get_var("my_var", None) == my_var
assert qc.get_var("unknown_variable", None) is None
関連資料

get_parameter()

似たような方法だが Parameter コンパイル時のパラメータを expr.Var 実行時変数である。

get_stretch

get_stretch(name: str, default: T) → Stretch | T

get_stretch(name: str, default: builtin_types.EllipsisType = Ellipsis) → Stretch

GitHub

この回路スコープでアクセス可能なストレッチを名前で取得する。

パラメーター

  • name (str) – 取得する区間の名前。
  • default (Any) – 指定された場合、変数が存在しないときはこの値が返されます。 指定されていない場合は、 KeyError 代わりに が発生します。

戻り値

対応するストレッチ。

レイズ

KeyError - デフォルトが与えられず、変数が存在しない場合。

回路からストレッチを名前で取り出す:

from qiskit.circuit import QuantumCircuit

# Create a circuit and create a variable in it.
qc = QuantumCircuit()
my_stretch = qc.add_stretch("my_stretch")

# We can use 'my_stretch' as a variable, but let's say we've lost the Python object and
# need to retrieve it.
my_stretch_again = qc.get_stretch("my_stretch")

assert my_stretch == my_stretch_again

回路から変数を名前で取得し、それが存在しない場合はデフォルトを返す:

assert qc.get_stretch("my_stretch", None) == my_stretch
assert qc.get_stretch("unknown_stretch", None) is None

get_identifier

get_identifier(name: str, default: T) → Var | Stretch | T

get_identifier(name: str, default: builtin_types.EllipsisType = Ellipsis) → Var | Stretch

GitHub

この回路スコープでアクセス可能な識別子を名前で取得する。

これには現在、リアルタイムのクラシック変数とストレッチの両方が含まれている。

パラメーター

  • name (str) – 取得する識別子の名前。
  • default (Any) – 指定された場合、変数が存在しないときはこの値が返されます。 指定されていない場合は、 KeyError 代わりに が発生します。

戻り値

対応する変数。

レイズ

KeyError - デフォルトが与えられていないが、識別子が存在しない場合。

関連資料

get_var()

インスタンスであることが分かっている識別子を取得する。 expr.Var インスタンスです。

get_stretch()

インスタンスであることが分かっている識別子を取得する。 expr.Stretch インスタンスです。

get_parameter()

似たような方法だが Parameter コンパイル時のパラメータを expr.Var 実行時変数である。

has_var

has_var(name_or_var, /)

GitHub

変数がこのスコープでアクセス可能かどうかをチェックする。

パラメーター

name_or_var (str |Var) – 変数、または確認する変数の名前。 これが expr.Var ノードである場合、この関数がを返すためには True、変数が与えられたものと完全に一致していなければならない。

戻り値

マッチする変数にアクセスできるかどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_var()

この回路から expr.Var この回路からインスタンスを名前で取得する。

QuantumCircuit.has_parameter()

これと似た方法だが、コンパイル時に Parameter変数の代わりに expr.Var 変数を使用する。

has_stretch

has_stretch(name_or_stretch, /)

GitHub

ストレッチがこのスコープでアクセス可能かどうかをチェックする。

パラメーター

name_or_stretch (str |Stretch) – ストレッチ、または確認すべきストレッチの名前 これが expr.Stretch ノードである場合、この関数がを返すためには True、伸長が与えられたものと正確に一致しなければならない。

戻り値

マッチするストレッチにアクセスできるかどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_stretch()

この回路から expr.Stretch この回路からインスタンスを名前で取得する。

has_identifier

has_identifier(name_or_ident, /)

GitHub

識別子がこのスコープでアクセス可能かどうかを調べる。

パラメーター

name_or_ident (str |Var |Stretch) – インスタンス、または確認する識別子の名前。 これが または expr.Stretch expr.Var ノードである場合、一致したインスタンスは指定されたものと完全に一致しなければ、この関数は を返す True

戻り値

マッチする識別子がアクセス可能かどうか。

戻りの型

bool

関連資料

QuantumCircuit.get_identifier()

を取得する。 expr.Var または expr.Stretch インスタンスを取り出す。

QuantumCircuit.has_var()

このメソッドと同じだが、ランタイムの expr.Var 変数でないものは無視する。

QuantumCircuit.has_stretch()

このメソッドと同じだが、ランタイムの expr.Stretch 変数でないものは無視する。

QuantumCircuit.has_parameter()

これと似た方法だが、コンパイル時に Parameter変数の代わりに expr.Var 変数を使用する。

また、回路が追跡する識別子の全セットを取得するために使用できるイテレータ・メソッドもいくつかある。 および iter_input_vars()iter_captured_vars() は空になる。入力とキャプチャは互いに排他的だからである。 すべてのイテレータは、その長さを含む対応するダイナミック・プロパティを QuantumCircuit に対応するダイナミック・プロパティを持ちます: num_vars, num_stretches, num_input_vars, num_captured_vars, num_captured_stretches, num_declared_varsまたは num_declared_stretches.

iter_vars

iter_vars()

GitHub

この回路のスコープ内にあるすべてのリアルタイム・クラシック変数の反復可能値を取得する。

このメソッドは、スコープ内のすべての変数を繰り返し処理する。 より細かいイテレータについては iter_declared_vars(), iter_input_vars() および iter_captured_vars().

戻りの型

イテラブル[* ヴァール]*

iter_stretches

iter_stretches()

GitHub

この回路内のすべてのストレッチを反復可能な形で取得する。

このメソッドは、スコープ内のすべてのストレッチを繰り返し処理する。 より細かいイテレータについては iter_declared_stretches()iter_captured_stretches().

戻りの型

イテラブル[* ストレッチ]*

iter_input_vars

iter_input_vars()

GitHub

この回路スコープの入力として宣言されているすべてのリアルタイム・クラシック変数を反復可能な形で取得する。 これは、ローカルで宣言された変数 ( iter_declared_vars()参照)とキャプチャされた変数( iter_captured_vars()).

戻りの型

イテラブル[* ヴァール]*

iter_captured_vars

iter_captured_vars()

GitHub

含むスコープから、この回路スコープでキャプチャされているすべてのリアルタイム古典変数を反復可能な形で取得します。 これは入力変数 ( iter_input_vars()参照)とローカルで宣言された変数( iter_declared_vars()).

戻りの型

イテラブル[* ヴァール]*

iter_captured_stretches

iter_captured_stretches()

GitHub

この回路スコープでキャプチャされたストレッチを含むスコープから反復可能な形で取得します。 これは、ローカルで宣言されたストレッチを除く( iter_declared_stretches()).

戻りの型

イテラブル[* ストレッチ]*

iter_declared_vars

iter_declared_vars()

GitHub

このスコープで自動保存期間が宣言されているすべてのリアルタイム古典変数を反復可能な形で取得します。 これは入力変数( iter_input_vars()参照)とキャプチャされた変数 iter_captured_vars()).

戻りの型

イテラブル[* ヴァール]*

iter_declared_stretches

iter_declared_stretches()

GitHub

このスコープで宣言されているすべてのストレッチを反復可能形式で取得します。 これは、キャプチャされたストレッチを除く( iter_captured_stretches()).

戻りの型

イテラブル[* ストレッチ]*


回路への演算の追加

インターフェイスを実装しているものなら何でも、1つの命令として回路に追加できる。 Operation インターフェイスを実装するものなら何でも、1つの命令として回路に追加できる。 Instruction または Gate インスタンスになります。

関連資料

操作、指示、ゲート

回路レベル命令 qiskit.circuit-Qiskitが回路レベル命令を定義するために使用するさまざまなインターフェースに関するレベルのドキュメントです。

汎用演算を追加する方法

これらは、ユーザー定義のものも含め、あらゆるオブジェクトを回路に追加するための基本メソッドである。

メソッド
いつ使用するか
append()命令を1つのオブジェクトとして回路に追加する。
_append()と同じである。 append()と同じだが、エラーチェックをほとんど行わない低レベルのインターフェイスである。
compose()ある回路から別の回路に命令をインライン化する。
tensor()のように compose()のようなものだが、厳密には、不連続な量子ビットに作用する回路を結合するためのものである。

QuantumCircuit 回路に演算を追加するには、主に2つの方法がある。 どちらを使うかは、オブジェクトを1つの「命令」として追加したいのか(append())としてオブジェクトを追加したいのか、あるいは2つの回路の命令を結合したいのか(compose()).

1つの命令または操作は、回路の data 回路ビジュアライザ( draw()). 一つの命令は、ハードウェアバックエンドが定義されるかもしれない「単位」である( Target). アン Instructiondefinitionこれはトランスパイラ( qiskit.transpilerを参照)が必要な場合に、ハードウェア用に分解するための1つのルールである。 を Operation でもない Instruction でもないものは、関連する高レベル合成メソッドが登録されている場合にのみ分解できる ( qiskit.transpiler.passes.synthesis.plugin).

A QuantumCircuit だけでは単一の Instruction型付けされた古典的なメモリー入出力と制御フローを持つ完全なプログラムを表すことができるからだ。 Qiskitの(そしてほとんどのハードウェアの)データモデルには、仮想量子オペランドを持つ再利用可能な呼び出し可能サブルーチンという概念がまだない。 量子ビットにのみ作用する単純な回路を、ユニタリー演算で Gate を使って to_gate()に変換し、量子ビットと clbits にのみ作用する単純な回路は Instruction に変換できる。 to_instruction().

を持っている場合 Operation, Instructionまたは Gateでqubitとclbit引数を指定し、回路に追加する。 append().

append

append(instruction, qargs=None, cargs=None, *, copy=True)

GitHub

回路の末尾に1つ以上の命令を追加し、その場で回路を変更する。

qargscargs は、所定のルールに従って展開され、放送される。 Instructionの規則に従って展開され放送される。Bit 非指定子(整数インデックスなど)は、関連するインスタンスに解決される。

もし CircuitInstruction が与えられると、それがアンラップされ、この回路のコンテキストで検証され、新しいオブジェクトが回路に追加される。 この場合、 qargscargs

パラメーター

  • instruction (Operation |CircuitInstruction) –Instruction インスタンスを追加するか CircuitInstruction を追加する。
  • qargs (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]] | None) – 命令を適用する対象の指定 Qubit子。
  • cargs (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]] | None) – 命令を適用する対象の指定 Clbit子。
  • copy (bool) – もし True (デフォルト)なら、入力された instruction がシンボリック・パラメータを含んでいる場合、回路に追加する前にコピーされるため、同じ命令が含まれるかもしれない他の回路に影響を与えることなく、安全に変異させることができる。 この命令が他の回路で使われることがないと確信できる場合は、 False 、わずかなスピードアップを図ることができる。

戻り値

へのハンドルである。 CircuitInstruction実際に回路に追加された

戻りの型

qiskit.circuit.InstructionSet

レイズ

CircuitError - のインスタンスでない場合は Instruction .

append() のデータモデルを誤って壊してしまわないように、かなりのエラーチェックを行っている。 QuantumCircuit. 既知のデータからプログラムで回路を生成する場合、fast-path appender _append()を使用することで、このエラーチェックの多くを省略することができますが、有効なデータのみを渡していることを確認する責任は呼び出し側にあるというリスクを伴います。

_append

_append(instruction: CircuitInstruction, *, _standard_gate: bool) → CircuitInstruction

_append(instruction: Operation, qargs: Sequence[Qubit], cargs: Sequence[Clbit]) → Operation

GitHub

回路の末尾に命令を追加し、その場で回路を変更する。

警告

これは内部のファストパス関数であり、すべての引数が有効であることを確認するのは呼び出し側の責任である。 具体的には以下の通りです:

  • すべてのqubitsとclbitsはすでに回路に存在し、リストに重複があってはならない。
  • 制御フロー演算命令は、回路内に存在する変数にのみ作用しなければならない。
  • 回路はコントロールフロー・ビルダー・コンテキスト内であってはならない。

この関数は、以下の場合以外の呼び出し元でも使用できる。 QuantumCircuit 呼び出し元が、すべてのエラーチェック、ブロードキャスト、スコープがすでに実行され、命令が追加される回路への唯一の参照が同じ関数内にあることを確認している場合。 特に QuantumCircuit._append() を呼ぶのは安全ではない。 これは QuantumCircuit._append() はコントロール・フロー・ビルダー・インターフェースのスコープ構文を認識しないからである。

パラメーター

  • インストラクション

    完全な整形式 CircuitInstruction 操作とそのコンテキストを追加する。

    レガシー互換形式では、これは裸の Operationその場合は、 qargscargs を明示的に指定しなければならない。

  • qargs - レガシー引数。 Operation をつける。 第一引数が優先形式の場合は無視される。 CircuitInstruction の場合は無視される。

  • cargs - clbitsのレガシー引数。 Operation を付ける。 第一引数が優先形式の場合は無視される。 CircuitInstruction の場合は無視される。

  • _standard_gate (bool)

戻り値

追加された命令へのハンドル。

戻りの型

CircuitInstruction

また、2つの回路を結合し、ある回路の命令を別の回路の指定された量子ビットや量子ビットに適用したい場合もある。 この「インライン化」操作は compose() Qiskitで compose() は、一般的に to_instruction()-プラスappend() の組み合わせよりも強力である。なぜなら、型付けされた古典的なデータも一緒にリンクでき、回路の制御フロー操作を別の回路に結合できるからである。

の欠点は compose() の欠点は、オペランドの書き換えがより複雑になることと、ある回路オブジェクトから別の回路オブジェクトにデータを移動しなければならないことである。 もし、あなたが自分自身のために回路を構築していて、生のパフォーマンスが核心的な目標であるならば、一時的なレイヤー回路を構築するのではなく、ベース回路をパスアラウンドさせ、アルゴリズムの異なる部分をベース回路に直接書き込ませることを検討すること。

compose

compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[True] = True, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → None

compose(other: QuantumCircuit | Instruction, qubits: Qubit | QuantumRegister | int | slice | Sequence[Qubit | int] | Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]] | None = None, clbits: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int] | Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]] | None = None, front: bool = False, inplace: Literal[False] = False, wrap: bool = False, *, copy: bool = True, var_remap: Mapping[str | Var | Stretch, str | Var | Stretch] | None = None, inline_captures: bool = False) → QuantumCircuit

GitHub

ある回路からの命令を、別の回路の指定された量子ビットや量子ビットに適用する。

デフォルトでは、 self はそのままで、新しい回路オブジェクトが作成される。 この関数のほとんどの用途では、 inplace=True を設定し、その場でベース回路を変更する方がはるかに効率的である。

リアルタイム変数 (expr.Varexpr.Stretch インスタンス) を扱う場合、次の 2 つの主要な戦略があります。 compose():

  1. other 回路は、その変数も含めて完全に加法的なものとして扱われる。 other の変数は、 self の変数とは完全に区別する必要があります( var_remap を使用すると便利です)。 other の変数はすべて、 other の変数と入力/キャプチャ/ローカル・スコープが一致するように、出力で新たに宣言されます。 これは一般的に、関係のない2つの回路を接続する場合に必要なものです。
  2. other 回路は、 self の正確な拡張として作成され、 self の最後にある状態の既存の変数に作用することも含めて、 にインライン化された。 この場合、インライン化するこれらの変数をすべて "captures "として宣言した other を作成し、このメソッドで inline_captures=True を使ってリンクする。 これは一般的に、その場でレイヤーを定義して回路を構築する場合や、自分自身から取り出したレイヤーを使って回路を再構築する場合に求められるものだ。 の引数 vars_mode="captures" は、各レイヤーのベースを作成するのに便利だ。 copy_empty_like() への引数が役に立つかもしれない。

パラメーター

  • other (qiskit.circuit.Instruction orQuantumCircuit) – (サブ)回路、または自己に合成するための指示。 でない場合は QuantumCircuitでない場合は append である。

  • qubits (list[Qubit|int]) – 自己を構成する量子ビット。

  • clbits (list[Clbit|int]) – 自己の断片を合成する。

  • front (bool) – True の場合、フロントコンポジションが行われる。 これは、コントロール・フロー・ビルダー・コンテキスト・マネージャー内では不可能である。

  • inplace (bool) – True の場合、オブジェクトを修正する。 そうでなければ、構成された回路を返す。

  • copy (bool) – もし True (デフォルト)なら、入力は共有されたものとして扱われ、将来変更される可能性がある場合、含まれている命令はコピーされる。 不必要なコピーを避けるため、入力をベース回路が所有しているとみなす場合は、これを False 。この場合、 other を後で使用するのは無効であり、一部の命令がその場で変異している可能性がある。

  • var_remap (Mapping) –

    を書き換えるために使用するマッピング expr.Varexpr.Stretchother selfノードを書き換えるために使用するマッピングである。 これは名前の衝突を避けるために使うことができる。

    キーも値も、文字列または直接識別子のインスタンスとして与えることができる。 キーが文字列の場合、任意の Var または Stretch にマッチします。 値が文字列の場合、新しいキーがそれにマッチするたびに、新しい Var または Stretch が生成される。 値が Varである場合、その type は、置き換えられる変数のそれと正確に一致しなければならない。

  • inline_captures (bool) –

    もし True の場合、 other のすべての「キャプチャされた」識別子ノードは、 ですでに宣言されている識別子を参照するものとみなされる。 QuantumCircuit のすべての "キャプチャされた "識別子ノードは、 self (入力/キャプチャ/ローカル型のいずれかとして)ですでに宣言されている識別子を指すと仮定され、 other の使用法は既存の識別子に適用される。 で使用する既存の回路のレイヤーを構築したい場合は、 の引数を使用するとよい。 compose()で使用するために既存の回路のレイヤーを構築したい場合、 vars_mode="captures" の引数が役に立つかもしれない。 copy_empty_like() を使うと便利だ。 vars_remap のリマッピングは、このインライン化された変数を評価する前に行われる。

    これが False (デフォルト)の場合、 other の識別子はすべて、 self の識別子と区別される必要があり、それらのために新しい宣言が行われる。

  • wrap (bool) – もしTrueなら、selfに合成する前に、もう1つの回路をゲート(または命令(それがユニタリ命令だけを含むかどうかによる)にラップする。 このオプションを使うよりも、ほとんどの場合、手動で to_instruction() または to_gate()または append().

戻り値

構成された回路(inplace==True の場合は None を返す)。

戻りの型

QuantumCircuit

レイズ

  • CircuitError - other の幅が self よりも広い場合など、2つの回路間で正しいワイヤーマッピングができない場合。
  • CircuitError - self 、部分的に構築されたコントロールフローコンテキストがアクティブな状態で、新しい回路を生成しようとする場合、例えばコンテキストマネージャのフォームである if_test(), for_loop() および while_loop().
  • CircuitError - この動作に明確な意味はない。

>>> lhs.compose(rhs, qubits=[3, 2], inplace=True)
            ┌───┐                   ┌─────┐                ┌───┐
lqr_1_0: ───┤ H ├───    rqr_0: ──■──┤ Tdg ├    lqr_1_0: ───┤ H ├───────────────
            ├───┤              ┌─┴─┐└─────┘                ├───┤
lqr_1_1: ───┤ X ├───    rqr_1: ┤ X ├───────    lqr_1_1: ───┤ X ├───────────────
         ┌──┴───┴──┐           └───┘                    ┌──┴───┴──┐┌───┐
lqr_1_2: ┤ U1(0.1) ├  +                     =  lqr_1_2: ┤ U1(0.1) ├┤ X ├───────
         └─────────┘                                    └─────────┘└─┬─┘┌─────┐
lqr_2_0: ─────■─────                           lqr_2_0: ─────■───────■──┤ Tdg ├
            ┌─┴─┐                                          ┌─┴─┐        └─────┘
lqr_2_1: ───┤ X ├───                           lqr_2_1: ───┤ X ├───────────────
            └───┘                                          └───┘
lcr_0: 0 ═══════════                           lcr_0: 0 ═══════════════════════

lcr_1: 0 ═══════════                           lcr_1: 0 ═══════════════════════

2つの回路を結合しようとしている場合、それは完全に不連続なqubitsとclbitsに適用される、 tensor() は、手動でビットオブジェクトを追加して compose().

tensor

tensor(other, inplace=False)

GitHub

Tensor self with other.

リトルエンディアンの慣習では、左端の演算が回路の一番下に来ることを覚えておいてほしい。 詳細はドキュメントも参照のこと。

     ┌────────┐        ┌─────┐          ┌─────┐
q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├  = q_0: ─┤ top ├──
     └────────┘        └─────┘         ┌┴─────┴─┐
                                  q_1: ┤ bottom ├
                                       └────────┘

パラメーター

  • other (QuantumCircuit) – この回路をテンソルするもう1つの回路。
  • inplace (bool) – True の場合、オブジェクトを修正する。 そうでなければ、構成された回路を返す。

戻りの型

QuantumCircuit | なし

from qiskit import QuantumCircuit
top = QuantumCircuit(1)
top.x(0);
bottom = QuantumCircuit(2)
bottom.cry(0.2, 0, 1);
tensored = bottom.tensor(top)
tensored.draw('mpl')
先のコードで出力された回路図。

戻り値

テンサード回路( inplace=True の場合は None を返す)。

戻りの型

QuantumCircuit

パラメーター

経験則として:

注意すべき落とし穴もある:

  • カスタム Instruction を再利用する場合であっても、トランスパイラは一般に、その作業を開始する前に、各呼び出しをその内部分解まで "アンロール "する必要があります。 の使用を妨げるものではありません。 to_instruction()-プラスappend() パターンを使うことを妨げるものではない。
  • compose() は、後方互換性のために、デフォルトでは新しい回路を生成する。 これはより高価で、通常は望むものではないので、 inplace=True
  • どちらも append() そして compose()_append()) には copy キーワード引数があり、デフォルトは True です。 このような場合 Operation インスタンスはコピーされます。 オブジェクトを他の場所で再利用しないことが確実であれば、 copy=False 、このコピーを防ぐように設定すべきである。

標準的な指示を追加する方法

この QuantumCircuit クラスには、Qiskitの標準ライブラリに含まれる多くの命令やゲートを回路に追加するためのヘルパーメソッドが用意されています。 これらは一般的に、関連 qiskit.circuit.library するオブジェクトのインスタンスを手動で作成し、それを に渡すのと同じ効果を持ち、残りの引数は必要 append() に応じて および cargs qargs フィールドに格納されます。

以下のメソッドは、特別な非ユニタリー演算を適用する。 Instruction を適用する:

これらの方法は、制御されないユニタリー Gate インスタンスを適用する:

以下のメソッドが適用される。 Gate の直接のサブクラスである。 ControlledGate:

最後に、これらの方法は、特定の一般化された多重制御ゲートを回路に適用し、多くの場合、熱心な合成を行う。 正確な出力はゲートの合成バージョンであることが多いため、制御しているベース・ ゲートの観点からリストアップされている。

このセクションの残りの部分は、個々のメソッドのAPIリストである。

barrier

barrier(*qargs, label=None)

GitHub

Barrier を適用する。 qargs が空の場合、回路内のすべての量子ビットに適用される。

パラメーター

  • qargs (QubitSpecifier) – 1つ以上の量子ビット引数の指定。
  • label (str) – バリアの文字列ラベル。

戻り値

を追加した。

戻りの型

qiskit.circuit.InstructionSet

ccx

ccx(control_qubit1, control_qubit2, target_qubit, ctrl_state=None)

GitHub

適用する CCXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ccz

ccz(control_qubit1, control_qubit2, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CCZGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ch

ch(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CHGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cp

cp(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CPhaseGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

crx

crx(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CRXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cry

cry(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CRYGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

crz

crz(theta, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CRZGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cs

cs(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CSGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

csdg

csdg(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CSdgGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cswap

cswap(control_qubit, target_qubit1, target_qubit2, label=None, ctrl_state=None)

GitHub

適用する CSwapGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

csx

csx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CSXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cu

cu(theta, phi, lam, gamma, control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CUGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cx

cx(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cy

cy(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CYGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

cz

cz(control_qubit, target_qubit, label=None, ctrl_state=None)

GitHub

適用する CZGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

dcx

dcx(qubit1, qubit2)

GitHub

適用する DCXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

delay

delay(duration, qarg=None, unit=None)

GitHub

適用する Delay. qarg が None の場合、すべての量子ビットに適用される。 複数の量子ビットに適用する場合、同じ持続時間のディレイが作成される。

パラメーター

  • duration (Object) – 遅延時間 これが Exprの定数式でなければならない。 Duration.
  • qarg (Object) – qubit引数でこの遅延を適用する。
  • unit (str | None) – ただし、 durationExpr の場合は指定してはならない。 対応ユニット: 's' 'ms''us''ns''ps''dt'。 デフォルトは 'dt'、つまりターゲットとなるバックエンドに応じた整数の時間単位である。

戻り値

を追加した。

戻りの型

qiskit.circuit.InstructionSet

レイズ

CircuitError - 引数の書式が悪い場合。

ecr

ecr(qubit1, qubit2)

GitHub

適用する ECRGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

h

h(qubit)

GitHub

適用する HGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

id

id(qubit)

GitHub

適用する IGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

initialize

initialize(params, qubits=None, normalize=False)

GitHub

量子ビットを特定の状態に初期化する。

量子ビットの初期化は、まず量子ビットを 0|0\rangle にリセットし、その後に StatePreparation クラスを呼び出して、指定された状態の量子ビットを準備します。 この2つのステップの両方がインストラクションに含まれている。 Initialize 指導に含まれている。

パラメーター

  • params (Statevector | Sequence[complex] | str |int) –

    初期化する状態は、以下のいずれかである。

    • 初期化する状態ベクトルまたは複素振幅のベクトル。
    • パウリ固有状態Z, X, Yの基底状態のラベル。 Statevector.from_label() を参照してください。 ラベルの順番が、適用する量子ビットのインデックスに対して逆になっていることに注意。 例ラベル '01' は、量子ビット0を 1|1\rangle に、量子ビット1を 0|0\rangle に初期化する。
    • どの量子ビットを 1|1\rangle に初期化するかを示すビットマップとして使用される整数。 例:params を 5 に設定すると、量子ビット 0 と量子ビット 2 を 1|1\rangle に、量子ビット 1 を 0|0\rangle に初期化する。
  • qubits (Sequence[QubitSpecifier] | None) – 初期化するキュービット。 None の場合、初期化は回路内のすべての量子ビットに適用される。

  • normalize (bool) – 入力配列を単位ベクトルに正規化するかどうか。

戻り値

作成されたインストラクションへのハンドル。

(01)/2(|0\rangle - |1\rangle) / \sqrt{2} の状態の量子ビットを用意する。

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(1)
circuit.initialize([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()

出力:

     ┌──────────────────────────────┐
q_0: ┤ Initialize(0.70711,-0.70711) ├
     └──────────────────────────────┘

10|10\rangle、文字列から2つの量子ビットを初期化する。ラベルの順序は量子ビットのインデックスに対して逆になっている。 基底状態のラベルの詳細については、以下を参照のこと。 Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.initialize('01', circuit.qubits)
circuit.draw()

出力:

     ┌──────────────────┐
q_0: ┤0                 ├
     │  Initialize(0,1) │
q_1: ┤1                 ├
     └──────────────────┘

複素振幅の配列から2つの量子ビットを初期化する。

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.initialize([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()

出力:

     ┌────────────────────────────────────┐
q_0: ┤0                                   ├
     │  Initialize(0,0.70711,-0.70711j,0) │
q_1: ┤1                                   ├
     └────────────────────────────────────┘

iswap

iswap(qubit1, qubit2)

GitHub

適用する iSwapGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

mcp

mcp(lam, control_qubits, target_qubit, ctrl_state=None)

GitHub

適用する MCPhaseGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

mcrx

mcrx(theta, q_controls, q_target, use_basis_gates=False)

GitHub

多重制御X回転ゲートを適用

パラメーター

mcry

mcry(theta, q_controls, q_target, q_ancillae=None, mode=None, use_basis_gates=False)

GitHub

複数制御のY回転ゲートを適用

パラメーター

mcrz

mcrz(lam, q_controls, q_target, use_basis_gates=False)

GitHub

複数制御のZ回転ゲートを適用

パラメーター

mcx

mcx(control_qubits, target_qubit, ancilla_qubits=None, mode=None, ctrl_state=None)

GitHub

適用する MCXGate.

multi-cX ゲートは、異なるアンシラ量子ビットの数を使用し、回路の深さが異なる様々な技術を用いて実装することができる。 これらのモードは以下の通りである:

  • 'noancilla':0アンシラ量子ビットを必要とする。
  • 'recursion':4つ以上のコントロールを使用する場合は1つのアンシラ量子ビットを必要とし、そうでない場合は0。
  • 'v-chain':制御量子ビットの数より2少ないアンシラを必要とする。
  • 'v-chain-dirty':クリーンアンシラの場合と同じ(ただし、回路は長くなる)。

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

バージョンから非推奨 2.1

qiskit.circuit.quantumcircuit.QuantumCircuit.mcx()の引数 mode は Qiskit 2.1 で非推奨となりました。 発売日から3ヶ月以内に削除されます。 代わりに、回路に汎用MCXGateを追加し、トランスパイルで hls_config 、合成方法を指定する。 また、特定の分解は次のサイトで入手できる。 https://qisk.it/mcx.

パラメーター

戻り値

作成されたインストラクションへのハンドル。

レイズ

  • ValueError - 指定されたモードがわからない場合、または渡されたアンシラ量子ビットの数が少なすぎる場合。
  • AttributeError - アンシラ・クビットが渡されていないが、必要である場合。

戻りの型

InstructionSet

measure

measure(qubit, cbit)

GitHub

Z基底の量子ビット(qubit)を古典ビット(cbit)に変換する。

量子状態が測定されると、量子ビットは計算(パウリZ)基底で 0\lvert 0 \rangle または 1\lvert 1 \rangle のいずれかに投影される。古典ビット cbit は、その投影結果をそれぞれ 0 または 1 として示す。 この操作は非可逆的である。

パラメーター

戻り値

を追加した。

戻りの型

qiskit.circuit.InstructionSet

レイズ

CircuitError - 引数の書式が悪い場合。

この例では、量子ビットが測定され、その測定結果が古典ビット(通常、図では二重線で表現される)に格納される:

from qiskit import QuantumCircuit
circuit = QuantumCircuit(1, 1)
circuit.h(0)
circuit.measure(0, 0)
circuit.draw()
     ┌───┐┌─┐
  q: ┤ H ├┤M├
     └───┘└╥┘
c: 1/══════╩═
           0

一対一測定のショートカットとして、 qubitscbits のリストで measure を呼び出すことができる。 この2つのフォームは同じ結果をもたらす:

circuit = QuantumCircuit(2, 2)
circuit.measure([0,1], [0,1])
circuit = QuantumCircuit(2, 2)
circuit.measure(0, 0)
circuit.measure(1, 1)

リストの代わりに QuantumRegisterClassicalRegister を使うことができる。

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
qreg = QuantumRegister(2, "qreg")
creg = ClassicalRegister(2, "creg")
circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg, creg)

これは、以下と同じ意味になります。

circuit = QuantumCircuit(qreg, creg)
circuit.measure(qreg[0], creg[0])
circuit.measure(qreg[1], creg[1])

ms

ms(theta, qubits)

GitHub

適用する MSGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

p

p(theta, qubit)

GitHub

適用する PhaseGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

pauli

pauli(pauli_string, qubits)

GitHub

適用する PauliGate.

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

prepare_state

prepare_state(state, qubits=None, label=None, normalize=False)

GitHub

特定の状態の量子ビットを準備する。

このクラスは状態を準備するユニタリーを実装している。 とは異なり initialize() と異なり、最初に量子ビットをリセットしない。

パラメーター

  • state (Statevector | Sequence[complex] | str |int) –

    初期化する状態は、以下のいずれかである。

    • 初期化する状態ベクトルまたは複素振幅のベクトル。
    • パウリ固有状態Z, X, Yの基底状態のラベル。 Statevector.from_label() を参照してください。 ラベルの順番が、適用する量子ビットのインデックスに対して逆になっていることに注意。 例 ラベル「01」は、量子ビット0を 1|1\rangle、量子ビット1を 0|0\rangle に初期化する。
    • どの量子ビットを 1|1\rangle に初期化するかを示すビットマップとして使用される整数。 例:params を 5 に設定すると、量子ビット 0 と量子ビット 2 を 1|1\rangle に、量子ビット 1 を 0|0\rangle に初期化する。
  • qubits (Sequence[QubitSpecifier] | None) – 初期化するキュービット。 None の場合、初期化は回路内のすべての量子ビットに適用される。

  • label (str | None) – ゲートの任意のラベル

  • normalize (bool) – 入力配列を単位ベクトルに正規化するかどうか。

戻り値

先ほど初期化された命令へのハンドル

戻りの型

InstructionSet

(01)/2(|0\rangle - |1\rangle) / \sqrt{2} の状態の量子ビットを用意する。

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(1)
circuit.prepare_state([1/np.sqrt(2), -1/np.sqrt(2)], 0)
circuit.draw()

出力:

     ┌─────────────────────────────────────┐
q_0: ┤ State Preparation(0.70711,-0.70711) ├
     └─────────────────────────────────────┘

状態 10|10\rangle の2つの量子ビットを文字列から準備する。ラベルの順番は量子ビットのインデックスに対して逆になっている。 基底状態のラベルの詳細については、以下を参照のこと。 Statevector.from_label().

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.prepare_state('01', circuit.qubits)
circuit.draw()

出力:

     ┌─────────────────────────┐
q_0: ┤0                        ├
     │  State Preparation(0,1) │
q_1: ┤1                        ├
     └─────────────────────────┘

複素振幅の配列から2つの量子ビットを初期化する

import numpy as np
from qiskit import QuantumCircuit

circuit = QuantumCircuit(2)
circuit.prepare_state([0, 1/np.sqrt(2), -1.j/np.sqrt(2), 0], circuit.qubits)
circuit.draw()

出力:

     ┌───────────────────────────────────────────┐
q_0: ┤0                                          ├
     │  State Preparation(0,0.70711,-0.70711j,0) │
q_1: ┤1                                          ├
     └───────────────────────────────────────────┘

r

r(theta, phi, qubit)

GitHub

適用する RGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rcccx

rcccx(control_qubit1, control_qubit2, control_qubit3, target_qubit)

GitHub

適用する RC3XGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rccx

rccx(control_qubit1, control_qubit2, target_qubit)

GitHub

適用する RCCXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

reset

reset(qubit)

GitHub

量子ビットをデフォルト状態にリセットする。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – リセットする量子ビット。

戻り値

ハンドルを追加した。

戻りの型

qiskit.circuit.InstructionSet

rv

rv(vx, vy, vz, qubit)

GitHub

適用する RVGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

任意の回転軸 vv を中心とした回転。 v|v| はラジアン単位の回転角度。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rx

rx(theta, qubit, label=None)

GitHub

適用する RXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rxx

rxx(theta, qubit1, qubit2)

GitHub

適用する RXXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ry

ry(theta, qubit, label=None)

GitHub

適用する RYGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

ryy

ryy(theta, qubit1, qubit2)

GitHub

適用する RYYGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rz

rz(phi, qubit)

GitHub

適用する RZGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rzx

rzx(theta, qubit1, qubit2)

GitHub

適用する RZXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

rzz

rzz(theta, qubit1, qubit2)

GitHub

適用する RZZGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

s

s(qubit)

GitHub

適用する SGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

sdg

sdg(qubit)

GitHub

適用する SdgGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

store

store(lvalue, rvalue, /)

GitHub

与えられたリアルタイム古典式 rvalue の結果を、 lvalue で定義されたメモリー位置に格納する。

通常、 lvalueVar ノードとなり、 rvalue Expr である。 expr.lift() に上げることができるものなら何でも Expr に上げることができるものであれば、どちらの場所でも許される。

パラメーター

  • lvalue (Any) – 回路内のメモリー位置の有効な指定子。 これは通常 Var ノードに書き込むこともできる。 Clbit または ClassicalRegister に書き込むこともできる。 メモリー・ロケーションはすでに回路内に存在していなければならない。
  • rvalue (Any) – リアルタイム古典式で、その結果が与えられたメモリー位置に書き込まれる。

戻りの型

InstructionSet

関連資料

Store

この操作を表す Instruction クラスです。

add_var()

このメソッドで書き込み可能な新しい変数を回路内に作成する。

swap

swap(qubit1, qubit2)

GitHub

適用する SwapGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

sx

sx(qubit)

GitHub

適用する SXGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

sxdg

sxdg(qubit)

GitHub

適用する SXdgGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

t

t(qubit)

GitHub

適用する TGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

tdg

tdg(qubit)

GitHub

適用する TdgGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

u

u(theta, phi, lam, qubit)

GitHub

適用する UGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

unitary

unitary(obj, qubits, label=None)

GitHub

obj で指定されたユニタリーゲートを qubits に適用する。

パラメーター

  • obj (np.ndarray | Gate | BaseOperator) – 単一演算子。
  • qubits (Sequence[QubitSpecifier]) – 変換を適用する回路量子ビット。
  • label (str | None) – バックエンドの統一名[デフォルト:なし]。

戻り値

量子回路。

戻りの型

QuantumCircuit

ユニタリー行列で指定されたゲートを量子回路に適用する

from qiskit import QuantumCircuit
matrix = [[0, 0, 0, 1],
        [0, 0, 1, 0],
        [1, 0, 0, 0],
        [0, 1, 0, 0]]
circuit = QuantumCircuit(2)
circuit.unitary(matrix, [0, 1])

x

x(qubit, label=None)

GitHub

適用する XGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

y

y(qubit)

GitHub

適用する YGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

z

z(qubit)

GitHub

適用する ZGate.

このゲートの完全なマトリックス形式については、基礎となるゲートのドキュメントを参照のこと。

パラメーター

qubit (Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]) – ゲートを適用する量子ビット。

戻り値

作成されたインストラクションへのハンドル。

戻りの型

InstructionSet

回路への制御フローの追加

関連資料

回路の制御フロー

制御フローのオペレーションが全体の中でどのように表現されるかについての議論。 qiskit.circuit コンテキストでどのように表現されるかを議論する。

QuantumCircuit Qiskitがサポートするすべての制御フロー操作に対応するメソッドを備えています。 これらを呼び出すには、2つの方法があります。 1つ目は、命令のブロック本体を引数 QuantumCircuit として受け取り、単にそれに対応するものを生成して ControlFlowOp追加するだけの、非常にシンプルな利便性向上のためのラッパーです。

つ目の形式は、コントロール・フローを構築するために使うことを強く推奨するもので、 ビルダー・インターフェイスと呼ばれる。 ここでは、メソッドは操作のリアルタイム判別だけを取り、 with を使って入力したコンテキスト・マネージャーを返す。 その後、これらのブロック内で通常の QuantumCircuit Qiskitは自動的にどのデータリソースが内部ブロックに必要かを追跡し、完全な ControlFlowOpwith を構築します。 この方法でプログラム的に制御フローを構築する方が、はるかにシンプルで、エラーの発生も少ない。

コントロール・フロー・ビルダー・インターフェースを使用する際、演算が定義されていないにもかかわらず、量子ビットをブロックに含めたい場合がある。 この場合 noop() メソッドを使用します。

回路に ControlFlowOp が含まれているかどうかを調べるには、ヘルパー・メソッド QuantumCircuit.has_control_flow_op().

box

box(body_or_annotations=Ellipsis, /, qubits=None, clbits=None, *, label=None, duration=None, unit=None, annotations=Ellipsis)

GitHub

より大きなコンテキストの中でアトミックに扱われる、この回路上の操作の box

ボックス」とは、無条件に入力される制御フローの構成要素である。 ボックスの中身は、ボックスの始点と終点がバリアであるかのような振る舞いをする( barrier()を参照)、ただし、ボックスの中を "ずっと "通過することは許される。 ボックスは、変数、ストレッチ、コンパイラー・パスのための明示的なスコープでもある。

この関数を呼び出すには2つの形式がある:

  • を渡す。 QuantumCircuit 位置的に、 qubitsclbits に作用する。 この形式では BoxOp が即座に作成され、回路をボディとして付加される。
  • bodyqubitsclbits のない with ステートメントで使用する。 これが「ビルダー・インターフェース・フォーム」である。 QuantumCircuitbox に命令を追加するために、 Python with スコープ内の他のメソッドを使う。 これは好ましい形式であり、エラーの可能性がはるかに低い。

ビルダー・インターフェイスを使って2つのボックスを順番に追加する。 この回路の2つのボックスは同時に実行することができ、2つ目のボックスは、量子ビットがアイドル状態であっても、そのボックスの間、量子ビット8へのデータフロー依存性を明示的に挿入する。

from qiskit.circuit import QuantumCircuit, Annotation

class MyAnnotation(Annotation):
    namespace = "my.namespace"

qc = QuantumCircuit(9)
with qc.box():
    qc.cz(0, 1)
    qc.cz(2, 3)
with qc.box([MyAnnotation()]):
    qc.cz(4, 5)
    qc.cz(6, 7)
    qc.noop(8)

ボックスの明示的な構造を使って。 これは、上記と同じ回路を作るものであり、なぜ以前の形式がインタラクティブな使用に適しているのかを示すものである。

from qiskit.circuit import QuantumCircuit, BoxOp

body_0 = QuantumCircuit(4)
body_0.cz(0, 1)
body_0.cz(2, 3)

# Note that the qubit indices inside a body related only to the body.  The
# association with qubits in the containing circuit is made by the ``qubits``
# argument to `QuantumCircuit.box`.
body_1 = QuantumCircuit(5)
body_1.cz(0, 1)
body_1.cz(2, 3)

qc = QuantumCircuit(9)
qc.box(body_0, [0, 1, 2, 3], [])
qc.box(body_1, [4, 5, 6, 7, 8], [])

パラメーター

  • body_or_annotations (QuantumCircuit |Iterable[Annotation]) – 最初の位置引数は無名である。 を位置指定で渡すと、その QuantumCircuit が位置指定で渡された場合、それは即座にボックスのボディとして使用され、 qubitsclbits も指定されなければならない。 オブジェクトのイテレート可能なイテレートが与えられた場合。 Annotation オブジェクトが与えられた場合、このメソッドのコンテキスト・マネージャ形式が起動される。
  • qubits (Sequence[QubitSpecifier] | None) – を適用する量子ビットを BoxOp を適用する。
  • clbits (Sequence[ClbitSpecifier] | None) – 明示的な形式で、それを適用する BoxOp 対象。
  • label (str | None) – 命令のオプションの文字列ラベル。
  • duration (None) – オプションの明示的持続時間 BoxOp. スケジューリングパスは、必要であれば遅延の挿入も含め、与えられた期間に合わせて含まれるスコープをスケジューリングするよう制約される。
  • unit (Literal['dt', 's', 'ms', 'us', 'ns', 'ps', 'expr'] | None) – の単位は duration
  • annotations (Iterable[Annotation]) – ボックスが持つべき Annotation オブジェクトがあるはずだ。 このメソッドがコンテキスト・マネージャー形式で使われる場合、代わりにこの引数を唯一の位置引数として渡すことができる。

break_loop

break_loop()

GitHub

適用する BreakLoopOp.

警告

コンテキストマネージャーの「ビルダー」フォームを使用している場合 if_test(), for_loop() または while_loop()を使用している場合、ループコンテキスト内にいるときのみこのメソッドを呼び出すことができる。 そのため、(コンテキスト・マネージャーを使わずに)再利用可能なループ本体を構築しようとする場合は、コンテキスト・マネージャーを使わない形式の if_test()if_else(). この BreakLoopOp 命令は、直前のスコープだけでなく、ループを含むすべてのリソースにまたがっていなければならない。

戻り値

作成された命令へのハンドル。

レイズ

CircuitError - このメソッドがビルダー・コンテキスト内で呼び出されたが、ループ内に含まれていない場合。

戻りの型

InstructionSet

continue_loop

continue_loop()

GitHub

適用する ContinueLoopOp.

警告

コンテキストマネージャーの「ビルダー」フォームを使用している場合 if_test(), for_loop() または while_loop()を使用している場合、ループコンテキスト内にいるときのみこのメソッドを呼び出すことができる。 そのため、(コンテキスト・マネージャーを使わずに)再利用可能なループ本体を構築しようとする場合は、コンテキスト・マネージャーを使わない形式の if_test()if_else(). この ContinueLoopOp 命令は、直前のスコープだけでなく、ループを含むすべてのリソースにまたがっていなければならない。

戻り値

作成された命令へのハンドル。

レイズ

CircuitError - このメソッドがビルダー・コンテキスト内で呼び出されたが、ループ内に含まれていない場合。

戻りの型

InstructionSet

for_loop

for_loop(indexset: Iterable[int], loop_parameter: Parameter | None, body: None, qubits: None, clbits: None, *, label: str | None) → ForLoopContext

for_loop(indexset: Iterable[int], loop_parameter: Parameter | None, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet

GitHub

この回路に for のループを作る。

この関数を呼び出すには2つの形式がある。 すべての引数( label を除く)で呼び出された場合、指定された引数を持つ ForLoopOpbody を作成する。 body (および qubitsclbits )が渡されない場合、これはコンテキスト・マネージャーとして機能し、入力されるとループ変数を提供し(変数が与えられていない限り、その変数は再利用される)、スコープが終了すると自動的に ForLoopOp を自動的に構築する。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。

例:

from qiskit import QuantumCircuit
qc = QuantumCircuit(2, 1)

with qc.for_loop(range(5)) as i:
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(0, 0)
    with qc.if_test((0, True)):
        qc.break_loop()

パラメーター

  • indexset (Iterable[int]) – ループする整数のコレクション。 常に必要だ。

  • loop_parameter (Optional[Parameter]) –

    indexset からの値が割り当てられる body 内で使用されるパラメータ。 コンテキスト・マネージャー形式では、この引数が与えられない場合、ループ・パラメーターが割り当てられ、 with ステートメントの値として返される。 これは、体内で使用される場合にのみ回路に組み込まれる。

    このメソッドのマニュアル形式でこの引数が None の場合、 indexset の各項目について body が1回繰り返されるが、それらの値は無視される。

  • body (Optional[QuantumCircuit]) – 繰り返し実行されるループ本体。 コンテキスト・マネージャー・モードを使用する場合は省略する。

  • qubits (Optional[Sequence[QubitSpecifier]]) – ループ本体が実行されるべき回路量子ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。

  • clbits (Optional[Sequence[ClbitSpecifier]]) – ループ本体が実行されるべき回路ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。

  • label (Optional[str]) – 回路内の命令の文字列ラベル。

戻り値

呼び出しのシグネチャに応じて、forループを作成するためのコンテキスト・マネージャー(ブロックの最後で自動的に回路に追加される)、または追加されたループ操作のハンドルが渡される。 InstructionSet または、追加されたループ操作のハンドルである。

戻りの型

InstructionSet または ForLoopContext

レイズ

CircuitError - 誤った呼び出し規約が使用された場合。

if_else

if_else(condition, true_body, false_body, qubits, clbits, label=None)

GitHub

適用する IfElseOp.

このメソッドは、関連するコンテキスト・マネージャー・フォームを持たない。 if_test() メソッドですでに処理されているからです。 その else の部分を次のように使うことができる:

from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
with qc.if_test((bits[2], 0)) as else_:
    qc.h(0)
with else_:
    qc.x(0)

パラメーター

  • condition (tuple[ClassicalRegister, int] | tuple[Clbit, int] | tuple[Clbit, bool]) – 回路の実行時にリアルタイムで評価される条件であり、これが真の場合、の評価がトリガー true_bodyされる。 指定された値との等価性をテストする ClassicalRegister 値のタプルとして、あるいは値 bool``int または値のいずれかと比較する Clbit 値の intタプルとして指定できます。
  • true_body (QuantumCircuit) – condition が真の場合に実行される回路体。
  • false_body (QuantumCircuit) – condition が偽の場合に実行される回路。
  • qubits (Sequence[Qubit |QuantumRegister |int |slice |Sequence[Qubit |int]]) – if/else文を実行すべき回路クビット。
  • clbits (Sequence[Clbit |ClassicalRegister |int |slice |Sequence[Clbit |int]]) – if/else文が実行される対象となる回路ビット。
  • label (str | None) – 回路内の命令の文字列ラベル。

レイズ

CircuitError - 提供された条件が、包囲回路外のClbitsを参照する場合。

戻り値

作成された命令へのハンドル。

戻りの型

InstructionSet

if_test

if_test(condition: tuple[ClassicalRegister | Clbit, int]) → IfContext

if_test(condition: tuple[ClassicalRegister | Clbit, int], true_body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None = None) → InstructionSet

GitHub

この回路で if

この関数を呼び出すには2つの形式がある。 すべての引数( label を除く)で呼び出された場合、指定された を持つ IfElseOptrue_body を作成し、 false の条件に対する分岐はありません( のメソッドも参照してください)。 if_else() メソッドも参照)。 しかし、 true_body (および qubitsclbits )が渡されない場合、これはコンテキスト・マネージャーとして機能し、 if ステートメントを構築するために使用することができる。 with ステートメントの返り値は連鎖可能なコンテキスト・マネージャーであり、後続の else ブロックの作成に使用できる。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。

例:

from qiskit.circuit import QuantumCircuit, Qubit, Clbit
bits = [Qubit(), Qubit(), Qubit(), Clbit(), Clbit()]
qc = QuantumCircuit(bits)

qc.h(0)
qc.cx(0, 1)
qc.measure(0, 0)
qc.h(0)
qc.cx(0, 1)
qc.measure(0, 1)

with qc.if_test((bits[3], 0)) as else_:
    qc.x(2)
with else_:
    qc.h(2)
    qc.z(2)

パラメーター

  • condition (Tuple[Union[ClassicalRegister, Clbit], int]) – 回路実行中にリアルタイムで評価される条件。真であれば、 true_body の評価がトリガーされる。 指定された int と等しいかどうかをテストされる ClassicalRegister のタプルとして、または bool または int のいずれかと比較される Clbit のタプルとして指定することができる。
  • true_body (Optional[QuantumCircuit]) – condition が真の場合に実行される回路体。
  • qubits (Optional[Sequence[QubitSpecifier]]) – if/elseを実行する回路の量子ビット。
  • clbits (Optional[Sequence[ClbitSpecifier]]) – if/elseを実行する回路ビット。
  • label (Optional[str]) – 回路内の命令の文字列ラベル。

戻り値

呼び出しのシグネチャに応じて、 if ブロックを作成するためのコンテキスト・マネージャー(ブロックの最後で自動的に回路に追加される)、または追加された条件付き操作のハンドルがある。 InstructionSet 追加された条件操作のハンドル。

戻りの型

InstructionSet または IfContext

レイズ

  • CircuitError - 提供された条件が、包囲回路外のClbitsを参照する場合。
  • CircuitError - 誤った呼び出し規約が使用された場合。

戻り値

作成された命令へのハンドル。

switch

switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], cases: None, qubits: None, clbits: None, *, label: str | None) → SwitchContext

switch(target: Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int], cases: Iterable[tuple[Any, QuantumCircuit]], qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet

GitHub

この回路に switch/case 構造を作成する。

この関数を呼び出すには2つの形式がある。 すべての引数( label を除く)で呼び出された場合、指定されたケース構造を持つ SwitchCaseOp を生成します。 cases (および qubitsclbits )が渡されない場合、これはコンテキスト・マネージャーとして動作し、スコープが終了すると自動的に SwitchCaseOp を自動的に構築します。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。

使用例:

from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
qreg = QuantumRegister(3)
creg = ClassicalRegister(3)
qc = QuantumCircuit(qreg, creg)
qc.h([0, 1, 2])
qc.measure([0, 1, 2], [0, 1, 2])

with qc.switch(creg) as case:
    with case(0):
        qc.x(0)
    with case(1, 2):
        qc.z(1)
    with case(case.DEFAULT):
        qc.cx(0, 1)

パラメーター

  • target (Union[ClassicalRegister, Clbit]) – 古典的な値で1つを切り替える。 これは整数のようでなければならない。
  • cases (Iterable[Tuple[Any, QuantumCircuit]]) – 大文字小文字の指定子の並び。 各タプルは1つのケース本体(2番目の項目)を定義する。 タプルの最初の項目は、単一の整数値、特別な値 CASE_DEFAULTまたは複数の整数値のタプルである。 各整数値が順番に試され、最初にマッチした整数に対応するボディに制御が移る。 CASE_DEFAULT はすべての可能な値にマッチする。 コンテキスト・マネージャー形式では省略。
  • qubits (Sequence[Qubit]) – すべてのケースボディが実行される回路量子ビット。 コンテキスト・マネージャー形式では省略。
  • clbits (Sequence[Clbit]) – すべてのケースボディが実行される回路ビット。 コンテキスト・マネージャー形式では省略。
  • label (Optional[str]) – 回路内の命令の文字列ラベル。

戻り値

コンテキストマネージャーモードで使用する場合は、 with 。このリソースは、switch文のケースを生成するために繰り返し入力できるオブジェクトを返す。 完全な形式が使用される場合、これは作成された命令へのハンドルを返す。

戻りの型

InstructionSet または SwitchCaseContext

レイズ

CircuitError - 誤った呼び出し規約が使用された場合。

while_loop

while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: None, qubits: None, clbits: None, *, label: str | None) → WhileLoopContext

while_loop(condition: tuple[ClassicalRegister | Clbit, int] | Expr, body: QuantumCircuit, qubits: Sequence[Qubit | QuantumRegister | int | slice | Sequence[Qubit | int]], clbits: Sequence[Clbit | ClassicalRegister | int | slice | Sequence[Clbit | int]], *, label: str | None) → InstructionSet

GitHub

この回路に while のループを作る。

この関数を呼び出すには2つの形式がある。 すべての引数 (label を除く) を指定して呼び出すと、指定された body を持つ WhileLoopOp を作成する。body(およびqubitsclbits) が *渡されていない* 場合は、コンテキストマネージャーとして動作し、スコープが終了すると自動的に WhileLoopOp` を構築する。 この形式では、スコープが処理してくれるので、使用している量子ビットやClbitsを記録しておく必要はない。

使用例:

from qiskit.circuit import QuantumCircuit, Clbit, Qubit
bits = [Qubit(), Qubit(), Clbit()]
qc = QuantumCircuit(bits)

with qc.while_loop((bits[2], 0)):
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(0, 0)

パラメーター

  • condition (Tuple[Union[ClassicalRegister, Clbit], int]) – body を実行する前にチェックされる等号条件。 条件の左辺は必ず ClassicalRegister または Clbitでなければならず、右辺は整数または真偽値でなければならない。
  • body (Optional[QuantumCircuit]) – 繰り返し実行されるループ本体。 コンテキスト・マネージャー・モードを使用する場合は省略する。
  • qubits (Optional[Sequence[Qubit]]) – ループ本体が実行されるべき回路量子ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。
  • clbits (Optional[Sequence[Clbit]]) – ループ本体が実行されるべき回路ビット。 コンテキスト・マネージャー・モードを使用する場合は省略する。
  • label (Optional[str]) – 回路内の命令の文字列ラベル。

戻り値

コンテキストマネージャーモードで使用される場合、これは with リソースとして使用されるべきである。 完全な形式が使用される場合、これは作成された命令へのハンドルを返す。

戻りの型

InstructionSet または WhileLoopContext

レイズ

CircuitError - 誤った呼び出し規約が使用された場合。

noop

noop(*qargs)

GitHub

操作を追加することなく、与えられた量子ビットを現在のスコープ内で使用されているものとしてマークする。

のトップスコープで呼び出された場合、これは(無効な入力に対して例外を発生させる以外には)何の効果もない。 QuantumCircuit. コントロール・フロー・ビルダー内では、もしその量子ビットがまだ使われていなければ、その量子ビットはコントロール・フロー・ブロックによって "使われる "ことになる。

例:

from qiskit.circuit import QuantumCircuit

qc = QuantumCircuit(3)
with qc.box():
    # This control-flow block will only use qubits 0 and 1.
    qc.cx(0, 1)
with qc.box():
    # This control-flow block will contain only the same operation as the previous
    # block, but it will also mark qubit 2 as "used" by the box.
    qc.cx(0, 1)
    qc.noop(2)

パラメーター

*qargs ( Qubit |* QuantumRegister* |* int* |* slice* |* Sequence** [ Qubit | int** ]* ) – 有効な量子ビット指定子の可変長リスト。 ここでは、各引数に対して、量子ビットまたは量子ビットの集合として渡すことができるものはすべて有効です。

レイズ

CircuitError - もし要求された量子ビットが回路に有効でない場合。

has_control_flow_op

has_control_flow_op()

GitHub

のインスタンスがあるかどうかをチェックする。 ControlFlowOp のインスタンスがあるかどうかをチェックする。

戻りの型

bool

回路を他のオブジェクトに変換する

一般的な操作を追加する方法で説明したように、回路を Instruction または Gate に変換できます。

to_instruction

to_instruction(parameter_map=None, label=None)

GitHub

この回路から Instruction この回路から

関連資料

circuit_to_instruction()

この方法の根本的な原動力。

パラメーター

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – パラメータ化された回路の場合、回路内のパラメータから命令で使用されるパラメータへの対応付け。 「None」の場合、既存の回路パラメータもこの命令のパラメータとして使用されます。
  • label (str | None) – オプションのゲートラベル。

戻り値

この回路をカプセル化した複合命令(次のようになる。

分解された背中)。

戻りの型

qiskit.circuit.Instruction

to_gate

to_gate(parameter_map=None, label=None)

GitHub

この回路から Gate この回路から この回路は量子ビットにのみ作用し、ユニタリー演算のみを含んでいなければならない。

関連資料

circuit_to_gate()

この方法の根本的な原動力。

パラメーター

  • parameter_map (dict[Parameter, ParameterExpression |float] | None) – パラメータ化された回路の場合、回路内のパラメータからゲートで使用されるパラメータへの対応関係。 その場合 None、既存の回路パラメータもゲートをパラメータ化することになります。
  • label (str | None) – オプションのゲートラベル。

戻り値

この回路を内包する複合ゲート(逆分解可能)。

戻りの型

ゲート

さらに、回路全体を次の DAGCircuit 表現に変換できます:

to_dag

to_dag(*, copy_operations=True)

GitHub

この回路を.に変換してください DAGCircuit

これは単純なラッパーです circuit_to_dag()

パラメーター

copy_operations (bool) – 個々の命令をディープコピーするかどうか。 に設定すると False、操作は安価になるが、DAG内の命令への変更は元の回路に影響を与える。

戻り値

この同じ回路を表す有向非循環グラフ(DAG)。

戻りの型

qiskit.dagcircuit.DAGCircuit

ヘルパー変異法

には2つの上位メソッドがある。 QuantumCircuit がある。 デフォルトでは、これらのレジスタも追加される。

measure_active

measure_active(inplace=True)

GitHub

すべての非アイドル量子ビットに測定を追加する。 測定中の非アイドル量子ビットの数に等しいサイズの新しい ClassicalRegister を作成する。

inplace=False の場合、測定値を含む新しい回路を返す。

パラメーター

inplace (bool) – 測定はすべてその場で行うか、新しいサーキットに戻す。

戻り値

inplace = False のとき、測定値を含む回路を返す。

戻りの型

QuantumCircuit

measure_all

measure_all(inplace=True, add_bits=True)

GitHub

すべての量子ビットに測定値を加える。

デフォルトでは、新しい古典的ビットを ClassicalRegister に新しい古典ビットを追加する。 add_bits=False の場合、測定結果はすでに存在する古典ビットに格納され、量子ビット n は古典ビット n に測定される。

inplace=False の場合、測定値を含む新しい回路を返す。

パラメーター

  • inplace (bool) – 測定はすべてその場で行うか、新しいサーキットに戻す。
  • add_bits (bool) – 結果を保存するために新しいビットを追加するかどうか。

戻り値

inplace=False のとき、測定値を含む回路を返す。

戻りの型

QuantumCircuit

レイズ

CircuitError - もし add_bits=False 、クラシックのビットが足りない。

にも2つの "減算法 "がある。 QuantumCircuit もある。 これは QuantumCircuit の代わりに copy_empty_like() の代わりに clear()の代わりに remove_final_measurements() をトランスパイラ・パスの形として実行する。 RemoveFinalMeasurements.

clear

clear()

GitHub

自分の中の指示をすべてクリアにする。

回路をクリアしてもメタデータは残る。

関連資料

copy_empty_like()

命令を持たず、量子型と古典型のデータをすべて同じように追跡する新しい回路を、元の回路を変異させることなく生成する方法。

戻りの型

なし

remove_final_measurements

remove_final_measurements(inplace=True)

GitHub

すべての量子ビットの最終的な測定とバリアが存在する場合、それを削除する。 この操作の結果としてアイドルになったこれらの測定値からの値を格納するために使用された古典的レジスタを削除し、削除されたレジスタによってのみ参照される古典的ビット、またはまったく参照されないがこの操作の結果としてアイドルになった古典的ビットを削除する。

測定とバリアは、(他の測定やバリアは別として)その後に他の操作がない場合、最終的なものとみなされる

この方法は、特に新しくアイドル状態になった古典的なビットやレジスタの削除など、かなり複雑な動作をする。 不必要なクラシック・データを後から削除するよりも、最初から追加しない方がはるかに効率的だ。

関連資料

RemoveFinalMeasurements

最終的な計測と障壁を取り除くトランスパイラー・パス。 これは古典的なデータを削除するものではない。 これがあなたのゴールなら、そう呼べばいい:

from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import RemoveFinalMeasurements

qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.barrier()
qc.measure([0, 1], [0, 1])

pass_ = RemoveFinalMeasurements()
just_bell = pass_(qc)

パラメーター

inplace (bool) – すべての測定は、その場で削除するか、新しい回路を戻す。

戻り値

inplace=False の場合、結果の回路を返す。

戻りの型

QuantumCircuit


回路特性

シンプルな回路メトリクス

量子回路を構築する際、回路の "大きさ "やノイズの多い量子デバイス上で実行できる能力を定量化するのに役立ついくつかの特性がある。 これらの中には、量子ビット数のように簡単に理解できるものもあれば、深さやテンソル成分の数のようにもう少し説明が必要なものもある。 ここでは、これらの特性をすべて説明し、実際のデバイスで動作させたときに回路がどのように変化するかを理解するための準備として、それらが変化する条件を強調する。

次の回路を考えてみよう:

from qiskit import QuantumCircuit
qc = QuantumCircuit(12)
for idx in range(5):
   qc.h(idx)
   qc.cx(idx, idx+5)

qc.cx(1, 7)
qc.x(8)
qc.cx(1, 9)
qc.x(7)
qc.cx(1, 11)
qc.swap(6, 11)
qc.swap(6, 9)
qc.swap(6, 10)
qc.x(6)
qc.draw('mpl')
先のコードで出力された回路図。

プロットから、この回路が12個の量子ビットを持ち、ハダマード、CNOT、X、SWAPゲートの集合であることが容易にわかる。 しかし、これをプログラム的に数値化するにはどうすればいいのだろうか? すべての量子ビットに対して同時に単一量子ビットゲートを行うことができるので、この回路の量子ビット数は回路の width() に等しい:

assert qc.width() == 12

を使って直接量子ビット数を得ることもできる。 num_qubits:

assert qc.num_qubits == 12
重要

量子ビットだけで構成される量子回路の場合、回路の幅は量子ビットの数に等しい。 これは量子コンピューティングで使われる定義である。 しかし、古典的なレジスタと古典的に制御されたゲートを持つより複雑な回路では、この等価性は崩れる。 そのため、今後は量子回路の量子ビット数を幅とは呼ばないことにする。

また、回路内のゲートの数とタイプを取得するのも簡単だ。 count_ops():

qc.count_ops()
OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])

回路を計算することで、生の操作回数だけを得ることもできる。 size():

assert qc.size() == 19

count_ops

count_ops()

GitHub

回路内の各操作種類を数える。

戻り値

各種類の処理件数を、件数の多い順に並べた内訳。

戻りの型

OrderedDict [ 文字列, 整数 ]

depth

depth(filter_function=<function QuantumCircuit.<lambda>>)

GitHub

リターンサーキットの深さ(クリティカルパスの長さ)。

量子回路の深さとは、その回路で定義された計算を完了するために、量子ゲートを何層並列に実行すればよいかを示す尺度である。 量子ゲートの実装には時間がかかるため、回路の深さは量子コンピューターが回路を実行するのにかかる時間にほぼ対応する。

警告

この動作は、回路にコントロール・フロー動作が含まれている場合、うまく定義できない。

パラメーター

filter_function (Callable[[CircuitInstruction], bool]) – 深さを増やすためにどの命令をカウントするかを決定する関数。 単一の位置指定引数として受け取る必要があります CircuitInstruction。 関数が返す命令は、回路深度 False の計算において無視されます。 デフォルトでは、. Barrierなどの「ディレクティブ」を除外します。

戻り値

回路の深さ。

戻りの型

int

回路全体の深さを簡単に計算できる:

from qiskit.circuit import QuantumCircuit
qc = QuantumCircuit(4)
qc.h(0)
qc.cx(0, 1)
qc.h(2)
qc.cx(2, 3)
assert qc.depth() == 2

マルチクビットゲートの深さだけを計算するように、前の例を修正する:

assert qc.depth(lambda instr: len(instr.qubits) > 1) == 1

get_instructions

get_instructions(name)

GitHub

名前に一致する指示を得る。

パラメーター

name (str) – 取得するコマンドの名前。

戻り値

命令、qargs、cargs)のリスト。

戻りの型

リストタプル

num_connected_components

num_connected_components(unitary_only=False)

GitHub

この回路を因数分解すると、いくつの絡み合わない部分回路になるか。

パラメーター

unitary_only (bool) – グラフのユニタリー部分のみを計算する。

戻り値

回路に接続されている部品の数。

戻りの型

int

num_nonlocal_gates

num_nonlocal_gates()

GitHub

非局所ゲートの数を返す。

条件付き非局所ゲートも含まれる。

戻りの型

int

num_tensor_factors

num_tensor_factors()

GitHub

回路のユニタリー(量子)部分のみのテンソル因子の数を計算する。

ノード

これは後方互換性のためであり、Qiskitの将来のリリースでは削除される予定です。 代わりに num_unitary_factors を呼ぶべきである。

戻りの型

int

num_unitary_factors

num_unitary_factors()

GitHub

回路のユニタリー(量子)部分のみのテンソル因子の数を計算する。

戻りの型

int

size

size(filter_function=<function QuantumCircuit.<lambda>>)

GitHub

回路の総命令数を返します。

パラメーター

filter_function (callable) – いくつかの命令をフィルタリングする関数。 (Instruction、list(Qubit)、list(Clbit))のタプルを入力とする。 デフォルトでは、バリアやスナップショットのような「ディレクティブ」をフィルタリングする。

戻り値

ゲート操作の総数。

戻りの型

int

width

width()

GitHub

回路内の量子ビットと clbits の数を返す。

戻り値

回路の幅。

戻りの型

int

スケジュール情報のアクセス

もし QuantumCircuit がトランスパイルパイプラインの一部としてスケジューリングされている場合、個々の量子ビットのタイミング情報にアクセスすることができます。 回路全体のタイミング情報は estimate_duration() メソッドと op_start_times 属性によって取得できます。

estimate_duration

estimate_duration(target, unit='s')

GitHub

予定されたサーキットの所要時間を見積もる

この方法は、与えられたターゲットから提供された持続時間に基づいて回路内の最長持続時間パスを見つけることにより、回路持続時間の推定値を計算する。 この方法は、制御フローや他の古典的なフィードフォワード演算を持たない単純な回路にのみ有効である。

パラメーター

  • target (Target) – インスタンス Target もしターゲットに回路内のいずれかの命令の継続時間データがない場合、その命令の継続時間を含むインスタンス QiskitError が発生します。 これは、トランスピレーションのターゲットとして使用されるのと同じターゲット・オブジェクトでなければならない。
  • unit (str) – 継続時間を返す単位。 デフォルトは秒を表す "s "だが、秒を返すためのSI接頭辞を指定することもできる。 例えば、これを "n "に設定すると、ナノ秒単位で返される。 このタイプでサポートされている値は、"f"、"p"、"n"、"u"、"μ"、"m"、"k"、"M"、"G"、"T"、"P "である。 さらに、"dt "単位の整数を出力するために、"dt "の値も受け入れられる。 これを機能させるには、 target で "dt "を指定する必要がある。

戻り値

指定された単位の回路のシングルショットの実行にかかる推定時間。

レイズ

QiskitError - 回路がスケジューリングされていない場合、または(パラメータ化された遅延など)推定継続時間の計算を妨げる他の詳細が含まれている場合。

戻りの型

int | float

qubit_duration

qubit_duration(*qubits)

GitHub

与えられた量子ビットの、遅延を除いた最初と最後の命令の開始時刻と停止時刻の間の時間を返す。 時間単位は self.unit

パラメーター

*qubits ( Qubit | int ) – 量子ビット数 self 含める。

戻り値

非遅延命令の最初の開始時刻から最後の停止時刻までの時間を返す

戻りの型

浮動小数点

qubit_start_time

qubit_start_time(*qubits)

GitHub

与えられた量子ビットの、遅延を除いた最初の命令の開始時刻を返す。 時間単位は self.unit

量子ビットを超える命令がない場合は0を返す

パラメーター

  • * Qubits - self に含まれるキュービット。 量子ビットには整数を使用できる
  • self.qubits. (indices of)

戻り値

遅延を除いた最初の命令の開始時刻を量子ビット数で返す

レイズ

CircuitError - self がまだ予定されていない回線である場合。

戻りの型

浮動小数点

qubit_stop_time

qubit_stop_time(*qubits)

GitHub

与えられた量子ビットの、遅延を除いた最後の命令の停止時間を返す。 時間単位は self.unit

量子ビットを超える命令がない場合は0を返す

パラメーター

  • * Qubits - self に含まれるキュービット。 量子ビットには整数を使用できる
  • self.qubits. (indices of)

戻り値

遅延を除いた最後の命令の停止時間を、量子ビットに渡って返す

レイズ

CircuitError - self がまだ予定されていない回線である場合。

戻りの型

浮動小数点


抽象回路と物理回路

回路は、量子アルゴリズムのかなり低レベルの抽象化である。 しかし、その中にも違いは存在する。 量子プログラマーは、多くの場合、多種多様なゲートや命令を使用したいと考えており、すべての量子ビットが互いに相互作用する環境で作業を行う。 しかし、量子ハードウェアは通常、利用できるネイティブゲートが限られており、特定のペアのハードウェア量子ビット同士しか相互作用できない。 これら2つの仕組みを、それぞれ「抽象回路」と「物理回路」と呼ぶ。

Qiskitには、物理的な回路を区別する2つの方法があります。 これは歴史的な理由から、あいまいなチェックになっている。もともとQiskitはこの区別をまったくしていなかった(だから transpile() がそう呼ばれ、 compile! と呼ばれないのはそのためである)。 最も明確な方法は layout この属性がセットされている場合、回路は物理的であることを意図している。 より古い、より暗黙的な方法は、オブジェクトのメタデータである。 Qubit オブジェクトと QuantumRegister インスタンスのメタデータである。 この量子レジスタは q と呼ばれ、インデックス順にすべての回路の量子ビットを所有する。 繰り返しになるが、歴史的な理由から、これはデフォルトコンストラクタの QuantumCircuit(int [, int])

通常は QuantumCircuit を作成し、(量子ビットのメタデータに関係なく)抽象的な意味でそれを構築する。 次に transpile() を呼び出して回路をコンパイルし、ハードウェアがサポートする回路にする。 しかし、最初からハードウェア的に効率的な回路を書きたい場合には、コンパイル・インフラ全体をショートカットできる ensure_physical() メソッドを使用する。 これにより、初期量子ビットメタデータをどのように定義しても、回路が物理的であるとみなされるためのすべての要件が満たされ、量子ビットインデックスがハードウェア量子ビットにマッピングされることが保証されます。

仮想から物理へのマッピングと配線の選択をより完全に制御するには、プリセット・コンパイル・パイプラインのレイアウトと配線 <transpiler-preset-stage-routing> のステージを参照してください。

ensure_physical

ensure_physical(num_qubits=None, *, apply_layout=True)

GitHub

この回路を、与えられた量子ビット数で、正規の物理的な形にする。

いくつかのQiskitトランスパイラ・パスは、物理的量子ビットで定義された回路に適用した場合にのみ意味を持つ。 量子ビットインデックスが物理量子ビットに対応する回路を手動で構築した場合、この関数を使用して回路のメタデータが正規の物理形式と一致することを確認します。 これは、量子ビットデータを "q" と呼ばれる1つのレジスタに置き換えることを意味する。 layout フィールドを設定することである。

回路がまだレイアウトを持っていない場合、この方法( apply_layout=True )は、プリセット・コンパイル・パイプラインのフル・トリビアル・レイアウト法を適用するのと等価である。

回路がすでに正規の物理的なものであれば、何も起こらない。 このメソッドでは、回路内の量子ビットの数を変更することはできない。 layout セットを持っている場合、このメソッドは回路の量子ビット数を変更できない。

パラメーター

  • num_qubits (int | None) – もし与えられたら、このサイズまでアンシラで回路を拡張する。 アンシラは常に回路の最上位量子ビット・インデックスとなる。 もし与えなければ(デフォルト)、回路は同じ幅のままです。 このオプションは、回路がすでに layout.
  • apply_layout (bool) – もしtrue(デフォルト)なら layout 属性を適切に設定し、回路が幅 num_qubits のバックエンドに対して、アンシラ拡張を含む "trivial "レイアウトでレイアウトされたように見えるようにする。 これは、その回路がすでに. layout.

戻り値

回路が物理的に変更されたかどうか。

レイズ

  • ValueError - num_qubits が回路に対して小さすぎる場合。
  • CircuitError - num_qubits 、回路を拡張しようとするが、回路にはすでにレイアウトが設定されている場合。

戻りの型

bool


命令型メソッド

QuantumCircuit にも、ごく少数のメソッドが含まれている。 Instruction-のようなメソッドも含まれている。 最初に回路を Instruction (to_instruction())または Gate (to_gate())に変換し、対応するメソッドを呼び出せば、よりよい統合とより多くのAPIサポートが得られるかもしれません。

control

control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)

GitHub

この回路の管理バージョンを返す。

元の回路はゲートに変換され、結果として得られる回路にはこのゲートの制御版が含まれる。 この制御ゲートは、 Falseannotated の場合に ControlledGate として実装され、がの場合に AnnotatedOperationannotated として実装される True

2.3 以降非推奨

qiskit.circuit.quantumcircuit.QuantumCircuit.control()’の引数は、Qiskit 2.3annotated 以降で非推奨となっています。 Qiskit では削除されます。 3.0 QuantumCircuit.controlメソッドは、annotated=Noneを受け付けなくなりました。 新しいデフォルトはannotated=Trueです。これにより、新しい量子回路内の制御ゲートは AnnotatedOperation として表現されます(専用の制御ゲートクラスが既に存在しない場合)。 以前の動作を維持するには、明示的にannotated=Falseを設定できます。 ただし、annotated=Trueの使用が推奨されます。これにより制御回路の構築がトランスパイラに委ねられ、さらに追加の制御ゲート最適化が可能となるためです(通常、より高品質な回路につながります)。

パラメーター

  • num_ctrl_qubits (int) – 追加するコントロールの数。 デフォルトは1です。
  • label (str | None) – 可視化のために制御ゲートに付与するオプションのラベル。 デフォルトはNoneです。 制御ゲートがアノテーション付き操作として実装されている場合は無視される。
  • ctrl_state (str |int | None) – ゲートの制御状態。整数またはビット列(例: "110")として指定される。 デフォルトでは None、全ビットが1の状態になります 2**num_ctrl_qubits - 1
  • annotated (bool | None) – 制御ゲートを制御ゲートとして実装するか、注釈付き操作として実装するかを示します。

戻り値

この回路の制御バージョン。

戻りの型

QuantumCircuit

レイズ

CircuitError - 回路に非単位動作が含まれ、制御できない場合。

inverse

inverse(annotated=False)

GitHub

この回路を反転させる。

これは、すべてのゲートを再帰的に反転させることによって行われる。

パラメーター

annotated (bool) – は、逆ゲートが注釈付きゲートとして実装できるかどうかを示す。

戻り値

反転回路

戻りの型

QuantumCircuit

レイズ

CircuitError - 回路が反転できない場合

を入力する:

     ┌───┐
q_0: ┤ H ├─────■──────
     └───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
          └──────────┘

出力:

                  ┌───┐
q_0: ──────■──────┤ H ├
     ┌─────┴─────┐└───┘
q_1: ┤ RX(-1.57) ├─────
     └───────────┘

power

power(power, matrix_power=False, annotated=False)

GitHub

この回路を power のべき乗にする。

power が正の整数で、 matrix_powerannotated の両方が False の場合、この実装ではデフォルトで repeat を呼び出す。 そうでない場合は、回路はゲートに変換され、このゲートを所定のべき乗に引き上げた新しい回路が返される。 与えられたべき乗に引き上げられたゲートは、 annotatedFalse の場合はユニタリーゲートとして、 annotatedTrue の場合は注釈付き演算として実装される。

パラメーター

  • power (float) – この回路を引き上げる力。
  • matrix_power (bool) – は、内部パワーゲートがユニタリーゲートとして実装可能かどうかを示す。
  • annotated (bool) – は、内側のパワーゲートが注釈付き操作として実装できるかどうかを示す。

レイズ

CircuitError - 回路をユニタリーゲートに変換する必要があるが、ユニタリーでない場合。

戻り値

この回路を実装した回路は、 power のべき乗になる。

戻りの型

QuantumCircuit

repeat

repeat(reps, *, insert_barriers=False)

GitHub

reps 回繰り返す。

パラメーター

  • reps (int) – この回路を何回繰り返すべきか。
  • insert_barriers (bool) – サーキットの反復の間にバリアを入れるかどうか。

戻り値

reps この回路の繰り返しを含む回路。

戻りの型

QuantumCircuit

reverse_ops

reverse_ops()

GitHub

指示の順序を逆にして回路を反転させる。

これは、すべての命令を再帰的に反転させることによって行われる。 ゲートを反転(アジョイント)することはない。

戻り値

逆回路。

戻りの型

QuantumCircuit

を入力する:

     ┌───┐
q_0: ┤ H ├─────■──────
     └───┘┌────┴─────┐
q_1: ─────┤ RX(1.57) ├
          └──────────┘

出力:

                 ┌───┐
q_0: ─────■──────┤ H ├
     ┌────┴─────┐└───┘
q_1: ┤ RX(1.57) ├─────
     └──────────┘

視覚化

Qiskitには、回路がどのように見えるかを手早く感じるための描画ツールがいくつか含まれています。 このツールは、主に Matplotlib - またはテキストベースの図面を作成することを主な対象としています。 また、 LaTeX のバックエンドもあるが、これは単純な回路を描くためのもので、あまり活発にメンテナンスされていない。

関連資料

qiskit.visualization

Qiskitのすべての視覚化ツールの主要ドキュメント。

draw

draw(output=None, scale=None, filename=None, style=None, interactive=False, plot_barriers=True, reverse_bits=None, justify=None, vertical_compression='medium', idle_wires=None, with_layout=True, fold=None, ax=None, initial_state=False, cregbundle=None, wire_order=None, expr_len=30, measure_arrows=None, barrier_label_len=16)

GitHub

量子回路を描く。 出力パラメータを使用して、描画形式を選択します:

text

コンソールで表示できるASCIIアート TextDrawing。

mpl

matplotlibを使用して Python のみで色を表現した画像。

latex

LaTeX を通じて収集された高品質な画像。

警告

これは設計上、任意のユーザー入力 pdflatex に対してインストール済みのシステム版を呼び出すことになっています(例:でカスタムコードを Instruction.labelレンダリングする場合など)。したがって、信頼できる入力に対してのみ使用してください。

latex_source

LaTeX の未コンパイルの生出力。 これは、描画 latex プログラムによって描画される内容のソースです。

警告

条件と Expr コンディションと SwitchCaseOp.target フィールドのノードのサポートは予備的なものであり、不完全なものである。 textmpl のドロワーは、データの依存関係を表示するために最善の努力をするが、 LaTeX-based のドロワーは、これらの依存関係を完全にスキップする。

パラメーター

  • output (str | None) – 回路の描画に使用する出力方法を選択します。 有効な選択肢は text, mpl, latex, latex_source です。デフォルトでは、ユーザー設定ファイル(通常は ~/.qiskit/settings.conf )に代替バックエンドがデフォルトとして設定されていない限り、 text ドロワーが使用されます。 例えば、circuit_drawer = latex です。 出力kwargが設定されている場合、ユーザー設定ファイルのデフォルトよりも、そのバックエンドが常に使用される。

  • scale (float | None) – 描画する画像のスケール( < 1.0 の場合は縮小)。 mpllatexlatex_source 出力でのみ使用される。 デフォルトは 1.0

  • filename (str | None) – 画像を保存するファイルパス。 デフォルトは None (結果はファイルに保存されない)。

  • style (dict |str | None) –

    スタイル名、スタイルJSONファイルのファイル名、またはスタイルを指定する辞書。

    • 対応するスタイル名は "iqp" (デフォルト)、 "iqp-dark""clifford""textbook""bw"
    • JSONファイルが与えられた場合、例えば my_style.json または my_style (拡張子 .json は省略可)、この関数はその場所からスタイル辞書の読み込みを試みます。 JSONファイルは、視覚化の仕様を完全に指定しなければならないことに注意してください。 ファイルは qiskit/visualization/circuit/styles、現在の作業ディレクトリ、および ~/.qiskit/settings.conf で指定された場所で検索される。
    • 辞書が指定されている場合、各エントリはデフォルトの設定を上書きします。 キー "name" が指定された場合、そのスタイルに基づいてデフォルトの設定が適用されます。 たとえば、スタイル {"name": "textbook", "subfontsize": 5}``"textbook" を読み込み、サブフォントサイズ(ゲートの角度など)を に設定します 5
    • None の場合はデフォルトのスタイル "iqp" が使用され、指定された場合は ~/.qiskit/settings.conf で指定されたデフォルトのスタイルが使用されます。
  • interactive (bool) – True に設定すると、回路を新しいウィンドウで表示します( の場合、これは使用している matplotlib バックエンドがサポートしているかどうかに依存します)。 mpl textまたは latex_source 出力タイプで使用された場合、これは何の効果もなく、静かに無視されることに注意。 デフォルトは False

  • reverse_bits (bool | None) – True に設定すると、出力可視化のためにレジスタ内のビット順序を逆にする。 ユーザー設定ファイル(通常は ~/.qiskit/settings.conf )に別の値が設定されていない限り、デフォルトは False です。 例えば、circuit_reverse_bits = Trueです。

  • plot_barriers (bool) – 出力回路の描画バリアを有効/無効にする。 デフォルトはTrueです。

  • justify (str | None) – オプションは "left""right""none" (str)。 それ以外が指定された場合は、左寄せが代わりに使われる。 オプションがある場合、出力回路のどこにゲートを配置すべきかを指す。 none その結果、各ゲートはそれぞれの列に配置される。 デフォルトは left

  • vertical_compression (str | None) – high medium または。 low テキスト出力によって生成された線を統合するので、描画の縦方向のスペースが小さくなる。 デフォルトは mediumtext 出力でのみ使用され、それ以外は無視される。

  • idle_wires (bool |str | None) – 出力の可視化に、未使用の配線(回路要素のない配線)を含めるか(含めないか)。 文字列 "auto" も可能です。この場合、回路にレイアウトが添付されていない限り、未使用の配線が表示されます。 ユーザー設定ファイル(通常は ~/.qiskit/settings.conf)に別の値が設定されていない限り、デフォルト "auto" は です。 例えば、circuit_idle_wires = Falseです。

  • with_layout (bool) – 物理的なレイアウトにラベルを貼り、レイアウト情報を含める。 デフォルトはTrueです。

  • fold (int | None) – ページネーションを設定する。 -1 を使って無効にすることができる。 text では、線の長さを設定する。 これは、図面がコンソールに収まらない場合に便利である。 None (デフォルト) の場合、 shutil.get_terminal_size() を使ってコンソールの幅を推測しようとします。 ただし、jupyterで実行する場合、デフォルトの行の長さは80文字に設定されている。 mpl では、折りたたむ前の(視覚的な)レイヤーの数である。 デフォルトは25。

  • ax (Any | None) – mplバックエンドのみで使用されます。 可視化出力に使用するオプションの matplotlib.axes.Axes オブジェクト。 指定がない場合、新しいmatplotlib Figureが作成され使用されます。 また、指定された場合、冗長であるため図は返されません。

  • initial_state (bool) – 量子ビットワイヤーの先頭に 0|0\rangle、古典的なワイヤーに 00。 デフォルトはFalseです。

  • cregbundle (bool | None) – True に設定すると、古典的なレジスタを束ねる。 output"text" に設定されている場合を除き、デフォルトは True である。

  • wire_order (list[int] | None) – ビットの表示の順番を変更するための整数のリスト。 このリストには、0から(num_qubits + num_clbits)までの範囲のビットを持つ、各ビットのエントリーがなければならない。

  • expr_len (int) – の条件に Expr の条件に ControlFlowOp. この数を超えると、文字列はその数で切り捨てられ、末尾に「...」が追加される。

  • measure_arrows (bool | None) – 「True」の場合、各小節ボックスから、小節値が配置されているクラシックビットまたはレジスタまで矢印を描画します。 Falseの場合、矢印は描画せず、代わりに小節枠にビットまたはレジスタの名前を表示します。 ユーザー設定ファイル(通常は ~/.qiskit/settings.conf)に別の値が設定されていない限り、デフォルト True は です。 例えば、circuit_measure_arrows = False などです。

  • barrier_label_len (int) – 出力回路でラベル Barrier として表示する文字数。 この文字数を超えた場合、文字列はその文字数で切り詰められ、末尾に「…」が追加されます。

戻り値

TextDrawing または matplotlib.figure または PIL.Image または str:

  • TextDrawing (if output='text')

    アスキーアートとして印刷できるドローイング。

  • matplotlib.figure.Figure (if output='mpl')

    回路図の matplotlib figure オブジェクト。

  • PIL.Image (if output='latex')

    回路図のイメージのメモリ内表現。

  • str (if output='latex_source')

    回路図を視覚化するための LaTeX のソースコード。

レイズ

  • VisualizationError - 無効な出力方法が選択された場合
  • ImportError - 出力メソッドがインストールされていないライブラリを必要とする場合。

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0)
qc.draw(output='mpl', style={'backgroundcolor': '#EEEEEE'})
先のコードで出力された回路図。

コア draw() ドライバに加えて、2つの視覚化関連のヘルパーメソッドがあります。これらは主に、いくつかの内部命令を素早くアンラップしたり、描画中の量子ビットのラベル付け規則を逆にしたりするのに便利です。 基底ゲートの書き換えを含む、より一般的な変異については、トランスパイラ(qiskit.transpiler).

decompose

decompose(gates_to_decompose=None, reps=1)

GitHub

この回路で分解パスを呼び出し、1レベルを分解する(浅い分解)。

パラメーター

  • gates_to_decompose (str |type[Instruction] | Sequence[str |type[Instruction]] | None) – 分解対象とするゲートの任意の部分集合。 ゲートタイプ(例 HGate:)や、ゲート名(例:「h」)、ゲートラベル(例:「My H Gate」)、あるいはこれらを任意に組み合わせたリストを指定できます。 ゲート名が入力された場合、その名前のゲートは、ラベルの有無にかかわらずすべて展開されます。 デフォルトでは、回路内のすべてのゲートが対象となります。
  • reps (int) – 回路を分解する回数は任意である。 例えば、 reps=2 は、 circuit.decompose().decompose() を呼び出すことに等しい。

戻り値

1レベル分解回路

戻りの型

QuantumCircuit

reverse_bits

reverse_bits()

GitHub

配線の順序を逆にした回路を返す。

回路は "垂直に "反転している。 回路が複数のレジスタにわたって定義されている場合、結果として得られる回路は同じレジスタを持つが、その順序は反転する。

この方法は、リトルエンディアンで書かれた回路をビッグエンディアンと等価なものに変換するのに便利である。

戻り値

ビットの順序を逆にした回路。

戻りの型

QuantumCircuit

を入力する:

     ┌───┐
a_0: ┤ H ├──■─────────────────
     └───┘┌─┴─┐
a_1: ─────┤ X ├──■────────────
          └───┘┌─┴─┐
a_2: ──────────┤ X ├──■───────
               └───┘┌─┴─┐
b_0: ───────────────┤ X ├──■──
                    └───┘┌─┴─┐
b_1: ────────────────────┤ X ├
                         └───┘

出力:

                         ┌───┐
b_0: ────────────────────┤ X ├
                    ┌───┐└─┬─┘
b_1: ───────────────┤ X ├──■──
               ┌───┐└─┬─┘
a_0: ──────────┤ X ├──■───────
          ┌───┐└─┬─┘
a_1: ─────┤ X ├──■────────────
     ┌───┐└─┬─┘
a_2: ┤ H ├──■─────────────────
     └───┘

パラメーター

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