def test_mult_esc_mat(self): self.assertEqual( str(mat_op.mult_esc_mat(complex_cart(5, 2), self.mat_comp_a)), '[[1 + 12i, 1 + 12i], [1 + 12i, 1 + 12i], [1 + 12i, 1 + 12i]]') self.assertEqual( str(mat_op.mult_esc_mat(complex_cart(5, 2), self.mat_comp_b)), '[[3 + 7i, 6 + 14i, 9 + 21i], [3 + 7i, 6 + 14i, 9 + 21i], [3 + 7i, 6 + 14i, 9 + 21i]]' )
def exp_complex_slit(mat): A = mat V = [complex_cart(0, 0) for i in range(len(mat))] V[0] = complex_cart(1, 0) V = mat_op.transpuesta(V) for i in range(2): C = mat_op.mult_mat(A, V) A = mat_op.mult_mat(A, mat) B = mat_op.transpuesta(C[:]) for i in range(len(B)): B[i] = round(B[i].mod()**2, 2) Plot(len(B), B) return mat_op.transpuesta(B)
def mult_esc_mat(A, B): m = len(B) n = len(B[0]) ans = [[complex_cart(0, 0) for i in range(n)] for i in range(m)] for i in range(m): for j in range(n): ans[i][j] = A * B[i][j] return ans
def sum_vect(A, B): if len(A) == len(B): ans = [complex_cart(0, 0) for i in range(len(A))] for i in range(len(A)): ans[i] = A[i] + B[i] return ans else: return 'Los vectores no tienen la misma dimension'
def product_in(A, B): A = adjunta(A) n = len(A) m = len(B) if n == m: ans = complex_cart(0, 0) for i in range(n): ans += A[i][0] * B[i] return ans
def inv_adit_mat(A): m = len(A) n = len(A[0]) ans = [[complex_cart(0, 0) for i in range(n)] for i in range(m)] for i in range(m): for j in range(n): ans[i][j].a = -A[i][j].a ans[i][j].b = -A[i][j].b return ans
def unitary(A): A = mult_mat(A, adjunta(A)) B = mult_mat(adjunta(A), A) ans = True if len(A) == len(A[0]): identy = [[complex_cart(0, 0) for i in range(len(A[0]))] for j in range(len(A))] for i in range(len(A)): identy[i][i] = complex_cart(1, 0) for i in range(len(A)): for j in range(len(A)): if A[i][j].a == B[i][j].a and B[i][j].a == identy[i][j].a and A[ i][j].b == B[i][j].b and B[i][j].b == identy[i][j].b: ans = True else: return False else: return ans else: print('La matriz no es cuadrada')
def inv_adi(A): try: ans = [complex_cart(0, 0) for i in range(len(A))] for i in range(len(A)): ans[i].a = -A[i].a ans[i].b = -A[i].b except: ans = [0 for i in range(len(A))] for i in range(len(A)): ans[i] = -A[i] finally: return ans
def accion(A, B): m, n = len(A), len(A[0]) m_b = len(B) if n == m_b: ans = [0 for i in range(m)] for i in range(m): suma = complex_cart(0, 0) for j in range(n): suma += A[i][j] * B[j] ans[i] = suma return ans else: return 'La acción no se puede calcular '
def mult_mat(A, B): m_a = len(A) n_a = len(A[0]) m_b = len(B) n_b = len(B[0]) if n_a == m_b: ans = [[complex_cart(0, 0) for i in range(len(B[0]))] for i in range(len(A))] for i in range(len(A)): for j in range(len(B[0])): for k in range(len(A[0])): ans[i][j] += A[i][k] * B[k][j] return ans else: return 'Error, el producto entre matrices no se puede'
def Measuring(observable, ket): observable = [[ complex(observable[i][j].a, observable[i][j].b) for j in range(len(observable[i])) ] for i in range(len(observable))] A = np.array(observable) eigenvalues, eigenvects = np.linalg.eig(A) c = [] b = [] for i in range(len(eigenvects)): d = [] b += [complex_cart(eigenvalues[i].real, eigenvalues[i].imag)] for j in range(len(eigenvects[i])): z = eigenvects[i][j] d += [complex_cart(z.real, z.imag)] c += [d] if ket is None: return (b, c) else: prob = [] for i in range(len(b)): prob += [(mat_op.product_in(mat_op.transpuesta(ket), c[i])).mod()**2] return (b, c, prob)
def Quantum_states(x, ket, ket_a): ket = mat_op.transpuesta(ket) if ket_a is None: ans = [] for i in range(len(ket)): prob = (round((ket[i].mod()**2), 2)) / (round( (mat_op.norma_vect(ket)**2), 2)) ans += [prob] return ans[x] else: ket_a = mat_op.transpuesta(ket_a) ans = mat_op.product_in(ket_a, ket) norma_ket = mat_op.norma_vect(ket) norma_ket_a = mat_op.norma_vect(ket_a) b = norma_ket * norma_ket_a return complex_cart(ans.a / b, ans.b / b)
def setUp(self): self.mat_bool = [[False, False, False, False, False, False], [False, False, False, False, False, False], [False, True, False, False, False, True], [False, False, False, True, False, False], [False, False, True, False, False, False], [True, False, False, False, True, False]] self.vect_bool = [False, False, True, False, False, False] self.mat_real = [[0, 1 / 6, 5 / 6], [1 / 3, 1 / 2, 1 / 6], [2 / 3, 1 / 3, 0]] self.vect_real = ([1 / 6, 1 / 6, 2 / 3]) A = [[complex_cart(0, 0) for i in range(8)] for j in range(8)] A[1][0] = complex_cart(1 / math.sqrt(2), 0) A[2][0] = complex_cart(1 / math.sqrt(2), 0) A[3][1] = complex_cart(-1 / math.sqrt(6), 1 / math.sqrt(6)) A[3][3] = complex_cart(1, 0) A[4][1] = complex_cart(-1 / math.sqrt(6), -1 / math.sqrt(6)) A[4][4] = complex_cart(1, 0) A[5][1] = complex_cart(1 / math.sqrt(6), -1 / math.sqrt(6)) A[5][2] = complex_cart(-1 / math.sqrt(6), 1 / math.sqrt(6)) A[5][5] = complex_cart(1, 0) A[6][2] = complex_cart(-1 / math.sqrt(6), -1 / math.sqrt(6)) A[6][6] = complex_cart(1, 0) A[7][2] = complex_cart(1 / math.sqrt(6), -1 / math.sqrt(6)) A[7][7] = complex_cart(1, 0) self.mat_compleja = A B = [[complex_cart(0, 0) for i in range(3)] for j in range(3)] B[0][0] = complex_cart(1 / math.sqrt(2), 0) B[1][0] = complex_cart(0, -1 / math.sqrt(2)) B[0][1] = complex_cart(1 / math.sqrt(2), 0) B[1][1] = complex_cart(0, 1 / math.sqrt(2)) B[2][2] = complex_cart(0, -1) self.complex_mat = B self.complex_vect = [ complex_cart(1 / math.sqrt(3), 0), complex_cart(0, 2 / math.sqrt(15)), complex_cart(math.sqrt(2 / 5), 0) ]
def Problem(x): if x == '4.3.1': observable = [[complex_cart(0, 0), complex_cart(1, 0)], [complex_cart(1, 0), complex_cart(0, 0)]] ket = [[complex_cart(1, 0)], [complex_cart(0, 0)]] ans = Measuring(observable, ket) return ans[1] elif x == '4.3.2': observable = [[complex_cart(0, 0), complex_cart(1, 0)], [complex_cart(1, 0), complex_cart(0, 0)]] ket = [[complex_cart(1, 0)], [complex_cart(0, 0)]] ans = Measuring(observable, ket) value = ans[0][0] * complex_cart( ans[2][0], 0) + ans[0][1] * complex_cart(ans[2][1], 0) print(value) ans_1 = mat_op.mult_mat(observable, ket) media = mat_op.product_in(mat_op.transpuesta(ans_1), mat_op.transpuesta(ket)) print(media) print( 'El valor de la distribucion hallado es igual al que se obtiene en el calculo de la media' ) return (media) elif x == '4.4.1': U_1 = [[complex_cart(0, 0), complex_cart(1, 0)], [complex_cart(1, 0), complex_cart(0, 0)]] U_2 = [[ complex_cart(math.sqrt(2 / 4), 0), complex_cart(math.sqrt(2 / 4), 0) ], [ complex_cart(math.sqrt(2 / 4), 0), complex_cart(-math.sqrt(2 / 4), 0) ]] print(mat_op.unitary(U_1, ), mat_op.unitary(U_2)) print('Las dos matrices son unitarias') U_3 = mat_op.mult_mat(U_1, U_2) print(mat_op.unitary(U_3)) print('El producto de las matrices es unitario') return [mat_op.unitary(U_3)] elif x == '4.4.2': U_n = [[ complex_cart(0, 0), complex_cart(1 / math.sqrt(2), 0), complex_cart(1 / math.sqrt(2), 0), complex_cart(0, 0) ], [ complex_cart(0, 1 / math.sqrt(2)), complex_cart(0, 0), complex_cart(0, 0), complex_cart(1 / math.sqrt(2), 0) ], [ complex_cart(1 / math.sqrt(2), 0), complex_cart(0, 0), complex_cart(0, 0), complex_cart(0, 1 / math.sqrt(2)) ], [ complex_cart(0, 0), complex_cart(1 / math.sqrt(2), 0), complex_cart(-1 / math.sqrt(2), 0), complex_cart(0, 0) ]] state = state = mat_op.transpuesta([ complex_cart(1, 0), complex_cart(0, 0), complex_cart(0, 0), complex_cart(0, 0) ]) ans = Dynamics(3, U_n, state) return ans[3] elif x == '4.5.2': return 'hola' else: return 'EL ejercicio no fue propuesto'
def Identy(n): ans = [[complex_cart(0, 0) for i in range(n)] for j in range(n)] for i in range(n): ans[i][i] = complex_cart(1, 0) return ans
def test_accion(self): a = [[complex_cart(-1, 0), complex_cart(1, 1), complex_cart(0, 0)], [complex_cart(2, -1), complex_cart(0, 0), complex_cart(1, 0)], [complex_cart(0, 0), complex_cart(1, -1), complex_cart(0, 1)]] b = [complex_cart(1, 0), complex_cart(1, 1), complex_cart(0, 1)] self.assertEqual(str(mat_op.accion(a, b)), '[-1 + 2i, 2 + 0i, 1 + 0i]')
def setUp(self): """Genera números complejos, unos en forma polar, y otros en forma cartesiana""" self.complex_a = complex_cart(1, 2) self.complex_b = complex_cart(2, 4) self.complex_c = complex_cart(-6, 2) self.complex_d = complex_cart(-5, -8) self.complex_e = complex_cart(0, 0) self.complex_f = complex_cart(1, 1) self.complex_h = complex_cart(1 / 2, 3 / 4) self.complex_A = complex_polar(8, (3 * math.pi) / 4) self.complex_B = complex_polar(3, (23 * math.pi) / 22) self.complex_C = complex_polar(24, (3 * math.pi) / 5) self.complex_D = complex_polar(4.47, 1.11) self.mat_num_B = [[1, 2, 3], [1, 2, 3], [1, 2, 3]] self.mat_num_A = [[1, 2], [1, 2], [1, 2]] self.vect_num_C = [1, 2, 3] self.vect_num_D = [1, 2, 3, 4] self.mat_comp_a = [[complex_cart(1, 2), complex_cart(1, 2)], [complex_cart(1, 2), complex_cart(1, 2)], [complex_cart(1, 2), complex_cart(1, 2)]] self.mat_comp_b = [ [complex_cart(1, 1), complex_cart(2, 2), complex_cart(3, 3)], [complex_cart(1, 1), complex_cart(2, 2), complex_cart(3, 3)], [complex_cart(1, 1), complex_cart(2, 2), complex_cart(3, 3)] ] self.vect_comp_c = [ complex_cart(1, 1), complex_cart(2, 2), complex_cart(3, 3) ] self.vect_comp_d = [ complex_cart(1, 1), complex_cart(2, 2), complex_cart(3, 3), complex_cart(4, 4) ]
def test_product_in(self): a = [complex_cart(1, 0), complex_cart(0, 1), complex_cart(1, -3)] b = [complex_cart(2, 1), complex_cart(0, 1), complex_cart(2, 0)] self.assertEqual(str(mat_op.product_in(a, b)), '(5, 7)')
def test_norma_vect(self): a = [complex_cart(3.4, 4.6), complex_cart(2.2, -7.1)] b = [complex_cart(8.2, 5.3), complex_cart(8.1, -8.0)] self.assertEqual(mat_op.norma_vect(a), 9.38) self.assertEqual(mat_op.norma_vect(b), 15.0)
def test_unitary(self): a = [[complex_cart(0, 0) for i in range(3)] for i in range(3)] for i in range(3): a[i][i] = complex_cart(0, 1) self.assertEqual(mat_op.unitary(a), True) self.assertEqual(mat_op.unitary(self.mat_comp_b), False)
def test_hermitian(self): a = [[complex_cart(5, 0), complex_cart(3, 7)], [complex_cart(3, -7), complex_cart(2, 0)]] self.assertEqual(mat_op.hermitian(a), True) self.assertEqual(mat_op.hermitian(self.mat_comp_b), False)
def test_mul_esc_vect(self): self.assertEqual(mat_op.mul_esc_vect(5, self.vect_num_C), [5, 10, 15]) self.assertEqual( str(mat_op.mul_esc_vect(complex_cart(5, 5), self.vect_comp_d)), '[0 + 10i, 0 + 20i, 0 + 30i, 0 + 40i]')