IBM Quantum Developer サンプル問題(全20問)の日本語訳と解説
「IBM Quantum Developer(正式名称 IBM Certified Associate Developer - Quantum Computation using Qiskit v0.2X)」はオープンソースの量子計算ライブラリQiskitを用いて量子計算を行う技術をはかる資格試験です。
上記ページには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
オブジェクトを指定すると、それらで構成される回路が生成される。QuantumRegister
はRegister
のサブクラスで量子レジスタを表す。QuantumRegister(整数, 文字列)
とすると指定された数の量子ビットからなる量子レジスタを、指定された名前で生成するので、選択肢のQuantumRegister(4, 'qr0')
はqr0
という名前のサイズ4の量子レジスタを、QuantumRegister(4, 'cr1')
はcr1
という名前のサイズ4の量子レジスタをそれぞれ生成している。以上から、選択肢のコードはサイズ4の量子レジスタ2つからなる回路となり、目的の回路とならない。
Dは誤り。QuantumCiruit(整数のリスト)
のように指定することはできない。選択肢のコードを実行するとCircuitError
が発生する。なお、どうしてもリストを使いたい場合はQuantumCircuit(*[4, 4])
のようにアンパックすればよい。
回路の初期化については以下記事を参照。
答え: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
日本語訳
以下のコードにおいて、測定結果がとなる確率はどれか。
qc = QuantumCircuit(1) qc.ry(3 * math.pi/4, 0)
A. 0.8536
B. 0.5
C. 0.1464
D. 1.0
解答・解説
問題文の状態をとすると、状態を状態で測定する確率はで計算できる。
QuantumCircuit
は全てのビットがで初期化されるため、
よって、目的の確率は
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量子ビットゲートであるアダマールゲート(ゲート)とゲートを作用させる正しい方法を選ぶ問題。
Aは正しい。1量子ビットゲートを作用させるメソッドの引数にQuantumRegister
オブジェクトを指定した場合、その量子レジスタを構成する全量子ビットにそれぞれゲートが追加される。
レジスタについては以下の記事を参照。
happy-quantum.hateblo.jp
Bは正しい。引数にQubit
オブジェクトのリストを指定した場合、各量子ビットにゲートが追加される。また、QuantumRegister
オブジェクトにスライスを作用させると、それを構成するQubit
オブジェクトのリストを取得できる。
Cは誤り。Bと同様にQubit
のリストを指定しているが、qc.h(inp_reg[0:1])
としているのでが追加されるのはだけとなり、にゲートが作用しないことになる。
Dは正しい。Qubit
オブジェクトで指定しており、目的の回路となっている。
Eは誤り。2行目で範囲外のインデックス指定しているのでIndexError
が発生する。
Fは誤り。とにが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量子ビットに対しては となるので、選択肢の状態は となり、これはベル状態の一つ。
Bは誤り。選択肢の状態は となるが、これはベル状態ではない。
Cは誤り。選択肢の状態は となるが、これはベル状態ではない。
Dは誤り。選択肢の状態は となるが、これはベル状態ではない。
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)
解答・解説
図の状態はなので、になるコードを選ぶ。
なお、statevector_simulator
については以下の記事を参照。
Aは正しい。となるため。
Bは誤り。B~Eは式で考えることもできるが、図で考えるとわかりやすい。は軸に対して右ねじの向きにだけ回転させるので、軸のマイナス方向のとなる。
Cは正しい。上と同様に図で考えると、は軸に対して右ねじの向きにだけ回転させるので、軸のプラス方向であるとなる。
Dは誤り。軸に対して回転させたあと、軸に対して回転させた結果、軸のマイナス方向であるとなる。
Eは誤り。軸に対してだけ回転させるので、軸のマイナス方向であるとなる。
答え: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.
B.
C.
D.
解答・解説
Aは誤り。なお、位相パラメータを持つ位相ゲートはTゲートと呼ばれる。
Bは正しい。位相パラメータを持つ位相ゲートはSゲートと呼ばれる。
Cは誤り。
Dは誤り。なお、位相パラメータを持つ位相ゲートはゲートと同じになる。
答え: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()
解答・解説
「出力」の状態はとが同じ振幅で重ね合わさった状態(すなわちベル状態)。
なお、statevector_simulator
については以下の記事を参照。
Aは正しい。QuantumCircuit
オブジェクトqc
のinitialize
メソッドは、qc.initialize(params, qubits)
のように呼び出し、qubits
で指定された量子ビットをparams
で指定された状態に初期化する。選択肢のコードではqubits
にインデックスのリストを渡すことで0番目と1番目の量子ビットを初期化対象として指定し、params
に目的の状態の振幅のベクトルを複素数のリストとして正しく指定している。
Bは正しい。式で確認すると、 のようにとの重ね合わせになっている。
Cは誤り。0番目の量子ビットをで、1番目の量子ビットをで初期化することになり、となる。「出力」は[0., 0., 1., 0.]
。
Dは誤り。測定を適用しているが、状態はなので、「出力」は[1., 0., 0., 0.]
となる。
Eは誤り。となる。
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は誤り。QuantumCircuit
にcnot
というメソッドは存在しない。
Cは誤り。mct
は「複数CNOTゲート」を追加するメソッドで、qc.mct(制御ビット, ターゲットビット)
のように呼び出す。選択肢のコードはターゲットとして1番目の量子ビットを、制御として0番目の量子ビットだけを指定しているので、結局CNOTゲートを追加したのと同じことになる。
Dは正しい。制御ゲートを生成するコードで、これは複数量子ビットゲートの一つ。
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, 制御ビット, ターゲットビット)
で回路に制御ゲートを追加する。よってで、1番目の量子ビットをそれぞれ制御ビット、2番めの量子ビットをターゲットビットとして制御ゲートを追加している。これは複数量子ビットゲートであり、かつトフォリゲートではない。
答え: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()
解答・解説
バリアについては以下の記事を参照。
Aは誤り。qc.barrier(対象ビット)
で対象ビットにバリアを設定する。選択肢のコードでは対象ビットとして回路のオブジェクトを渡しているので、メソッドの呼び出しが正しくない。
Bは正しい。バリアの設置対象として0、1、2番目の全ての量子ビットを指定している。
Cは正しい。qc.barrier()
のように引数を指定しなかった場合、全量子ビットが対象となる。
Dは誤り。対象ビットとして指定したインデックスが回路のビット数の上限を超えているので、IndexError
となる。
Eは誤り。QuantumCircuit
にbarrier_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)
解答・解説
各回路のゲートの行列表現を比較する。 まず、位相パラメータを持つ位相ゲートをとすると、なので、問題文のゲートは と書ける。
Aは正しい。なので、選択肢のゲートは となり、問題文のゲートと等価になる。
Bは誤り。選択肢のコードにはゲートが存在しないため、単位行列と等価であるが、問題文のゲートは単位行列とは異なる。
Cは誤り。ユニタリ行列の性質からなので、選択肢のゲートは となり、問題文のゲートとは異なる。
Dは誤り。なので、選択肢のゲートは となり、問題文のゲートとは異なる。
答え: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
問題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は誤り。StatevectorSimulatorPy
はBasicAerProvider
の内部クラスとして存在するわけではなく、qiskit.providers.basicaer
モジュールに含まれている。
Bは正しい。BasicAer
(すなわちBasicAerProvider
インスタンス)のget_backend(バックエンド名)
により、対応するシミュレータを取得することができる。
Dは誤り。BasicAer
はget_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は誤り。Operator
はXop
というメソッドを持たない。
B、Dは誤り。Operator(行列)
とすることでオペレーターを取得できるが、渡している行列が
になっていない。なお、仮にOperator([[0, 1], [1, 0]])
としていたならば正しい。
Cは正しい。Operator(QuantumCircuit)
とすることで回路をオペレーターに変換できる。選択肢で渡している回路は1量子ビットゲートが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、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}
解答・解説
ゲートを0番目の量子ビットに作用させているため、測定前の状態は
となる。
また、noise_model
を指定していないため、1000
回の測定結果は全てとなる。
以上から、Bが正しい。
答え:B
https://qiskit.org/documentation/stubs/qiskit_aer.QasmSimulator.html
まとめ
この記事では、IBM Quantum Developer サンプル問題について日本語訳をし、解説をしました。
IBM Quantum Developer試験をこれから受験される場合は、学習にお役立てください。