44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
|
from cirq import LineQubit,Circuit,CNOT,X,H,measure
|
||
|
from cirq import Simulator
|
||
|
|
||
|
from qiskit import IBMQ
|
||
|
|
||
|
from quantum_runner import quantum_simulate,setup_IBM,cirq_qasm
|
||
|
|
||
|
from random import randint
|
||
|
|
||
|
q0,q1 = LineQubit.range(2)
|
||
|
|
||
|
ffunction = [randint(0, 1) for _ in range(2)]
|
||
|
|
||
|
# создаем вентиль для генерации функции
|
||
|
def make_oracle(q0,q1,ffunction):
|
||
|
if ffunction[0]:
|
||
|
# используем контролируемый вентиль отрицания и матрицу Паули по координате x, sigma_x
|
||
|
yield [CNOT(q0,q1), X(q1)]
|
||
|
if ffunction[1]:
|
||
|
yield CNOT(q0,q1)
|
||
|
|
||
|
print(f"f(x) = <{', '.join(str(e) for e in ffunction)}>")
|
||
|
|
||
|
circuit = Circuit()
|
||
|
|
||
|
# создаем кубиты используя вентиль Адамара и матрицу Паули
|
||
|
|
||
|
circuit.append([X(q1),H(q1),H(q0)])
|
||
|
|
||
|
# добавляем функцию
|
||
|
circuit.append(make_oracle(q0,q1,ffunction))
|
||
|
|
||
|
# проведем измерение
|
||
|
circuit.append([H(q0),measure(q0)])
|
||
|
|
||
|
print(circuit)
|
||
|
print(Simulator().run(circuit))
|
||
|
|
||
|
# запуск на квантовом компьютере
|
||
|
|
||
|
setup_IBM()
|
||
|
provider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')
|
||
|
print(quantum_simulate(cirq_qasm(circuit,(q0,q1,)),provider.get_backend('ibm_lagos'),True))
|