Изображение NEQR и дополнение пикселей
В NEQR значения пикселей хранятся базисными строками цветового регистра, а положения образуют равномерную суперпозицию. Для изображения 2×2 два кубита положения кодируют строки 00, 01, 10, 11 в порядке слева направо, сверху вниз.
1. Даны значения пикселей изображения 2×2: [101], [011], [111], [000]. Напишите функцию Python, создающую квантовую схему, представляющую это изображение. Подсказка автора: потребуется схема на пяти кубитах.
2. В построенной схеме преобразуйте значения пикселей в их дополнения.
Ниже полная исходная программа данного восьмибитного примера NEQR — от неё можно перейти к трёхбитным интенсивностям. Низшие кубиты интенсивности в Qiskit соответствуют младшим битам числа; два старших кубита задают положение.
# Importing standard Qiskit libraries and configuring account
import qiskit as qk
from qiskit import QuantumCircuit, Aer, IBMQ
from qiskit import transpile, assemble
from qiskit.tools.jupyter import *
from qiskit.visualization import plot_histogram
from math import pi
import numpy as np
from qiskit import QuantumRegister, ClassicalRegister
# Initialize the quantum circuit for the image
# Pixel position
idx = QuantumRegister(2, 'idx')
# grayscale pixel intensity value
intensity = QuantumRegister(8,'intensity')
# classical register
cr = ClassicalRegister(10, 'cr')
# create the quantum circuit for the image
qc_image = QuantumCircuit(intensity, idx, cr)
# set the total number of qubits
num_qubits = qc_image.num_qubits
qc_image.draw()
# Initialize the quantum circuit
# Optional: Add Identity gates to the intensity values
for idx in range(intensity.size):
qc_image.i(idx)
# Add Hadamard gates to the pixel positions
qc_image.h(8)
qc_image.h(9)
# Separate with barrier so it is easy to read later.
qc_image.barrier()
qc_image.draw()
# Encode the first pixel, since its value is 0, we will apply ID gates here:
for idx in range(num_qubits):
qc_image.i(idx)
qc_image.barrier()
qc_image.draw()
# Encode the second pixel whose value is (01100100):
value01 = '01100100'
# Add the NOT gate to set the position at 01:
qc_image.x(qc_image.num_qubits-1)
# We'll reverse order the value so it is in the same order when measured.
for idx, px_value in enumerate(value01[::-1]):
if(px_value=='1'):
qc_image.ccx(num_qubits-1, num_qubits-2, idx)
# Reset the NOT gate
qc_image.x(num_qubits-1)
qc_image.barrier()
qc_image.draw()
# Encode the third pixel whose value is (11001000):
value10 = '11001000'
# Add the 0CNOT gates, where 0 is on X pixel:
qc_image.x(num_qubits-2)
for idx, px_value in enumerate(value10[::-1]):
if(px_value=='1'):
qc_image.ccx(num_qubits-1, num_qubits-2, idx)
qc_image.x(num_qubits-2)
qc_image.barrier()
qc_image.draw()
# Encode the third pixel whose value is (11111111):
value11 = '11111111'
# Add the CCNOT gates:
for idx, px_value in enumerate(value11):
if(px_value=='1'):
qc_image.ccx(num_qubits-1,num_qubits-2, idx)
qc_image.barrier()
qc_image.measure(range(10),range(10))
qc_image.draw()Предложить решение
Войти, чтобы отправить материал.