|
import gradio as gr |
|
from qiskit import QuantumRegister, QuantumCircuit, ClassicalRegister |
|
from qiskit import Aer, execute |
|
from math import pi |
|
|
|
def createInputState(qc, reg, n, pie): |
|
""" |
|
Computes the quantum Fourier transform of reg, one qubit at |
|
a time. |
|
Apply one Hadamard gate to the nth qubit of the quantum register reg, and |
|
then apply repeated phase rotations with parameters being pi divided by |
|
increasing powers of two. |
|
""" |
|
qc.h(reg[n]) |
|
for i in range(0, n): |
|
qc.cp(pie / float(2**(i + 1)), reg[n - (i + 1)], reg[n]) |
|
|
|
def evolveQFTState(qc, reg_a, reg_b, n, pie, factor): |
|
""" |
|
Evolves the state |F(ψ(reg_a))> to |F(ψ(reg_a+reg_b))> using the quantum |
|
Fourier transform conditioned on the qubits of the reg_b. |
|
Apply repeated phase rotations with parameters being pi divided by |
|
increasing powers of two. |
|
""" |
|
l = len(reg_b) |
|
for i in range(0, n + 1): |
|
if (n - i) > l - 1: |
|
pass |
|
else: |
|
qc.cp(factor*pie / float(2**(i)), reg_b[n - i], reg_a[n]) |
|
|
|
def inverseQFT(qc, reg, n, pie): |
|
""" |
|
Performs the inverse quantum Fourier transform on a register reg. |
|
Apply repeated phase rotations with parameters being pi divided by |
|
decreasing powers of two, and then apply a Hadamard gate to the nth qubit |
|
of the register reg. |
|
""" |
|
for i in range(0, n): |
|
qc.cp(-1 * pie / float(2**(n - i)), reg[i], reg[n]) |
|
qc.h(reg[n]) |
|
|
|
def add(reg_a, reg_b, circ, factor): |
|
""" |
|
Add two quantum registers reg_a and reg_b, and store the result in |
|
reg_a. |
|
""" |
|
pie = pi |
|
n = len(reg_a) - 1 |
|
|
|
|
|
for i in range(0, n + 1): |
|
createInputState(circ, reg_a, n - i, pie) |
|
|
|
|
|
for i in range(0, n + 1): |
|
evolveQFTState(circ, reg_a, reg_b, n - i, pie, factor) |
|
|
|
for i in range(0, n + 1): |
|
inverseQFT(circ, reg_a, i, pie) |
|
|
|
def quantum_multiply(multiplicand_in, multiplier_in): |
|
multiplicand_in = multiplicand_in.strip() |
|
multiplier_in = multiplier_in.strip() |
|
|
|
multiplicand = QuantumRegister(len(multiplicand_in)) |
|
multiplier = QuantumRegister(len(multiplier_in)) |
|
accumulator = QuantumRegister(len(multiplicand_in) + len(multiplier_in)) |
|
cl = ClassicalRegister(len(multiplicand_in) + len(multiplier_in)) |
|
d = QuantumRegister(1) |
|
|
|
circ = QuantumCircuit(accumulator, multiplier, multiplicand, |
|
d, cl, name="qc") |
|
|
|
|
|
for i in range(len(multiplicand_in)): |
|
if multiplicand_in[i] == '1': |
|
circ.x(multiplicand[len(multiplicand_in) - i - 1]) |
|
|
|
for i in range(len(multiplier_in)): |
|
if multiplier_in[i] == '1': |
|
circ.x(multiplier[len(multiplicand_in) - i - 1]) |
|
|
|
multiplier_str = '1' |
|
|
|
|
|
while(int(multiplier_str) != 0): |
|
add(accumulator, multiplicand, circ, 1) |
|
add(multiplier, d, circ, -1) |
|
for i in range(len(multiplier)): |
|
circ.measure(multiplier[i], cl[i]) |
|
result = execute(circ, backend=Aer.get_backend('qasm_simulator'), |
|
shots=2).result().get_counts(circ.name) |
|
multiplier_str = list(result.keys())[0] |
|
|
|
circ.measure(accumulator, cl) |
|
result = execute(circ, backend=Aer.get_backend('qasm_simulator'), |
|
shots=2).result().get_counts(circ.name) |
|
|
|
return list(result.keys())[0] |
|
|
|
iface = gr.Interface(quantum_multiply, inputs=["text", "text"], outputs="text") |
|
|
|
iface.launch() |
|
|