Вывод моего кода qiskit отличается от вывода лектора: Райан О'Доннелл - PullRequest
0 голосов
/ 06 августа 2020

Вывод моего кода qiskit отличается от вывода лектора: Райан О'Доннелл

Я тестирую таблицу, показанную на прикрепленном изображении, с помощью qiskit в python3 .8.5 и версии 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'])

новый файл результата: - [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}

- [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}

- [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}

- [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}

- [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}

- [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}

- [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}

- [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}

не заботился о более чистом результате, извините. и не могу добавить код в ответ, извините.

1 Ответ

2 голосов
/ 06 августа 2020

Ааа, думаю, я вижу проблему. В таблице от лектора Райана О'Доннелла состояние читается от первого кубита до последнего кубита. Например, состояние | 110> означает, что кубит с меткой q_0 находится в состоянии | 1>, q_1 находится в состоянии | 1>, а q_2 находится в состоянии | 0>. В Qiskit используется обратное соглашение о метках. Итак, в Qiskit | 110> на самом деле будет читаться как | 011>, поскольку состояние читается от последнего до первого кубита. Итак, ваш код и результат верны, поскольку в таблице Райана О'Доннелла ваше состояние | 011> равно | 110>. Если это не имеет смысла, дайте мне знать.

Что касается вашего нового кода, причина, по которой вы получаете результаты, отличные от ожидаемых, заключается в том, что при запуске для l oop вместо создания нового схемы, которые вы последовательно добавляете к существующей схеме. Например, применяя первую функцию bit_000, вы применяете ее к контрольному элементу, барьеру и измерению. Затем, вызывая bit_001, вы добавляете вентиль x к q_0 и делаете то же самое. Пока все хорошо. Затем вы добавляете элемент x к q_1 и выполняете ту же процедуру, но вы получаете результирующий вектор состояния '111'. Это потому, что в qiskit он считает, что на первом и втором кубите есть вентиль x, поэтому, когда вы применяете вентиль ccx, вы получаете результат, который получаете. Итак, на самом деле, применив все эти операции схемы, вы создали одну большую схему вместо 8 изолированных схем. Я бы инициализировал все кубиты в состояние | 0> после каждого измерения, что даст вам чистый лист для отработки следующей схемы. С этим редактированием вы должны получить результаты, описанные в лекции Райана О'Доннелла. Надеюсь, это поможет!

...