我的 qiskit 代码输出与讲师不同:Ryan O'Donnell
My qiskit code's output differ from the Lecturer: Ryan O’Donnell
My qiskit code's output differ from the Lecturer: Ryan O’Donnell
我正在使用 python3.8.5 中的 qiskit 和 qiskit 版本 {'qiskit-terra': '0.14.2', 'qiskit-aer' 测试附图中显示的 table : '0.5.2', 'qiskit-ignis': '0.3.3', 'qiskit-ibmq-provider': '0.7.2', 'qiskit-aqua': '0.7.3', 'qiskit': ' 0.19.6'}
我的代码是:
from qiskit import QuantumCircuit, assemble
from qiskit import Aer, execute
from qiskit.tools.visualization import plot_histogram
bit = 3
bit_lst = list(range(bit))
circuit = QuantumCircuit(bit, bit)
circuit.reset(0)
circuit.reset(1)
circuit.reset(2)
circuit.x(0)
circuit.x(1)
circuit.ccx(0,1,2)
circuit.barrier()
circuit.measure(bit_lst,bit_lst)
circuit.draw(output='mpl')
backend = Aer.get_backend('statevector_simulator')
statevector=backend.run(assemble(circuit)).result().get_statevector()
print(statevector)
backend = Aer.get_backend('qasm_simulator')
counts1=backend.run(assemble(circuit)).result().get_counts()
print(counts1)
with open('result.txt', 'a') as f:
print(f'011 - {statevector} - {counts1}', file=f)
plot_histogram([counts1], legend=['Simulator'])
result.txt 文件输出为:011 - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 1.+0.j] - {'111': 1024}
根据 table 输出必须是 011 但是代码的输出是 111 是我的吗代码还是我对量子比特的了解?
为了检查它是否有点翻转,我更改了我的代码:
from qiskit import QuantumCircuit, assemble
from qiskit import Aer, execute
from qiskit.tools.visualization import plot_histogram
bit = 3
bit_lst = list(range(bit))
circuit = QuantumCircuit(bit, bit)
circuit.reset(0)
circuit.reset(1)
circuit.reset(2)
def bit_000():
pass
def bit_001():
circuit.x(0)
def bit_010():
circuit.x(1)
def bit_011():
circuit.x(0)
circuit.x(1)
def bit_100():
circuit.x(2)
def bit_101():
circuit.x(0)
circuit.x(2)
def bit_110():
circuit.x(1)
circuit.x(2)
def bit_111():
circuit.x(0)
circuit.x(1)
circuit.x(2)
func_lst = [bit_000, bit_001, bit_010, bit_011, bit_100, bit_101, bit_110, bit_111]
for fn in func_lst:
fn()
circuit.ccx(0,1,2)
circuit.barrier()
circuit.measure(bit_lst,bit_lst)
circuit.draw(output='mpl')
backend = Aer.get_backend('statevector_simulator')
statevector=backend.run(assemble(circuit)).result().get_statevector()
print(statevector)
backend = Aer.get_backend('qasm_simulator')
counts1=backend.run(assemble(circuit)).result().get_counts()
print(counts1)
with open('result.txt', 'a') as f:
print(f'{fn} - {statevector} - {counts1}', file=f)
plot_histogram([counts1], legend=['Simulator'])
结果文件新输出是:
<函数 bit_000 在 0x0000028334B761F0> - [1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j] - {'000': 1024}
<函数 bit_001 在 0x000002833524E820> - [0.+0.j 1.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'001': 1024}
<函数 bit_010 在 0x0000028349D6CAF0> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 1.+0.j] - {'111': 1024}
<函数 bit_011 在 0x0000028349D6CB80> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 1 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'100': 1024}
<函数 bit_100 在 0x0000028349D6CC10> - [1.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'000': 1024}
<函数 bit_101 在 0x0000028349D6CCA0> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 1.+0.j 0.+0.j 0.+0.j] - {'101': 1024}
<函数 bit_110 在 0x0000028349D6CD30> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 1.+0.j] - {'111': 1024}
<函数 bit_111 在 0x0000028349D6CDC0> - [1.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'000': 1024}
不关心更清晰的结果,抱歉。抱歉,无法添加回复代码。
啊,我想我明白了。在讲师 Ryan O'Donnell 的 table 中,状态是从第一个量子位读取到最后一个量子位。例如,状态 |110> 表示标记为 q_0 的量子位处于状态 |1>,q_1 处于状态 |1> 并且 q_2 处于状态 |0>。在 Qiskit 中,标签约定是相反的。因此,在 Qiskit 中,|110> 实际上会读作 |011>,因为状态是从最后一个量子位读取到第一个量子位。因此,您的代码和输出是正确的,因为在 Ryan O'Donnell 的 table 中,您的状态 |011> 是 |110>。如果这没有意义,请告诉我。
至于您的新代码,您得到的结果与预期不同的原因是,当您 运行 您的 for 循环时,您不是在创建新电路,而是在不断地添加到现有电路中。例如,当应用第一个函数 bit_000 时,您将应用到 ccx 门、屏障和测量。然后调用 bit_001,将 x 门添加到 q_0 并执行相同的操作。到目前为止一切都很好。然后将 x 门添加到 q_1 并执行相同的过程,但得到的结果是状态向量“111”。那是因为在qiskit中,它认为在第一个和第二个量子比特上有一个x门,所以当你应用ccx门时,你得到你得到的结果。所以实际上,通过应用所有这些电路操作,您已经制作了一个大电路而不是 8 个隔离电路。每次测量后,我都会将所有量子位初始化为状态 |0>,这将为您提供一个干净的平台,为下一个电路工作。通过该编辑,您应该获得 Ryan O'Donnell 演讲中所写的结果。希望这对您有所帮助!
My qiskit code's output differ from the Lecturer: Ryan O’Donnell
我正在使用 python3.8.5 中的 qiskit 和 qiskit 版本 {'qiskit-terra': '0.14.2', 'qiskit-aer' 测试附图中显示的 table : '0.5.2', 'qiskit-ignis': '0.3.3', 'qiskit-ibmq-provider': '0.7.2', 'qiskit-aqua': '0.7.3', 'qiskit': ' 0.19.6'}
我的代码是:
from qiskit import QuantumCircuit, assemble
from qiskit import Aer, execute
from qiskit.tools.visualization import plot_histogram
bit = 3
bit_lst = list(range(bit))
circuit = QuantumCircuit(bit, bit)
circuit.reset(0)
circuit.reset(1)
circuit.reset(2)
circuit.x(0)
circuit.x(1)
circuit.ccx(0,1,2)
circuit.barrier()
circuit.measure(bit_lst,bit_lst)
circuit.draw(output='mpl')
backend = Aer.get_backend('statevector_simulator')
statevector=backend.run(assemble(circuit)).result().get_statevector()
print(statevector)
backend = Aer.get_backend('qasm_simulator')
counts1=backend.run(assemble(circuit)).result().get_counts()
print(counts1)
with open('result.txt', 'a') as f:
print(f'011 - {statevector} - {counts1}', file=f)
plot_histogram([counts1], legend=['Simulator'])
result.txt 文件输出为:011 - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 1.+0.j] - {'111': 1024}
根据 table 输出必须是 011 但是代码的输出是 111 是我的吗代码还是我对量子比特的了解?
为了检查它是否有点翻转,我更改了我的代码:
from qiskit import QuantumCircuit, assemble
from qiskit import Aer, execute
from qiskit.tools.visualization import plot_histogram
bit = 3
bit_lst = list(range(bit))
circuit = QuantumCircuit(bit, bit)
circuit.reset(0)
circuit.reset(1)
circuit.reset(2)
def bit_000():
pass
def bit_001():
circuit.x(0)
def bit_010():
circuit.x(1)
def bit_011():
circuit.x(0)
circuit.x(1)
def bit_100():
circuit.x(2)
def bit_101():
circuit.x(0)
circuit.x(2)
def bit_110():
circuit.x(1)
circuit.x(2)
def bit_111():
circuit.x(0)
circuit.x(1)
circuit.x(2)
func_lst = [bit_000, bit_001, bit_010, bit_011, bit_100, bit_101, bit_110, bit_111]
for fn in func_lst:
fn()
circuit.ccx(0,1,2)
circuit.barrier()
circuit.measure(bit_lst,bit_lst)
circuit.draw(output='mpl')
backend = Aer.get_backend('statevector_simulator')
statevector=backend.run(assemble(circuit)).result().get_statevector()
print(statevector)
backend = Aer.get_backend('qasm_simulator')
counts1=backend.run(assemble(circuit)).result().get_counts()
print(counts1)
with open('result.txt', 'a') as f:
print(f'{fn} - {statevector} - {counts1}', file=f)
plot_histogram([counts1], legend=['Simulator'])
结果文件新输出是: <函数 bit_000 在 0x0000028334B761F0> - [1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j] - {'000': 1024}
<函数 bit_001 在 0x000002833524E820> - [0.+0.j 1.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'001': 1024}
<函数 bit_010 在 0x0000028349D6CAF0> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 1.+0.j] - {'111': 1024}
<函数 bit_011 在 0x0000028349D6CB80> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 1 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'100': 1024}
<函数 bit_100 在 0x0000028349D6CC10> - [1.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'000': 1024}
<函数 bit_101 在 0x0000028349D6CCA0> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 1.+0.j 0.+0.j 0.+0.j] - {'101': 1024}
<函数 bit_110 在 0x0000028349D6CD30> - [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 1.+0.j] - {'111': 1024}
<函数 bit_111 在 0x0000028349D6CDC0> - [1.+0.j 0.+0.j 0.+0.j 0.+0.j 0 .+0.j 0.+0.j 0.+0.j 0.+0.j] - {'000': 1024}
不关心更清晰的结果,抱歉。抱歉,无法添加回复代码。
啊,我想我明白了。在讲师 Ryan O'Donnell 的 table 中,状态是从第一个量子位读取到最后一个量子位。例如,状态 |110> 表示标记为 q_0 的量子位处于状态 |1>,q_1 处于状态 |1> 并且 q_2 处于状态 |0>。在 Qiskit 中,标签约定是相反的。因此,在 Qiskit 中,|110> 实际上会读作 |011>,因为状态是从最后一个量子位读取到第一个量子位。因此,您的代码和输出是正确的,因为在 Ryan O'Donnell 的 table 中,您的状态 |011> 是 |110>。如果这没有意义,请告诉我。
至于您的新代码,您得到的结果与预期不同的原因是,当您 运行 您的 for 循环时,您不是在创建新电路,而是在不断地添加到现有电路中。例如,当应用第一个函数 bit_000 时,您将应用到 ccx 门、屏障和测量。然后调用 bit_001,将 x 门添加到 q_0 并执行相同的操作。到目前为止一切都很好。然后将 x 门添加到 q_1 并执行相同的过程,但得到的结果是状态向量“111”。那是因为在qiskit中,它认为在第一个和第二个量子比特上有一个x门,所以当你应用ccx门时,你得到你得到的结果。所以实际上,通过应用所有这些电路操作,您已经制作了一个大电路而不是 8 个隔离电路。每次测量后,我都会将所有量子位初始化为状态 |0>,这将为您提供一个干净的平台,为下一个电路工作。通过该编辑,您应该获得 Ryan O'Donnell 演讲中所写的结果。希望这对您有所帮助!