Введение
Мы реализовали схему сумматора ранее. На этот раз мы легко реализуем вычитатель, просто перевернув схему сумматора.
Ссылка
По ссылке просто переверните его, и мы получим вычитатель.
Просто сделайте обратную цепь
Мы используем тот же код, что и схема сумматора.
from blueqat import Circuit
#carry bit def carry(a): return Circuit().ccx[a+1,a+2,a+3].cx[a+1,a+2].ccx[a,a+2,a+3]
#reverse carry bit def carry_reverse(a): return Circuit().ccx[a,a+2,a+3].cx[a+1,a+2].ccx[a+1,a+2,a+3]
#sum bits def sum(a): return Circuit().cx[a+1,a+2].cx[a,a+2]
#reverse sum bits def sum_reverse(a): return Circuit().cx[a,a+2].cx[a+1,a+2]
#decimal to binary def tobinary(A): return bin(A)[2:]
#arrange into the circuit def digits(a,b): aa = tobinary(a) bb = tobinary(b) alen = len(aa) blen = len(bb) maxlen = max(alen,blen) if alen>blen: bb = bb.zfill(alen) elif blen>alen: aa = aa.zfill(blen) str = '' for i in range(maxlen): str += '0' + aa[maxlen-i-1] + bb[maxlen-i-1] str += '0' return str
#input bits to Xgate def tox(a): cir = Circuit(len(a)) for i in range(len(a)): if a[i] == "1": cir += Circuit().x[i] return cir
#binary to decimal def todecimal(A): return int(str(A),2)
#get the answer def getb(result): str = result[-1] digi = int((len(result)-1)/3) for i in range(digi): str += result[-2-i*3] return todecimal(str)
Просто сделай это.
def minus(a,ab): qubits = len(digits(a,ab)) cir1 = tox(digits(a,ab)) digi = int((len(digits(a,ab))-1)/3)
cir4 = Circuit(qubits) for i in range(digi-1): cir4 += sum_reverse(i*3) cir4 += carry(i*3)
cir3 = sum_reverse((digi-1)*3) + Circuit(qubits).cx[-3,-2] cir2 = Circuit(qubits) for i in range(digi): cir2 += carry_reverse((digi-1-i)*3) result = (cir1 + cir4 + cir3 + cir2).m[:].run(shots=1) return getb(result.most_common()[0][0])
Приступаем к расчету
Это похоже на волшебство.
#8-2 minus(2,8) 6
#4-2 minus(2,4) 2
#16-2 minus(2,16) 14
#22-2 minus(2,22) 20
#50-2 minus(2,50) 48
#50-24 minus(24,50) 26
Обсуждение
Если вы можете сделать сумматор, вычитатель будет его противоположностью.