IBM Quantum Developer サンプル問題(全20問)の日本語訳と解説

IBM Quantum Developer(正式名称 IBM Certified Associate Developer - Quantum Computation using Qiskit v0.2X)」はオープンソースの量子計算ライブラリQiskitを用いて量子計算を行う技術をはかる資格試験です。

www.ibm.com

上記ページにはSample Testとしてサンプル問題(全20問)が公開されており、実際にどのような問題が出題されるかを知ることができます(上記ページ内のリンクからにPDFがダウンロードできます)。

Sample Testには解答がついていますが、解説の類はないので、初学者にはハードルの高いものとなっています。

この記事では、Sample Test全問題の日本語訳とその解説を公開するので、学習にご活用ください。

※ 実際の試験には日本語訳はなく、全て英語であることに注意。

問題1

1. Which statement will create a quantum circuit with four quantum bits and four classical bits?

A. QuantumCircuit(4, 4)

B. QuantumCircuit(4)

C. QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(4, 'cr1'))

D. QuantumCircuit([4, 4])

日本語訳

次のうち、4つの量子ビットと4つの古典ビットからなる量子回路を生成するものはどれか。

A. QuantumCircuit(4, 4)

B. QuantumCircuit(4)

C. QuantumCircuit(QuantumRegister(4, 'qr0'), QuantumRegister(4, 'cr1'))

D. QuantumCircuit([4, 4])

解答・解説

回路を表すQuantumCircuitオブジェクトの正しい初期化方法を選ぶ問題。

Qiskitで回路を生成するには、コンストラクタにレジスタを指定する方法と、ビット数を直接指定する方法がある。

Aは正しい。QuantumCircuit(整数, 整数)とすると、それぞれ指定した数の量子ビットと古典ビットからなる回路を生成できる。選択肢のコードでは量子ビット4つ、古典ビット4つを指定したことになり、目的の回路が生成される。

Bは誤り。QuantumCircuit(整数)のように整数を1つだけ指定した場合、量子ビットのみからなる回路が生成される。選択肢のコードでは、4つの量子ビットのみからなる回路が生成され、目的の回路とならない。

Cは誤り。QuantumCircuit(Register, ..., Register)のように任意の数のRegisterオブジェクトを指定すると、それらで構成される回路が生成される。QuantumRegisterRegisterのサブクラスで量子レジスタを表す。QuantumRegister(整数, 文字列)とすると指定された数の量子ビットからなる量子レジスタを、指定された名前で生成するので、選択肢のQuantumRegister(4, 'qr0')qr0という名前のサイズ4の量子レジスタを、QuantumRegister(4, 'cr1')cr1という名前のサイズ4の量子レジスタをそれぞれ生成している。以上から、選択肢のコードはサイズ4の量子レジスタ2つからなる回路となり、目的の回路とならない。

Dは誤り。QuantumCiruit(整数のリスト)のように指定することはできない。選択肢のコードを実行するとCircuitErrorが発生する。なお、どうしてもリストを使いたい場合はQuantumCircuit(*[4, 4])のようにアンパックすればよい。

回路の初期化については以下記事を参照。

happy-quantum.hateblo.jp

答え:A

問題2

2. Given this code fragment, what is the probability that a measurement would result in |0> ?

qc = QuantumCircuit(1)

qc.ry(3 * math.pi/4, 0)

A. 0.8536

B. 0.5

C. 0.1464

D. 1.0

日本語訳

以下のコードにおいて、測定結果が |0\rangle となる確率はどれか。

 qc = QuantumCircuit(1)
 qc.ry(3 * math.pi/4, 0)

A. 0.8536

B. 0.5

C. 0.1464

D. 1.0

解答・解説

問題文の状態を |\psi\rangleとすると、状態 |\psi\rangleを状態 |0\rangleで測定する確率は |\langle0|\psi\rangle|^2で計算できる。

QuantumCircuitは全てのビットが |0\rangleで初期化されるため、

 |\psi\rangle = R_y\left(\frac34\pi\right) |0\rangle = \begin{pmatrix} \cos\frac38\pi & -\sin\frac38\pi \\ \sin\frac38\pi & \cos\frac38\pi \end{pmatrix}\begin{pmatrix} 1 \\ 0\end{pmatrix} = \cos\frac38\pi|0\rangle + \sin\frac38\pi|1\rangle

よって、目的の確率は

 |\langle0|\psi\rangle|^2 = \left| \cos\frac38\pi\right|^2 = \frac{1 + \cos\frac34\pi}2 = \frac{2-\sqrt{2}}4 = \frac{0.5857864}4 = 0.146447

https://qiskit.org/textbook/ch-states/representing-qubit-states.html

答え:C

問題3

3. Assuming the fragment below, which three code fragments would produce the circuit illustrated?

inp_reg = QuantumRegister(2, name='inp')

