Spaces:
Sleeping
Sleeping
import streamlit as st | |
from qiskit import QuantumRegister, QuantumCircuit, ClassicalRegister | |
from qiskit import Aer, execute | |
from math import pi | |
def createInputState(qc, reg, n, pie): | |
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): | |
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): | |
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): | |
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 = 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") | |
circ.x(d) | |
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 result | |
def main(): | |
st.title("Quantum Multiplication App") | |
st.write("Enter two binary numbers to perform quantum multiplication.") | |
multiplicand_in = st.text_input("Enter the multiplicand (binary):") | |
multiplier_in = st.text_input("Enter the multiplier (binary):") | |
if st.button("Multiply"): | |
result = quantum_multiply(multiplicand_in, multiplier_in) | |
st.write("Result of Quantum Multiplication:", result) | |
if __name__ == "__main__": | |
main() | |