def generateCondTurnPath(turnType, target, source, angle, dic): # xnot xnotId = AQP.generateXnot(source=source, target=target, dic=dic) # turn inverseTurnId = AQP.generateBasicTurn(target=target, angle=QuantumMath.inverseAngle( angle / 2), turnType=turnType, dic=dic) turnId = AQP.generateBasicTurn(target=target, angle=angle / 2, turnType=turnType, dic=dic) # with Z turn it need a recalculation if turnType == TurnType.Z: turnIdSource = AQP.generateBasicTurn(target=source, angle=angle / 2, turnType=turnType, dic=dic) return [xnotId, inverseTurnId, xnotId, turnId, turnIdSource] else: #return [xnotId, inverseTurnId, xnotId, turnId] return [turnId, xnotId, inverseTurnId, xnotId]
def generateSpecialTurnPath(a, b, dic): module = QuantumMath.vectorModule([a, b]) # normalizing parameters a /= module b /= module # calculating theta x and y theta = math.asin(QuantumMath.complexModule(b)) y = cmath.phase(b) x = cmath.phase(a) lastQubit = dic.getNQubits() - 1 sourceQubits = [] for i in range(lastQubit): sourceQubits.append(i) firstGateId = AQP.generateMultipleTurn(turnType=TurnType.Z, target=lastQubit, sources=sourceQubits, angle=(-y + x + math.pi), dic=dic) secondGateId = AQP.generateMultipleTurn(turnType=TurnType.X, target=lastQubit, sources=sourceQubits, angle=theta * 2, dic=dic) thirdGateId = AQP.generateMultipleTurn(turnType=TurnType.Z, target=lastQubit, sources=sourceQubits, angle=(y + x), dic=dic) lastCondId = AQP.generateMultipleTurn( turnType=TurnType.Z, target=lastQubit, sources=sourceQubits, angle=QuantumMath.inverseAngle(x), dic=dic) # is the same with Toffoli or last qubit X #allToffoliId = AQP.generateToffoli(target=lastQubit, sources=sourceQubits, dic=dic) allToffoliId = AQP.generateBasic(standarGate=StandarGate.X, targets=[lastQubit], dic=dic) return [ firstGateId, secondGateId, thirdGateId, lastCondId, allToffoliId, lastCondId, allToffoliId ]
def generateMultipleTurnPath(turnType, target, sources, angle, dic): # if there is just one source, is like a condTurn if len(sources) == 1: return [ AQP.generateCondTurn(turnType=turnType, target=target, source=sources[0], angle=angle, dic=dic) ] # if there is two sources the implementation in automatic elif len(sources) == 2: nAngle = angle / 2 # conditional turn condTurnId = AQP.generateCondTurn(turnType=turnType, target=target, source=sources[1], angle=nAngle, dic=dic) # xnot xnotId = AQP.generateXnot(source=sources[0], target=sources[1], dic=dic) # conditional turn inverse condTurnInvId = AQP.generateCondTurn( turnType=turnType, target=target, source=sources[1], angle=QuantumMath.inverseAngle(nAngle), dic=dic) # conditional turn from above condTurnAboveId = AQP.generateCondTurn(turnType=turnType, target=target, source=sources[0], angle=nAngle, dic=dic) #added to path return [condTurnId, xnotId, condTurnInvId, xnotId, condTurnAboveId] else: nAngle = angle / 2 path = [] # multiple n-1 sources multipleId = AQP.generateMultipleTurn(turnType=turnType, target=target, sources=sources[1:], angle=nAngle, dic=dic) path.append(multipleId) # create xnot to every qubit source from first source pathXnot = [] for qubitAux in sources[1:]: # xnot xnotId = AQP.generateXnot(source=sources[0], target=qubitAux, dic=dic) #added to path pathXnot.append(xnotId) path += pathXnot # multiple n-1 sources multipleInvId = AQP.generateMultipleTurn( turnType=turnType, target=target, sources=sources[1:], angle=QuantumMath.inverseAngle(nAngle), dic=dic) path.append(multipleInvId) # redo xnots path += pathXnot # negate last qubit negateId = AQP.generateBasic(standarGate=StandarGate.X, targets=[sources[-1]], dic=dic) path.append(negateId) # x not from last qubit pathInverseXnot = [] for qubitAux in sources[1:-1]: # xnot xnotId = AQP.generateXnot(source=sources[-1], target=qubitAux, dic=dic) #added to path pathInverseXnot.append(xnotId) path += pathInverseXnot # create the new multi conditional multiLowId = AQP.generateMultipleTurn(turnType=turnType, target=target, sources=sources[:-1], angle=nAngle, dic=dic) path.append(multiLowId) # redo the negation path += pathInverseXnot path.append(negateId) return path