ancilla = QuantumRegister(1, name='anc')

qc = QuantumCircuit(inp_reg, ancilla)

# Insert code here

A. qc.h(inp_reg)

qc.x(ancilla)

qc.draw()

B. qc.h(inp_reg[0:2])

qc.x(ancilla[0])

qc.draw()

C. qc.h(inp_reg[0:1])

qc.x(ancilla[0])

qc.draw()

D. qc.h(inp_reg[0])

qc.h(inp_reg[1])

qc.x(ancilla[0])

qc.draw()

E. qc.h(inp_reg[1])

qc.h(inp_reg[2])

qc.x(ancilla[1])

qc.draw()

F. qc.h(inp_reg)

qc.h(inp_reg)

qc.x(ancilla)

qc.draw()

日本語訳

以下のコードがあるとき、図示された回路を生成する3つのコードはどれか。

inp_reg = QuantumRegister(2, name='inp')
ancilla = QuantumRegister(1, name='anc')
qc = QuantumCircuit(inp_reg, ancilla)
# ここにコードを挿入

A.

qc.h(inp_reg)
qc.x(ancilla)
qc.draw()

B.

qc.h(inp_reg[0:2])
qc.x(ancilla[0])
qc.draw()

C.

qc.h(inp_reg[0:1])
qc.x(ancilla[0])
qc.draw()

D.

qc.h(inp_reg[0])
qc.h(inp_reg[1])
qc.x(ancilla[0])
qc.draw()

E.

qc.h(inp_reg[1])
qc.h(inp_reg[2])
qc.x(ancilla[1])
qc.draw()

F.

qc.h(inp_reg)
qc.h(inp_reg)
qc.x(ancilla)
qc.draw()

解答・解説

回路に1量子ビットゲートであるアダマールゲート( Hゲート)と Xゲートを作用させる正しい方法を選ぶ問題。

Aは正しい。1量子ビットゲートを作用させるメソッドの引数にQuantumRegisterオブジェクトを指定した場合、その量子レジスタを構成する全量子ビットにそれぞれゲートが追加される。 レジスタについては以下の記事を参照。 happy-quantum.hateblo.jp

Bは正しい。引数にQubitオブジェクトのリストを指定した場合、各量子ビットにゲートが追加される。また、QuantumRegisterオブジェクトにスライスを作用させると、それを構成するQubitオブジェクトのリストを取得できる。

Cは誤り。Bと同様にQubitのリストを指定しているが、qc.h(inp_reg[0:1])としているので Hが追加されるのは inp_0だけとなり、 inp_1 Hゲートが作用しないことになる。

Dは正しい。Qubitオブジェクトで指定しており、目的の回路となっている。

Eは誤り。2行目で範囲外のインデックス指定しているのでIndexErrorが発生する。

Fは誤り。 inp_0 inp_1 Hが2つずつ作用してしまうことになる。

答え:A, B, D

https://qiskit.org/textbook/ja/ch-appendix/qiskit.html https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.h.html#qiskit.circuit.QuantumCircuit.h https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.x.html#qiskit.circuit.QuantumCircuit.x

問題4

4. Given an empty QuantumCircuit object, qc, with three qubits and three classical bits, which one of these code fragments would create this circuit? A. qc.measure([0,1,2], [0,1,2])

B. qc.measure([0,0], [1,1], [2,2])

C. qc.measure_all()

D. qc.measure(0,1,2)

日本語訳

3つの量子ビットと3つの古典ビットからなる空のQuantumCircuitオブジェクトがあるとき、以下の回路を生成するコードはどれか。

A. qc.measure([0,1,2], [0,1,2])

B. qc.measure([0,0], [1,1], [2,2])

C. qc.measure_all()

D. qc.measure(0,1,2)

解答・解説

回路に測定を適用する正しい方法を選ぶ問題。

測定については以下の記事を参照。 happy-quantum.hateblo.jp

Aは正しい。QuantumCircuitオブジェクトqcに測定を追加するには、測定する量子ビットと測定結果を格納する古典ビットをqc.measure(量子ビット, 古典ビット)のように指定する。ここで、量子ビット古典ビットはそれぞれ整数のリストでインデックスによる指定が可能。選択肢のコードは正しくこれを指定している。

B、Dは誤り。measureメソッドの引数は2つでなければならないところ、3つを指定しているのでTypeErrorとなる。

Cは誤り。measure_allメソッドは回路の全量子ビットに測定を適用するが、デフォルトでは測定結果を書き込む古典ビットを新たに追加する。よって、選択肢のコードでは以下の図のような回路になる。すでに回路にある古典ビットに書き込むようにするには、qc.measure_all(add_bits=False)のようにしなければならない。

答え:A

問題5

5. Which code fragment will produce a maximally entangled, or Bell, state?

A. bell = QuantumCircuit(2)

bell.h(0)

