IBM 量子開発者認定資格 sample問題集の解説 その2
IBMが提供している量子コンピュータに関する資格「IBM Certified Associate Developer - Quantum Computation using Qiskit v0.2X」を取得するためには、“Exam C1000-112: Fundamentals of Quantum Computation Using Qiskit v0.2X Developer”という試験に合格する必要があります。この試験の概要などが記載された下記URL内では、サンプル問題集のリンクがあります。
https://www.ibm.com/training/certification/ibm-certified-associate-developer-quantum-computation-using-qiskit-v02x-C0010300
このサンプル問題集について、こちらのページで1 ~ 10問の解説を行いました。
このページでは11 ~ 20問までの解説を記載します。
また、試験対策用の追加の問題集としては下記のような問題集も是非是非、ご活用ください。
英語版問題集
日本語版問題集
Amazon Braket学習コース
また、AWSでの量子コンピューティングサービスであるAmazon braketについての学習コースを作成しました。
量子コンピュータやAWSの知識が無い方でも学び始められ、最終的には量子機械学習についても学べます。 こちらも利用し、量子技術のスキルを身につけましょう!
問題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()
回答: B,C
解説:
次のうちどのコードが、全ての量子ビットにバリアーを置くかという問題ですね。バリアーはゲートの間に置かれることで、それぞれのゲートが順番に実行されることを保証する役割を果たします。問題文のコードではすでに3つの量子ビット、古典ビットが定義されています。一つずつ選択肢を見ていきましょう。
Aのフォーマットでは、全ての量子ビットにバリアーを置くことはできず、不正解となります。
Bは0,1,2番目の量子ビットにバリアーを挿入するという記載になっており正解となります。
Cでは全てのビットにバリアーが挿入され、こちらも正解となります。
Dは3番目の量子ビットにのみ、バリアーを挿入するという記載になっており、不正解となります。また今回、0,1,2番目の量子ビットのみ定義されているため実行するとエラーとなります。
Eは実行するとエラーとなります。
問題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
解説: バリアーを除いた場合に同等の回路を作成するのは次のうちどれか?という問題ですね。問題文の回路はHゲートとTゲートが存在しています。Tゲートはz軸を軸として$\pi/4$だけ回転を施すゲートで、問題文ではバリアーを挟んで2回連続で量子ビットに適用されています。バリアーが除かれた場合、$\pi/4$の回転2回は$\pi/2$の回転1回の処理と同等になります。そしてz軸を軸として$\pi/2$だけ回転を施すゲートはSゲートと呼ばれます。つまりTゲート2回分の処理はSゲート1回分の処理と同等になります。 またこの回路を適用すると量子ビットは下記の状態になります。

これらをヒントとして、一つずつ選択肢を見ていきましょう。
AはTゲート2回分の処理の代わりに、Sゲートが1回適用されております。前述した通りこれら処理は同等になるため正解になります。
Bは量子ビットを初期の状態$|0\rangle$から変更していないため不正解です。
CではTDGゲートが出てきています。これは、Tゲートと逆の、z軸を軸として$-\pi/2$だけ回転を施すゲートとなります。よってTゲート、TDGゲートの処理が連続することでお互いの処理が打ち消されます。残った2つのHゲートについても、連続で作用させると何も処理がなされないためこの回路では、初めの状態$|0\rangle$が保たれます。
Dでは$|0\rangle$状態にHゲートを適用しており、まず下記の状態にしています。
問題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
回答: A
解説: この問題では問題文のコードの回路の深さが聞かれています。回路の深さは一般的に、1番多くゲートが適用されている量子ビットの、ゲートの数を指します。またこの際、バリアーは深さとして数えられません。問題文の回路を図にすると下記の通りとなります。

0ビット目に2つ分のゲートが適用されており、答えは2となります。
問題14:
Which code snippet would execute a circuit given these parameters?
1) Measure the circuit 1024 times.
2) Use the QASM simulator.
3) 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)
回答: A
解説:
問題文の1、2、3の条件を満たして回路を実行するのは次のうちどれか?という質問ですね。
1の条件を満たすためには、回路を1024回実施し、2の条件を満たすためにはQASM simulatorを使う必要があり、3の条件を満たすにはカップリングマップを用いて3つの量子ビットを線形に接続する必要があります。カップリングマップとは量子ビット間の接続性を示すマップです。量子ビットはベル状態で確認したように、あるビットの観測結果が、他のビットの状態に影響するような関係性を互いに持たせることが可能となりますが、どのビットがどのビットに接続されているかは実際の量子コンピュータにより異なります。qiskitの量子シミュレータでは、自身でカップリングマップを定義してシミュレーションを実行可能で、例えば実際の量子コンピュータの接続性を似せてシミュレーションを行うことができます。これらを前提として、一つずつ選択肢を見ていきましょう。
Aでは、Aer.get_backend('qasm_simulator')
によりQASM simulatorを定義できています。また、couple_map = [[0, 1], [1, 2]]
で定義されたカップルマップは下記の様になり線形に接続がなされます。

