0

我的 qiskit 代码输出与讲师不同:Ryan O'Donnell

我正在使用 python3.8.5 中的 qiskit 和 qiskit 版本 {'qiskit-terra': '0.14.2', 'qiskit-aer': '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}

根据表格,输出必须是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'])

结果文件新输出为:<function bit_000 at 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}

<0x000002833524E820 处的函数 bit_001> - [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}

<0x0000028349D6CAF0 处的函数 bit_010> - [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}

<0x0000028349D6CB80 处的函数 bit_011> - [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}

<0x0000028349D6CC10 处的函数 bit_100> - [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}

<0x0000028349D6CCA0 处的函数 bit_101> - [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}

<0x0000028349D6CD30 处的函数 bit_110> - [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}

<0x0000028349D6CDC0 处的函数 bit_111> - [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}

不关心更清洁的结果,对不起。并且无法添加代码作为回复抱歉。

4

1 回答 1

3

啊,我想我看到了这个问题。在讲师 Ryan O'Donnell 的表格中,从第一个量子位到最后一个量子位读取状态。例如,状态 |110> 表示标记为 q_0 的量子比特处于状态 |1>,q_1 处于状态 |1> 并且 q_2 处于状态 |0>。在 Qiskit 中,标签约定是相反的。因此,在 Qiskit 中,|110> 实际上会被读取为 |011>,因为状态是从最后一个量子位读取到第一个量子位。因此,您的代码和输出是正确的,因为在 Ryan O'Donnell 的表中,您的状态 |011> 是 |110>。如果这没有意义,请告诉我。

至于你的新代码,你得到的结果与预期不同的原因是,当你运行你的 for 循环时,你不是创建新的电路,而是不断地添加到现有的电路中。例如,当应用第一个函数 bit_000 时,您将应用于 ccx 门、屏障和测量。然后调用 bit_001,将 x 门添加到 q_0 并执行相同的操作。到目前为止一切都很好。然后你向 q_1 添加一个 x 门并执行相同的过程,但你得到了结果状态向量“111”。那是因为在 qiskit 中,它认为在第一个和第二个量子比特上都有一个 x 门,所以当你应用 ccx 门时,你会得到你得到的结果。所以真的,通过应用所有这些电路操作,你已经制作了一个大电路而不是 8 个隔离电路。我会将所有量子位初始化为状态 |0> 每次测量后,这将为您提供一个干净的石板,以便为下一个电路工作。通过该编辑,您应该得到 Ryan O'Donnell 讲座中所写的结果。希望这可以帮助!

于 2020-08-06T14:31:04.417 回答