bell.x(1)

bell.cx(0, 1)

B. bell = QuantumCircuit(2)

bell.cx(0, 1)

bell.h(0)

bell.x(1)

C. bell = QuantumCircuit(2)

bell.h(0)

bell.x(1)

bell.cz(0, 1)

D. bell = QuantumCircuit(2)

bell.h(0)

bell.h(0)

日本語訳

以下のコードのうち、エンタングルメントが最大の状態、またはベル状態を生成するものはどれか。

A.

bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cx(0, 1)

B.

bell = QuantumCircuit(2)
bell.cx(0, 1)
bell.h(0)
bell.x(1)

C.

bell = QuantumCircuit(2)
bell.h(0)
bell.x(1)
bell.cz(0, 1)

D.

bell = QuantumCircuit(2)
bell.h(0)
bell.h(0)

解答・解説

Aは正しい。1量子ビットに対しては  H|0\rangle = |+\rangle, X|0\rangle=|1\rangle となるので、選択肢の状態は  CNOTX_1H_0|00\rangle = CNOTX_1|0+\rangle = CNOT|1+\rangle=\frac1{\sqrt{2}}CNOT(|10\rangle+|11\rangle)=\frac1{\sqrt2}(|10\rangle + |01\rangle) となり、これはベル状態の一つ。

Bは誤り。選択肢の状態は  X_1H_0CNOT|00\rangle = X_1H_0|00\rangle = X_1|0+\rangle = |1+\rangle となるが、これはベル状態ではない。

Cは誤り。選択肢の状態は  CZX_1H_0|00\rangle = CZX_1|0+\rangle = CZ|1+\rangle = \frac1{\sqrt2}(|10\rangle - |11\rangle) = |1-\rangle となるが、これはベル状態ではない。

Dは誤り。選択肢の状態は  H_0H_0|00\rangle = H_0|0+\rangle = |00\rangle となるが、これはベル状態ではない。

https://qiskit.org/textbook/ja/ch-gates/multiple-qubits-entangled-states.html

答え:A

問題6

6. Given this code, which two inserted code fragments result in the state vector represented by this Bloch sphere?

qc = QuantumCircuit(1,1)

# Insert code fragment here

simulator = Aer.get_backend('statevector_simulator')

job = execute(qc, simulator)

result = job.result()

outputstate = result.get_statevector(qc)

plot_bloch_multivector(outputstate)

A. qc.h(0)

B. qc.rx(math.pi / 2, 0)

C. qc.ry(math.pi / 2, 0)

D. qc.rx(math.pi / 2, 0)

qc.rz(-math.pi / 2, 0)

E. qc.ry(math.pi, 0)

日本語訳

以下のコードがあるとき、以下のブロッホ球により表される状態ベクトルを生成するために挿入すべきコード2つはどれか。

qc = QuantumCircuit(1,1)
# ここにコードを挿入
simulator = Aer.get_backend('statevector_simulator')
job = execute(qc, simulator)
result = job.result()
outputstate = result.get_statevector(qc)
plot_bloch_multivector(outputstate)

A.

qc.h(0)

B.

qc.rx(math.pi / 2, 0)

C.

qc.ry(math.pi / 2, 0)

D.

qc.rx(math.pi / 2, 0)
qc.rz(-math.pi / 2, 0)

E.

qc.ry(math.pi, 0)

解答・解説

図の状態は |+\rangleなので、 |+\rangleになるコードを選ぶ。

なお、statevector_simulatorについては以下の記事を参照。

happy-quantum.hateblo.jp

Aは正しい。 H|0\rangle = |+\rangleとなるため。

Bは誤り。B~Eは式で考えることもできるが、図で考えるとわかりやすい。 R_x(\pi/2) x軸に対して右ねじの向きに \pi/2 = 90^\circだけ回転させるので、 y軸のマイナス方向の |-_y\rangleとなる。

Cは正しい。上と同様に図で考えると、 R_y(\pi/2) y軸に対して右ねじの向きに \pi/2だけ回転させるので、 x軸のプラス方向である |+\rangleとなる。

Dは誤り。 x軸に対して \pi/2回転させたあと、 z軸に対して \pi/2回転させた結果、 x軸のマイナス方向である |-\rangleとなる。

Eは誤り。 y軸に対して \piだけ回転させるので、 z軸のマイナス方向である |1\rangleとなる。

答え:A, C

問題7

7. S-gate is a Qiskit phase gate with what value of the phase parameter?

A. π/4

B. π/2

C. π/8

D. π

日本語訳

Sゲートとはいかなる値の位相パラメータを持つQiskit位相ゲートか。

A.  \pi/4

B.  \pi/2

C.  \pi/8

D.  \pi

解答・解説

Aは誤り。なお、位相パラメータ \pi/4を持つ位相ゲートはTゲートと呼ばれる。

