Skip to content

Instantly share code, notes, and snippets.

@AstroEngineeer
Last active July 30, 2024 12:34
Show Gist options
  • Save AstroEngineeer/5e400863052b999d1fcb33a2d28c5e3b to your computer and use it in GitHub Desktop.
Save AstroEngineeer/5e400863052b999d1fcb33a2d28c5e3b to your computer and use it in GitHub Desktop.
Quantum Circuit - 2's complement subtractor
# %% [markdown]
# Implementing Two's complements subtractor using quantum gates.
# %%
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, Aer, execute
# %%
simulator = Aer.backends('qasm_simulator')[0]
# %%
def fullAdder(circuit, a, b, c, d):
circuit.ccx(a, b, d)
circuit.cx(a, b)
circuit.ccx(b, c, d)
circuit.cx(b, c)
circuit.cx(a, b)
# circuit.barrier()
# %%
def fourbitAdder(circuit, qRegisters):
# C
# A B S C
fullAdder(circuit, qRegisters[3], qRegisters[7], qRegisters[11], qRegisters[10])
fullAdder(circuit, qRegisters[2], qRegisters[6], qRegisters[10], qRegisters[9])
fullAdder(circuit, qRegisters[1], qRegisters[5], qRegisters[9], qRegisters[8])
fullAdder(circuit, qRegisters[0], qRegisters[4], qRegisters[8], qRegisters[12])
# %%
TC_qr = QuantumRegister(13, name='q')
Twos_Complement = QuantumCircuit(TC_qr, name='Twos_Complement')
# 1s Complement
Twos_Complement.x(0)
Twos_Complement.x(1)
Twos_Complement.x(2)
Twos_Complement.x(3)
# For Adding 0001
Twos_Complement.x(7)
# Adding Input(B) and 0001
fourbitAdder(Twos_Complement, [0,1,2,3,4,5,6,7,8,9,10,11,12])
# Resetting Inputs
Twos_Complement.x(0)
Twos_Complement.x(1)
Twos_Complement.x(2)
Twos_Complement.x(3)
Twos_Complement.x(7)
Twos_Complement.to_gate()
Twos_Complement.draw('mpl')
# %%
B = QuantumRegister(4, name='b')
One = QuantumRegister(4, name='o')
B_twos_complement = QuantumRegister(4, name='s')
Final_Carry = QuantumRegister(2, name='fc')
A = QuantumRegister(4, name='a')
Sum_A_B2s = QuantumRegister(4, name='x')
Final_Answer = QuantumRegister(4, name='y')
C = ClassicalRegister(5, name='c')
QC = QuantumCircuit(B, One, B_twos_complement, Final_Carry, A, Sum_A_B2s, C,Final_Answer)
# Input A
QC.x(A[0])
# QC.x(A[1])
QC.x(A[2])
# QC.x(A[3])
# Input B
QC.x(B[0])
# QC.x(B[1])
# QC.x(B[2])
QC.x(B[3])
QC.barrier()
QC.append(Twos_Complement, [B[0], B[1], B[2], B[3], One[0], One[1], One[2], One[3], B_twos_complement[0],
B_twos_complement[1], B_twos_complement[2], B_twos_complement[3], Final_Carry[0]])
QC.barrier()
fourbitAdder(QC, [B_twos_complement[0], B_twos_complement[1], B_twos_complement[2], B_twos_complement[3], A[0], A[1],
A[2], A[3], Sum_A_B2s[0], Sum_A_B2s[1], Sum_A_B2s[2], Sum_A_B2s[3], Final_Carry[0]])
QC.barrier()
# QC.measure([Sum_A_B2s[3], Sum_A_B2s[2], Sum_A_B2s[1],
# Sum_A_B2s[0], Final_Carry[0]], [0, 1, 2, 3, 4])
# QC.draw('mpl')
# %%
QC.measure([Final_Carry[0]], [4])
# QC.reset([B_twos_complement[0], B_twos_complement[1], B_twos_complement[2], B_twos_complement[3]])
# QC.reset([One[0], One[1], One[2], One[3]])
# QC.reset([Final_Carry[0]])
QC.append(Twos_Complement, [Sum_A_B2s[0], Sum_A_B2s[1], Sum_A_B2s[2], Sum_A_B2s[3], One[0], One[1], One[2], One[3], Final_Answer[0],
Final_Answer[1], Final_Answer[2], Final_Answer[3], Final_Carry[1]]).c_if(C[4],0)
QC.cx(Sum_A_B2s[0],Final_Answer[0]).c_if(C[4],1)
QC.cx(Sum_A_B2s[1],Final_Answer[1]).c_if(C[4],1)
QC.cx(Sum_A_B2s[2],Final_Answer[2]).c_if(C[4],1)
QC.cx(Sum_A_B2s[3],Final_Answer[3]).c_if(C[4],1)
# %%
QC.measure([Final_Answer[3], Final_Answer[2], Final_Answer[1],
Final_Answer[0]], [0, 1, 2, 3])
# %%
QC.draw('mpl')
# %%
job = execute(QC, simulator)
result = job.result()
result.get_counts(QC)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment