Exemplo n.º 1
0
    def Uprime(self, display_matrix=False):
        #state_search is the state we are searching for
        #we will focus on the second term
        #Note that state search must be in decimal
        if self.search >= 2**self.dim:
            raise TypeError(
                "Search State parameter is outside of state space values")
        elif self.search < 0:
            raise TypeError(
                "Search State parameter is outside of state space values")
        else:
            #focusings on the second term of Uprime
            coin = self.c
            num_dir = int(2**coin)
            state = self.dim
            num_state = int(2**state)

            search_array = np.zeros((num_state, num_state))
            search_array[self.search][self.search] = 1
            search = Operator(search_array)

            s_c = np.zeros((2**(coin), 2**(coin)))
            for i in range(num_dir):
                for j in range(num_dir):
                    s_c[i][j] = num_dir**-1

            coin_ = Operator(s_c)
            search_op = coin_.tensor(search)

            S_ = self.S()

            term2 = search_op.compose(S_)

            U_ = self.U()

            Uprime = U_ - (2 * term2)
            if display_matrix:
                print("Matrix for U':")
                print(np.real(Uprime.data))

            return Uprime
#por medio del atributo data asi se puede dibujar en latex
final1 = Statevector.from_instruction(qc)
final2 = Statevector.from_instruction(qc2)
final3 = final1.tensor(final2)
array_to_latex(final3.data, pretext="\\text{Statevector Solution 1= }")

# In[10]:

#Segundo, se utiliza la clase Operator que permite convertir varios objetos en Operators
#entre ellos un circuito, por lo tanto se convierten los dos en Operator y luego
#se realiza la multiplicacion tensorial mediante el metodo tensor el cual da como resultado otro
#operator que es ademas una compuerta unitaria lo que permite adicionarla a un circuito y pintar este
#luego se pinta el statevector de este circuito y se comprueba que es el mismo resultado del metodo anterior
A = Operator(qc)
B = Operator(qc2)
finalal = A.tensor(B)
#Del operator se saca el numero de qubits que contiene
q3 = QuantumRegister(finalal.num_qubits)
#cr = ClassicalRegister(finalal.num_qubits)
qc3 = QuantumCircuit(q3)
qc3.append(finalal, q3)
#qc3.measure(q3, cr)

# In[11]:

#Dibujo del circuito resultante
qc3.draw(output='mpl')

# In[12]:

#Statevector resultante
Exemplo n.º 3
0
def parse_pauli_spec(spec):
    op = Operator(Pauli(label=spec[0]))
    for i in range(1, 4):
        op = op.tensor(Pauli(label=spec[i]))
    return op