Bは正しい。位相パラメータ \pi/2を持つ位相ゲートはSゲートと呼ばれる。

Cは誤り。

Dは誤り。なお、位相パラメータ \piを持つ位相ゲートは Zゲートと同じになる。

答え:B

問題8

8. Which two code fragments, when inserted into the code below, will produce the statevector shown in the output?

from qiskit import QuantumCircuit, Aer, execute

from math import sqrt

qc = QuantumCircuit(2)

# Insert fragment here

simulator = Aer.get_backend('statevector_simulator')

result = execute(qc, simulator).result()

statevector = result.get_statevector()

print(statevector)

Output:

[0.707+0.j 0.+0.j 0.+0.j 0.707+0.j]

A. v = [1/sqrt(2), 0, 0, 1/sqrt(2)]

qc.initialize(v,[0,1])

B. qc.h(0)

qc.cx(0,1)

C. v1, v2 = [1,0], [0,1]

qc.initialize(v1,0)

qc.initialize(v2,1)

D. qc.cx(0,1)

qc.measure_all()

E. qc.h(0)

qc.h(1)

qc.measure_all()

日本語訳

以下のコードに挿入すると、「出力」にある状態ベクトルを生成することになるコード2つはどれか。

from qiskit import QuantumCircuit, Aer, execute
from math import sqrt
qc = QuantumCircuit(2)
# ここに挿入
simulator = Aer.get_backend('statevector_simulator')
result = execute(qc, simulator).result()
statevector = result.get_statevector()
print(statevector)

出力

[0.707+0.j 0.+0.j 0.+0.j 0.707+0.j]

A.

v = [1/sqrt(2), 0, 0, 1/sqrt(2)]
qc.initialize(v,[0,1])

B.

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

C.

v1, v2 = [1,0], [0,1]
qc.initialize(v1,0)
qc.initialize(v2,1)

D.

qc.cx(0,1)
qc.measure_all()

E.

qc.h(0)
qc.h(1)
qc.measure_all()

解答・解説

「出力」の状態は |00\rangle |11\rangleが同じ振幅で重ね合わさった状態(すなわちベル状態)。

なお、statevector_simulatorについては以下の記事を参照。

happy-quantum.hateblo.jp

Aは正しい。QuantumCircuitオブジェクトqcinitializeメソッドは、qc.initialize(params, qubits)のように呼び出し、qubitsで指定された量子ビットparamsで指定された状態に初期化する。選択肢のコードではqubitsにインデックスのリストを渡すことで0番目と1番目の量子ビットを初期化対象として指定し、paramsに目的の状態の振幅のベクトルを複素数のリストとして正しく指定している。

Bは正しい。式で確認すると、  CNOTH_0|00\rangle = CNOT\frac{1}{\sqrt{2}}(|00\rangle +|01\rangle) = \frac{1}{\sqrt{2}}(|00\rangle + |11\rangle) のように |00\rangle |11\rangleの重ね合わせになっている。

Cは誤り。0番目の量子ビット |0\rangleで、1番目の量子ビット |1\rangleで初期化することになり、 |01\rangleとなる。「出力」は[0., 0., 1., 0.]

Dは誤り。測定を適用しているが、状態は CNOT|00\rangle = |00\rangleなので、「出力」は[1., 0., 0., 0.]となる。

Eは誤り。 H_1H_0|00\rangle = |++\rangle となる。

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.initialize.html

答え:A, B

問題9

9. Which code fragment will produce a multi-qubit gate other than a CNOT ?

A. qc.cx(0,1)

B. qc.cnot(0,1)

C. qc.mct([0],1)

D. qc.cz(0,1)

日本語訳

次のうち、CNOT以外の複数量子ビットゲートを生成するコードはどれか。

A. qc.cx(0,1)

B. qc.cnot(0,1)

C. qc.mct([0],1)

D. qc.cz(0,1)

解答・解説

Aは誤り。これはCNOTゲートそのもの。

Bは誤り。QuantumCircuitcnotというメソッドは存在しない。

Cは誤り。mctは「複数CNOTゲート」を追加するメソッドで、qc.mct(制御ビット, ターゲットビット)のように呼び出す。選択肢のコードはターゲットとして1番目の量子ビットを、制御として0番目の量子ビットだけを指定しているので、結局CNOTゲートを追加したのと同じことになる。

Dは正しい。制御 Zゲートを生成するコードで、これは複数量子ビットゲートの一つ。

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.mct.html#qiskit.circuit.QuantumCircuit.mct https://qiskit.org/documentation/locale/ja_JP/stubs/qiskit.circuit.QuantumCircuit.cz.html

答え:D

問題10

10. Which code fragment will produce a multi-qubit gate other than a Toffoli?

A. qc.ccx(0,1,2)

B. qc.mct([0,1], 2)

C. from qiskit.circuit.library import CXGate