さらに、job = execute(qc, backend=qasm_sim, shots=1024, coupling_map=couple_map)
により、1024回の実行条件でシミュレータを実行できているため正解となります。
Bではまず、qasm_sim = Aer.getBackend('ibmq_simulator')
でQASMシミュレータが選択できておらず、不正解となります。
Cではjob = execute(qc, backend=qasm_sim, repeat=1024, coupling_map=couple_map)
が間違っており、repeatという引数は指定できません。
Dは惜しいですが、実行回数の指定はshotではなくshotsを利用するため不正解となります。
問題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")
回答: A
解説:
次のうちどれが、指定されたカップルマップを用いて回路を実行しますか?という問題ですね。前の問題で出てきたカップルマップがここでも登場しています。一つずつ選択肢を見ていきましょう。
Aはcoupling_map=[[0,1], [1,2]]
の箇所で、カップルマップを独自の方法で指定して回路を実行しており正解となります。
Bはcustom_topology
という引数が誤っており不正解となります。
C, Dではmode="custom"
という引数が誤っており不正解となります。
問題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
回答: A, C, D
解説:
BasicAerでは次のうちどのシミュレータが利用できるか?という問題ですね。
BasicAerでは、qasm_simulator、statevector_simulator、およびunitary_simulatorが利用可能であり、答えはA、C、Dとなります。ここでは各シミュレーターの概要と、出力結果について簡単に解説しておきます。
qasm_simulatorは、Qiskit回路の理想的およびノイズのある複数ショットの実行を可能にし、出力としてカウントを提供します。このシミュレーターでは例えば以下のような出力結果が得られます。
{'01': 504, '00': 520}
この例の結果は$|01\rangle$という状態が504回観測され、$|00\rangle$という状態が520回観測されたことを表しています。
statevector_simulatorは、Qiskit回路の理想的な単一ショットの実行を可能にし、適用後のシミュレータの最終状態ベクトルを結果として提供します。このシミュレーターの出力結果は例えば以下です。
[1.+0.j 0.+0.j 0.+0.j 0.+0.j]
この例の結果は、$|00\rangle$という状態を表しています。
unitary_simulatorは、Qiskit回路の理想的な単一ショットの実行を可能にし、回路自体の最終ユニタリ行列を出力として提供します。このシミュレーターの出力結果は例えば以下となります。
[[1.+0.j 0.+0.j 0.+0.j 0.+0.j]
[0.+0.j 1.+0.j 0.+0.j 0.+0.j]
[0.+0.j 0.+0.j 1.+0.j 0.+0.j]
[0.+0.j 0.+0.j 0.+0.j 1.+0.j]]
この例の結果は、2量子ビットのIゲートを表しています。
問題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’)
回答: B
解説:
状態ベクトルシミュレーターをbackendという変数に割り当てているコードは次のうちどれか?という問題ですね。
正解はBとなり、このフォーマットにより正しく状態ベクトルシミュレーターが割り当てられます。
A、C、Dは実行するとエラーとなります。
問題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]])
回答: C
解説:
1量子ビットにおけるXゲートを生成するのは次のうちどのコードか?という問題ですね。
選択肢の全てで、Operatorモジュールを利用してXゲートを生成しようとしています。
それぞれ見ていきましょう。
Aは実行するとエラーとなります。
B、Dは配列の形から直接Xゲートを定義しようとしています。Xゲートは式で表すと
$$
X =
\begin{bmatrix}
0 & 1 \\
1 & 0
\end{bmatrix}
$$
となり、これをOperatorモジュールで表現するのであれば
op = Operator([[0,1],[1,0]])
と書く必要があります。B、Dどちらもこの形で定義ができていないため不正解となります。
Cは回路から直接Xゲートを定義しており正解となります。
問題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
回答: C
解説:
グローバル位相のみの差異がある、次の2つの演算子のfidelityの結果は次のうちどれとなるか?という問題ですね。
fidelityは2つの量子状態や量子演算子がどれだけ似ているか、あるいはどれだけ「近い」かを測る指標です。
fidelityが1であれば、それらは完全に一致していることを示し、 量子状態のfidelityが0の場合それらの状態は直交していることを、演算子のfidelityが0の場合それらが全く異なる作用を持っていることを意味します。
今回の様に、グローバル位相のみが異なる場合のfidelityは1となります。さらに、演算子のfidelityはaverage_gate_fidelity()
とprocess_fidelity()
により求められるため、正解はCとなります。量子状態のfidelityを求める場合には、state_fidelity()
を利用します。
問題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}
回答: B
解説:
このコードを実行した際の測定確率分布に最も近い出力はどれですか?という問題ですね。まずqc = QuantumCircuit(2, 2)
の時点では量子状態は$|00\rangle$となっています。この後、qc.x(0)
により、0番目の量子ビットが1に変換され、量子状態は$|01\rangle$となり、その後にqc.measure([0,1], [0,1])
により測定が行われ、シミュレーターで測定確率分布を取得しています。このため、結果は01が1000回確認されることとなり、Bが正解となります。
IBMの量子技術者認定試験問題集について
本ブログで紹介した量子開発者認定資格を目指される方のため、Udemyというサイト上にて日本語版、英語版で問題集を作りました!解説もなるべくわかりやすく作成いたしましたので、是非是非ご活用ください。
英語版問題集