回路ライブラリー
このページのコードは、以下の要件に基づいて開発された。 これらのバージョンまたは新しいバージョンの使用をお勧めします。
qiskit[all]~=2.5.1
Qiskit SDKには、独自のプログラムのビルディングブロックとして使用する一般的な回路のライブラリが含まれています。 あらかじめ定義された回路を使うことで、調査、コード作成、デバッグの時間を節約できる。 このライブラリには、量子コンピューティングでよく使われる回路や、古典的なシミュレーションが困難な回路、量子ハードウェアのベンチマークに役立つ回路などが含まれている。
このページでは、ライブラリが提供するさまざまな回路カテゴリを一覧表示します。 回路の全リストについては、 回路ライブラリAPIドキュメントを参照のこと。
標準ゲート
回路ライブラリには、標準的な量子ゲートも含まれている。 より基本的なゲート(例えば UGate )もあれば、通常は1量子ビットゲートや2量子ビットゲートから構築する必要がある多量子ビットゲートもある。 インポートされたゲートを回路に追加するには、 append メソッドを使います。最初の引数はゲートで、次の引数はゲートを適用する量子ビットのリストです。
例えば、次のコード・セルは、ハダマード・ゲートとマルチ制御Xゲートを持つ回路を作成する。
from qiskit import QuantumCircuit
from qiskit.circuit.library import HGate, MCXGate
mcx_gate = MCXGate(3)
hadamard_gate = HGate()
qc = QuantumCircuit(4)
qc.append(hadamard_gate, [0])
qc.append(mcx_gate, [0, 1, 2, 3])
qc.draw("mpl")Output:
回路ライブラリAPIドキュメントの標準ゲートを参照。
N-局所回路
これらの回路は、1量子ビットの回転ゲートと多量子ビットのもつれゲートを交互に重ねている。
この回路群は、さまざまな量子状態を作り出すことができるため、変分量子アルゴリズムでよく使われている。 変分アルゴリズムは、特定の特性(最適化問題の良い解を示す状態など)を持つ状態を見つけるために、ゲートのパラメーターを調整する。 この目的のために、ライブラリ内の多くの回路はパラメータ化されており、固定値なしで定義できる。
次のコードセルは、 n_local 回路をインポートしたもので、エンタングルゲートは2量子ビットゲートである。 この回路は、パラメータ化された1量子ビットゲートのブロックをインターリーブし、その後に2量子ビットゲートのブロックをエンタングルする。 次のコードは、1量子RXゲートと2量子CZゲートを持つ3量子ビット回路を作成する。
from qiskit.circuit.library import n_local
two_local = n_local(3, "rx", "cz")
two_local.draw("mpl")Output:
parameters アトリビュートから、回路のパラメーターのリストのようなオブジェクトを得ることができる。
two_local.parametersOutput:
ParameterView([ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]), ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]), ParameterVectorElement(θ[11])])
また、 { Parameter: number } という形式の辞書を使って、これらのパラメータを実際の値に割り当てることもできる。 次のコード・セルでは、回路の各パラメータを 0 に割り当てている。
bound_circuit = two_local.assign_parameters(
{p: 0 for p in two_local.parameters}
)
bound_circuit.decompose().draw("mpl")Output:
詳細については、回路ライブラリAPIドキュメントの N-local gatesを参照するか、 IBM Quantum Learningの Variational algorithm designコースを受講してほしい。
データ符号化回路
これらのパラメータ化された回路は、量子機械学習アルゴリズムによって処理される量子状態にデータをエンコードする。 Qiskitがサポートする回路には次のようなものがある:
- 振幅エンコーディング:各数値を基底状態の振幅にエンコードする。 これは、 番号を1つのステートに格納することができるが、実装にはコストがかかる。
- 対応する基底状態 を用意することで、整数 を符号化する基底符号化。
- 角度エンコーディング。データ内の各数値を回転角度としてパラメータ化された回路に設定する。
最適なアプローチは、アプリケーションの仕様によって異なります。 しかし、現在の量子コンピュータでは、 zz_feature_map のような角度エンコード回路を使うことが多い。
from qiskit.circuit.library import zz_feature_map
features = [0.2, 0.4, 0.8]
feature_map = zz_feature_map(feature_dimension=len(features))
encoded = feature_map.assign_parameters(features)
encoded.draw("mpl")Output:
回路ライブラリAPIドキュメントのデータ符号化回路を参照のこと。
時間発展回路
これらの回路は、時間的に進化する量子状態をシミュレートする。 時間発展回路を使用して、系の熱伝導や相転移などの物理的効果を調べる。 時間発展回路は、化学の波動関数(ユニタリー・クラスター結合試行状態など)や、最適化問題に用いるQAOAアルゴリズムの基本的な構成要素でもある。
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.circuit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
# Prepare an initial state with a Hadamard on the middle qubit
state = QuantumCircuit(3)
state.h(1)
hamiltonian = SparsePauliOp(["ZZI", "IZZ"])
evolution = PauliEvolutionGate(hamiltonian, time=1)
# Evolve state by appending the evolution gate
state.compose(evolution, inplace=True)
state.draw("mpl")Output:
PauliEvolutionGate API ドキュメントを読む。
ベンチマーキングと複雑性理論回路
ベンチマーク回路は、私たちのハードウェアが実際にどの程度動作しているのかを感じさせてくれるし、複雑性理論回路は、私たちが解決したい問題がどの程度難しいのかを理解するのに役立つ。
例えば、「量子ボリューム」ベンチマークは、量子コンピューターが一種のランダム量子回路をどれだけ正確に実行できるかを測定する。 量子コンピュータのスコアは、確実に実行できる回路のサイズが大きくなるほど高くなる。 これは、量子ビット数、命令の忠実度、量子ビットの接続性、ソフトウェアスタックのトランスパイルと後処理結果など、コンピュータのあらゆる側面を考慮したものである。 量子体積については、 量子体積の原著論文をお読みください。
次のコードは、Qiskitで作られた4量子ビットで動作する量子体積回路の例である( unitary ブロックはランダム化された2量子ビットゲート)。
from qiskit.circuit.library import quantum_volume
quantum_volume(4).draw("mpl")Output:
この回路ライブラリには、瞬間量子多項式(iqp)回路など、古典的なシミュレーションが難しいとされる回路も含まれている。 これらの回路は、ハダマードゲートのブロックの間に(計算基底の)ある対角ゲートを挟んでいる。
その他の回路としては、グローバーのアルゴリズムで使われる grover_operator 、フーリエ検査問題用の fourier_checking 。 これらの回路については、回路ライブラリAPIドキュメントの Particular quantum circuitsを参照のこと。
算術回路
算術演算は、整数の加算やビット単位の演算など、古典的な関数である。 これらは、金融アプリケーションの振幅推定などのアルゴリズムや、線形連立方程式を解くHHLアルゴリズムのようなアルゴリズムで有用である。
例として、インプレース加算(FullAdderGate)を行う「リップル・キャリー」回路を使って、2つの3ビッ ト数を加算してみよう。この加算器は、2つの数値(ここでは "A "と "B "と呼ぶ)を加算し、結果をBを保持するレジスタに書き込む。 以下の例では、 A=2 と B=3。
from qiskit.circuit.library import FullAdderGate
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
adder = FullAdderGate(3) # Adder of 3-bit numbers
# Create the number A=2
reg_a = QuantumRegister(3, "a")
number_a = QuantumCircuit(reg_a)
number_a.initialize(2) # Number 2; |010>
# Create the number B=3
reg_b = QuantumRegister(3, "b")
number_b = QuantumCircuit(reg_b)
number_b.initialize(3) # Number 3; |011>
# Create a circuit to hold everything, including a classical register for
# the result
qregs = [
QuantumRegister(1, "cin"),
QuantumRegister(3, "a"),
QuantumRegister(3, "b"),
QuantumRegister(1, "cout"),
]
reg_result = ClassicalRegister(3)
circuit = QuantumCircuit(*qregs, reg_result)
# Compose number initializers with the adder. Adder stores the result to
# register B, so we'll measure those qubits.
circuit = (
circuit.compose(number_a, qubits=reg_a)
.compose(number_b, qubits=reg_b)
.compose(adder)
)
circuit.measure(reg_b, reg_result)
circuit.draw("mpl")Output:
回路をシミュレートすると、すべての 1024 ショットに対して 5 を出力する(すなわち、確率 1.0 で測定される)ことがわかる。
from qiskit.primitives import StatevectorSampler
result = StatevectorSampler().run([circuit]).result()
print(f"Count data:\n {result[0].data.c0.get_int_counts()}")Output:
Count data:
{5: 1024}
回路ライブラリAPIドキュメントの算術演算を参照のこと。
次のステップ
- 「 Construct回路 」のトピックで、回路を作成するための高度な手法を学びましょう。
- Grover's Algorithmのチュートリアルで使用されている回路の例をご覧ください。
- 回路ライブラリAPI リファレンスを確認する。