ccx = CXGate().control()

qc.append(ccx, [0,1,2])

D. qc.cry(0,1,2)

日本語訳

次のうち、トフォリゲート以外の複数量子ビットゲートを生成するコードはどれか?

A.

qc.ccx(0,1,2)

B.

qc.mct([0,1], 2)

C.

from qiskit.circuit.library import CXGate
ccx = CXGate().control()
qc.append(ccx, [0,1,2])

D.

qc.cry(0,1,2)

解答・解説

Aは誤り。qc.ccx(制御ビット1, 制御ビット2, ターゲットビット)でトフォリゲートを生成する。よって、選択肢のコードは0番目と1番目の量子ビットを制御ビット、2番めの量子ビットをターゲットビットに(インデックスにより)指定してトフォリゲートを生成している。「トフォリゲート以外」という条件に合わない。

Bは誤り。qc.mct(制御ビット, ターゲットビット)で複数CNOTゲートを生成する。選択肢のコードは0番目と1番目の量子ビットを(インデックスのリストにより)制御ビットに指定し、2番めの量子ビットを(インデックスにより)ターゲットビットに指定している。これはトフォリゲートと等価。

Cは誤り。制御Xゲートを表すCXGateオブジェクトのcontrolメソッドは制御ビットを追加した制御CXゲート、すなわちトフォリゲートを生成する。また、qc.append(ゲート, 対象ビット)で回路の対象ビットにゲートを追加する。結局これはトフォリゲートを追加したことになる。

Dは正しい。qc.cry(theta, 制御ビット, ターゲットビット)で回路に制御 R_yゲートを追加する。よって \theta=0で、1番目の量子ビットをそれぞれ制御ビット、2番めの量子ビットをターゲットビットとして制御 R_yゲートを追加している。これは複数量子ビットゲートであり、かつトフォリゲートではない。

答え:D

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.ccx.html https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.mct.html https://qiskit.org/documentation/stubs/qiskit.circuit.library.CXGate.control.html https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.append.html https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.cry.html

問題11

11. Which two options would place a barrier across all qubits to the QuantumCircuit below?

qc = QuantumCircuit(3,3)

A. qc.barrier(qc)

B. qc.barrier([0,1,2])

C. qc.barrier()

D. qc.barrier(3)

E. qc.barrier_all()

日本語訳

以下の回路に対し、全量子ビットに渡るバリアを設置するコード2つはどれか。

qc = QuantumCircuit(3,3)

A. qc.barrier(qc)

B. qc.barrier([0,1,2])

C. qc.barrier()

D. qc.barrier(3)

E. qc.barrier_all()

解答・解説

バリアについては以下の記事を参照。

happy-quantum.hateblo.jp

Aは誤り。qc.barrier(対象ビット)で対象ビットにバリアを設定する。選択肢のコードでは対象ビットとして回路のオブジェクトを渡しているので、メソッドの呼び出しが正しくない。

Bは正しい。バリアの設置対象として0、1、2番目の全ての量子ビットを指定している。

Cは正しい。qc.barrier()のように引数を指定しなかった場合、全量子ビットが対象となる。

Dは誤り。対象ビットとして指定したインデックスが回路のビット数の上限を超えているので、IndexErrorとなる。

Eは誤り。QuantumCircuitbarrier_allというメソッドは存在しない(ので、AttributeErrorとなる)。

答え:B, C

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.barrier.html

問題12

12. What code fragment codes the equivalent circuit if you remove the barrier in the following QuantumCircuit?

A. qc = QuantumCircuit(1,1)

qc.h(0)

qc.s(0)

qc.h(0)

qc.measure(0,0)

B. qc = QuantumCircuit(1,1)

qc.measure(0,0)

C. qc = QuantumCircuit(1,1)

qc.h(0)

qc.t(0)

qc.tdg(0)

qc.h(0)

qc.measure(0,0)

D. qc = QuantumCircuit(1,1)

qc.h(0)

qc.z(0)

qc.h(0)

qc.measure(0,0)

日本語訳

以下の量子回路からバリアを取り除いた場合の回路と等価になるコードはどれか。

A.

qc.h(0)
qc.s(0)
qc.h(0)
qc.measure(0,0)

B.

qc = QuantumCircuit(1,1)
qc.measure(0,0)

C.

qc = QuantumCircuit(1,1)
qc.h(0)
qc.t(0)
qc.tdg(0)
qc.h(0)
qc.measure(0,0)

D.

qc = QuantumCircuit(1,1)
qc.h(0)
qc.z(0)
qc.h(0)
qc.measure(0,0)

解答・解説

各回路のゲートの行列表現を比較する。 まず、位相パラメータ \lambdaを持つ位相ゲートを P(\lambda)とすると、 T=P(\pi/4)なので、問題文のゲートは  HTTH = HP(\pi/4)P(\pi/4)H = HP(\pi/2)H と書ける。

Aは正しい。 S=P(\pi/2)なので、選択肢のゲートは  HSH = HP(\pi/2)H となり、問題文のゲートと等価になる。

Bは誤り。選択肢のコードにはゲートが存在しないため、単位行列と等価であるが、問題文のゲートは単位行列とは異なる。

Cは誤り。ユニタリ行列の性質から T^\dagger = T^{-1}なので、選択肢のゲートは  HT^\dagger TH = HH となり、問題文のゲートとは異なる。

Dは誤り。 Z=P(\pi)なので、選択肢のゲートは  HZH = HP(\pi)H となり、問題文のゲートとは異なる。

答え:A

https://qiskit.org/documentation/stubs/qiskit.circuit.library.PhaseGate.html

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.s.html

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.t.html

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.tdg.html

問題13

13. Given the following code, what is the depth of the circuit?

qc = QuantumCircuit(2, 2)

qc.h(0)

qc.barrier(0)

qc.cx(0,1)

qc.barrier([0,1])

A. 2

B. 3

C. 4

D. 5

日本語訳

以下のコードがあるとき、回路の深さはどれか。

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

A. 2

B. 3

C. 4

D. 5

解答・解説

問題文では以下の図のような回路が与えられている。

回路の「深さ」とはクリティカルパス(最も長い経路)の長さを表す。 0番目の量子ビットには2つのゲート(H、CNOT)が作用しており、1番目の量子ビットには1つのゲート(CNOT)が作用している。 よって、この回路の深さはmax(2, 1)すなわち2となる。

答え:A

https://qiskit.org/documentation/stubs/qiskit.circuit.QuantumCircuit.depth.html

https://quantumcomputing.stackexchange.com/questions/14431/whats-meant-by-the-depth-of-a-quantum-circuit

問題14

14. Which code snippet would execute a circuit given these parameters?

1) • Measure the circuit 1024 times,

2) • use the QASM simulator,

3) • and use a coupling map that connects three qubits linearly

qc = QuantumCircuit(3)

# Insert code fragment here

result = job.result()

A. qasm_sim = Aer.get_backend('qasm_simulator')

couple_map = [[0, 1], [1, 2]]

job = execute(qc, backend=qasm_sim, shots=1024, coupling_map=couple_map)

B. qasm_sim = Aer.getBackend('ibmq_simulator')

couple_map = [[0, 1], [0, 2]]

job = execute(qc, loop=1024, coupling_map=couple_map)

C. qasm_sim = Aer.get_backend('qasm_simulator')

couple_map = [[0, 1], [1, 2]]

job = execute(qc, backend=qasm_sim, repeat=1024,

coupling_map=couple_map)

D. qasm_sim = Aer.get_backend('qasm_simulator')

couple_map = [[0, 1], [1, 2]]

job = execute(backend=qasm_sim, qc, shot=1024,

coupling_map=couple_map)

日本語訳

以下のパラメータのもとで回路を実行するコードはどれか。

  • 1) 回路を1024回観測する
  • 2) QASMシミュレータを使用する
  • 3) 3つの量子ビットを直列につなぐcoupling mapを使用する
qc = QuantumCircuit(3)
# ここにコードを挿入
result = job.result()

A.

qasm_sim = Aer.get_backend('qasm_simulator') 
couple_map = [[0, 1], [1, 2]]
job = execute(qc, backend=qasm_sim, shots=1024, coupling_map=couple_map)

B.

qasm_sim = Aer.getBackend('ibmq_simulator') 
couple_map = [[0, 1], [0, 2]]
job = execute(qc, loop=1024, coupling_map=couple_map)

C.

qasm_sim = Aer.get_backend('qasm_simulator') 
couple_map = [[0, 1], [1, 2]]
job = execute(qc, backend=qasm_sim, repeat=1024, coupling_map=couple_map)

D.

qasm_sim = Aer.get_backend('qasm_simulator') 
couple_map = [[0, 1], [1, 2]]
job = execute(backend=qasm_sim, qc, shot=1024, coupling_map=couple_map)

解答・解説

Aは正しい。execute関数は指定されたバックエンドを用いて回路を実行する。選択肢のコードではexecuteの第一引数で実行対象のQuantumCircuitオブジェクトを、引数backendで利用するバックエンドとしてQasmSimulatorオブジェクトを、引数shotsでサンプリング回数として1024を、引数coupling_mapでリスト形式によりビット0-ビット1、ビット1-ビット2のように直列のcoupling mapを指定している。これらは問題文にある条件を全て満たす。

Bは誤り。execute関数はloopという引数を取らない。

Cは誤り。execute関数はrepeatという引数を取らない。

Dは誤り。execute関数はshotという引数を取らない。

答え:A

https://qiskit.org/documentation/apidoc/execute.html https://qiskit.org/documentation/stubs/qiskit_aer.QasmSimulator.html https://qiskit.org/documentation/stubs/qiskit.transpiler.CouplingMap.html

問題15

15. Which of these would execute a circuit on a set of qubits which are coupled in a custom way?

from qiskit import QuantumCircuit, execute, BasicAer

backend = BasicAer.get_backend('qasm_simulator')

qc = QuantumCircuit(3)

# insert code here

A. execute(qc, backend, shots=1024, coupling_map=[[0,1], [1,2]])

B. execute(qc, backend, shots=1024, custom_topology=[[0,1],[2,3]]

C. execute(qc, backend, shots=1024, device="qasm_simulator", mode="custom")

D. execute(qc, backend, mode="custom")

日本語訳

カスタムで結合される量子ビットからなる回路を実行するコードはどれか。

from qiskit import QuantumCircuit, execute, BasicAer
backend = BasicAer.get_backend('qasm_simulator')
qc = QuantumCircuit(3)
# ここにコードを挿入

A. execute(qc, backend, shots=1024, coupling_map=[[0,1], [1,2]])

B. execute(qc, backend, shots=1024, custom_topology=[[0,1],[2,3]]

C. execute(qc, backend, shots=1024, device="qasm_simulator", mode="custom")

D. execute(qc, backend, mode="custom")

解答・解説

Aは正しい。execute関数は指定されたバックエンドを用いて回路を実行する。選択肢のコードではexecuteの第一引数で実行対象のQuantumCircuitオブジェクトを、引数backendで利用するバックエンドとしてQasmSimulatorPyオブジェクトを、引数shotsでサンプリング回数として1024を指定している。また、引数coupling_mapにより結合をカスタムで指定している。

Bは誤り。execute関数はcustom_topologyという引数を取らない。

C、Dは誤り。execute関数はmodeという引数を取らない。

答え:A

https://qiskit.org/documentation/apidoc/execute.html https://qiskit.org/documentation/stubs/qiskit.transpiler.CouplingMap.html

問題16

16. Which three simulators are available in BasicAer?

A. qasm_simulator

B. basic_qasm_simulator

C. statevector_simulator

D. unitary_simulator

E. quantum_simulator

F. quantum_circuit_simulator

日本語訳

BasicAerで使用可能な3つのシミュレータはどれか。

A. qasm_simulator

B. basic_qasm_simulator

C. statevector_simulator

D. unitary_simulator

E. quantum_simulator

F. quantum_circuit_simulator

解答・解説

BasicAerはAerの一部の互換として使用可能なPython実装によるバックエンドで、以下の3つのシミュレータを提供する。 |BasicAerのシミュレータ|対応するAerのシミュレータ| |QasmSimulatorPy('qasm_simulator')|QasmSimulator('qasm_simulator')| |StatevectorSimulatorPy('statevector_simulator')|StatevectorSimulator('statevector_simulator')| |UnitarySimulatorPy('unitary_simulator')|UnitarySimulator('unitary_simulator')|

答え:A, C, D

https://qiskit.org/documentation/apidoc/providers_basicaer.html https://qiskit.org/documentation/stubs/qiskit.providers.basicaer.QasmSimulatorPy.html https://qiskit.org/documentation/stubs/qiskit.providers.basicaer.StatevectorSimulatorPy.html https://qiskit.org/documentation/stubs/qiskit.providers.basicaer.UnitarySimulatorPy.html https://qiskit.org/documentation/tutorials/simulators/1_aer_provider.html

問題17

17. Which line of code would assign a statevector simulator object to the variable backend ?

A. backend = BasicAer.StatevectorSimulatorPy()

B. backend = BasicAer.get_backend('statevector_simulator')

C. backend = BasicAer.StatevectorSimulatorPy().name()

D. backend = BasicAer.get_back('statevector_simulator')

日本語訳

変数backendにstatevectorシミュレータオブジェクトを割り当てるコードはどれか。

A. backend = BasicAer.StatevectorSimulatorPy()

B. backend = BasicAer.get_backend('statevector_simulator')

C. backend = BasicAer.StatevectorSimulatorPy().name()

D. backend = BasicAer.get_back('statevector_simulator')

解答・解説

A、Cは誤り。StatevectorSimulatorPyBasicAerProviderの内部クラスとして存在するわけではなく、qiskit.providers.basicaerモジュールに含まれている。

Bは正しい。BasicAer(すなわちBasicAerProviderインスタンス)のget_backend(バックエンド名)により、対応するシミュレータを取得することができる。

Dは誤り。BasicAerget_backというメソッドを持たない。

答え:B

https://qiskit.org/documentation/apidoc/providers_basicaer.html https://qiskit.org/documentation/stubs/qiskit.providers.basicaer.StatevectorSimulatorPy.html https://qiskit.org/documentation/stubs/qiskit.providers.basicaer.BasicAerProvider.get_backend.html

問題18

18. Which code fragment would yield an operator that represents a single-qubit X gate?

A. op = Operator.Xop(0)

B. op = Operator(0,1)

C. qc = QuantumCircuit(1)

qc.x(0)

op = Operator(qc)

D. op = Operator(1,0,0,1)

日本語訳

単一量子ビットXゲートを表すオペレーターを生成するコードはどれか。

A.

op = Operator.Xop(0)

B.

op = Operator([[0,1]])

C.

qc = QuantumCircuit(1)
qc.x(0)
op = Operator(qc)

D.

op = Operator([[1,0,0,1]])

解答・解説

Aは誤り。OperatorXopというメソッドを持たない。

B、Dは誤り。Operator(行列)とすることでオペレーターを取得できるが、渡している行列が

 X = \begin{pmatrix} 0&1\\1&0 \end{pmatrix}

になっていない。なお、仮にOperator([[0, 1], [1, 0]])としていたならば正しい。

Cは正しい。Operator(QuantumCircuit)とすることで回路をオペレーターに変換できる。選択肢で渡している回路は1量子ビット Xゲートが1つだけ含まれたものであるので、これは目的のオペレーターに変換される。

答え:C

https://qiskit.org/documentation/stubs/qiskit.quantum_info.Operator.html https://qiskit.org/documentation/locale/ja_JP/tutorials/circuits_advanced/02_operators_overview.html

問題19

19. What would be the fidelity result(s) for these two operators, which differ only by global phase?

op_a = Operator(XGate())

op_b = numpy.exp(1j * 0.5) * Operator(XGate())

A. state_fidelity() of 1.0

B. state_fidelity() and average_gate_fidelity() of 1.0

C. average_gate_fidelity() and process_fidelity() of 1.0

D. state_fidelity(), average_gate_fidelity() and process_fidelity() of 1.0

日本語訳

グローバル位相のみ異なる次の2つの演算子の間の忠実度はどれか。

op_a = Operator(XGate())
op_b = numpy.exp(1j * 0.5) * Operator(XGate())

A. state_fidelity() of 1.0

B. state_fidelity() and average_gate_fidelity() of 1.0

C. average_gate_fidelity() and process_fidelity() of 1.0

D. state_fidelity(), average_gate_fidelity() and process_fidelity() of 1.0

解答・解説

Operator(Gate)とすることでGateオブジェクトをオペレーターに変換できる。よって問題文のコードにある変数op_a, op_bはそれぞれ以下の行列で表されるオペレーターになる。

 a = X = \begin{pmatrix}0&1\\1&0\end{pmatrix}
 b = e^{0.5i}X = e^{0.5i}\begin{pmatrix}0&1\\1&0\end{pmatrix}

A、B、Dは誤り。state_fidelity(Statevector, Statevector)とすることで2状態間の状態忠実度を取得できる。op_a, op_bはオペレーターでありStatevectorではないため、状態忠実度は1.0とはならない。実際、state_fidelity(op_a, op_b)とすると、QiskitErrorとなる。

答え:C

https://qiskit.org/documentation/stubs/qiskit.quantum_info.state_fidelity.html https://qiskit.org/documentation/stubs/qiskit.quantum_info.average_gate_fidelity.html https://qiskit.org/documentation/stubs/qiskit.quantum_info.process_fidelity.html

問題20

20. Given this code fragment, which output fits most closely with the measurement probability distribution?

qc = QuantumCircuit(2, 2)

qc.x(0)

qc.measure([0,1], [0,1])

simulator = Aer.get_backend('qasm_simulator')

result = execute(qc, simulator, shots=1000).result()

counts = result.get_counts(qc)

print(counts)

A. {'00': 1000}

B. {'01': 1000}

C. {'10': 1000}

D. {'11': 1000}

日本語訳

以下のコードがあるとき、測定結果の確率分布に最も近い出力はどれか。

qc = QuantumCircuit(2, 2)
qc.x(0)
qc.measure([0,1], [0,1])
simulator = Aer.get_backend('qasm_simulator')
result = execute(qc, simulator, shots=1000).result()
counts = result.get_counts(qc)
print(counts)

A. {'00': 1000}

B. {'01': 1000}

C. {'10': 1000}

D. {'11': 1000}

解答・解説

 Xゲートを0番目の量子ビットに作用させているため、測定前の状態は  X_0|00\rangle = |01\rangle となる。 また、noise_modelを指定していないため、1000回の測定結果は全て |01\rangleとなる。 以上から、Bが正しい。

答え:B

https://qiskit.org/documentation/stubs/qiskit_aer.QasmSimulator.html

まとめ

この記事では、IBM Quantum Developer サンプル問題について日本語訳をし、解説をしました。

IBM Quantum Developer試験をこれから受験される場合は、学習にお役立てください。