def test_private_inversa_por_fila_de_operacoes_elementares(): A = MatrizBiDimensional([[1,2,3],\ [3,5,6],\ [7,1,9]]) identidade = A * A._MatrizBiDimensional__inversa_por_fila_de_operacoes_elementares() for i in range(identidade.linhas): for j in range(identidade.colunas): identidade[i][j] = round(identidade[i][j], 0) assert identidade == MatrizBiDimensional.identidade(3)
def test_ii_propriedade_multiplicacao_matrizes_distributividade(): A = MatrizBiDimensional([[1, 2, 3]]) B = MatrizBiDimensional([[4],\ [5],\ [6]]) C = MatrizBiDimensional([[7],\ [8],\ [9]]) assert A*(B + C) == A*B + A*C
def test_iv_propriedade_associatividade_matrizes_quadradas_aleatorias_ordem_mxn_nxo_oxp_m_n_o_p_aleatorios(): m = random.randint(1,100) n = random.randint(1,100) o = random.randint(1,100) p = random.randint(1,100) A = MatrizBiDimensional([[random.randint(1,1000) for j in range(n)] for i in range(m)]) B = MatrizBiDimensional([[random.randint(1,1000) for j in range(o)] for i in range(n)]) E = MatrizBiDimensional([[random.randint(1,1000) for i in range(p)] for i in range(o)]) assert (A*B)*E == A*(B*E)
def forma_escada_linha_reduzida_matriz_aleatoria_com_verificacao_no_wolfram_alpha(): linhas = random.randint(4, 6) colunas = random.randint(3, 8) A = MatrizBiDimensional([[random.randint(-10,10) for j in range(colunas)] for i in range(linhas)]) A_felr = A.forma_escada_linha_reduzida() A_welr = wolfram_escalonamento_linha_reduzido(A) A_felr = MatrizBiDimensional([[round(A_felr[i][j], 4) for j in range(A_felr.colunas)] for i in range(A_felr.linhas)]) A_welr = MatrizBiDimensional([[round(A_welr[i][j], 4) for j in range(A_welr.colunas)] for i in range(A_welr.linhas)]) return A_felr == A_welr
def test_multiplica_matriz_4_1_por_matriz_1_4(): A = MatrizBiDimensional([[1],\ [1],\ [1],\ [1]]) B = MatrizBiDimensional([[4, 4, 4, 4]]) assert A * B == MatrizBiDimensional([[4, 4, 4, 4],\ [4, 4, 4, 4],\ [4, 4, 4, 4],\ [4, 4, 4, 4]])
def test_private_transformar_demais_elementos_kj_em_nulos(): A = MatrizBiDimensional([[1, 1, 1, 6],\ [4, -3, 2, 0],\ [2, -1, 3, 11],\ [3, 1, 1, 4]]) A._MatrizBiDimensional__transformar_demais_elementos_kj_em_nulos(0, 0) assert A == MatrizBiDimensional([[1, 1, 1, 6],\ [0, -7, -2, -24],\ [0, -3, 1, -1],\ [0, -2, -2, -14]])
def test_excecao_multiplicar_matrizes_dimensoes_inconsistentes(): with pytest.raises(MatrizInconsistenteException) as excinfo: A = MatrizBiDimensional([[1],\ [1],\ [1],\ [1]]) B = MatrizBiDimensional([[4],\ [4],\ [4],\ [4]]) A * B assert "O numero de colunas da matriz multiplicanda deve ser igual ao numero de linhas da matriz multiplicadora" in str(excinfo.value)
def test_multiplica_matriz_4_3_por_matriz_3_1(): A = MatrizBiDimensional([[1, 1, 1],\ [2, 2, 2],\ [3, 3, 3],\ [4, 4, 4]]) B = MatrizBiDimensional([[1],\ [2],\ [3]]) assert A * B == MatrizBiDimensional([[6],\ [12],\ [18],\ [24]])
def test_repr_matriz_3x3_1_a_9(): matriz = MatrizBiDimensional([[1, 2, 3],\ [4, 5, 6],\ [7, 8, 9]]) assert repr(matriz) == '[[1, 2, 3]\n'+\ ' [4, 5, 6]\n'+\ ' [7, 8, 9]]'
def test_v_propriedade_transposicao_se_A_simetrica_A_transposta_igual_A(): m = random.randint(1,100) A = MatrizBiDimensional.zeros(m) for i in range(m): for j in range(i, m): A[i][j] = A[j][i] = random.randint(-100,100) assert A.transpor() == A
def test_repr_matriz_3x3_9_a_1(): matriz = MatrizBiDimensional([[9, 8, 7], [6, 5, 4], [3, 2, 1]]) assert repr(matriz) == '[[9, 8, 7]\n'+\ ' [6, 5, 4]\n'+\ ' [3, 2, 1]]'
def test_v_propriedade_se_A_matriz_hermitiana_A_transposto_hermitiano_igual_A(): m = random.randint(1,100) A = MatrizBiDimensional.zeros(m) complexo_e_conjugado = lambda x: (x, x.conjugate()) for i in range(m): for j in range(i, m): A[i][j],A[j][i] = complexo_e_conjugado(random.uniform(-100,100)) if i == j else complexo_e_conjugado(complex(random.uniform(-100,100),random.uniform(-100,100))) assert A.transposto_hermitiano() == A
def test_excecao_multiplicar_tipo_nao_implementado(): with pytest.raises(TermoMultiplicacaoInvalidoException) as excinfo: A = MatrizBiDimensional([[1],\ [1],\ [1],\ [1]]) A * 'a' assert "O termo da multiplicação é inválido! Somente são aceitos termos dos tipos int, float, complex e MatrizBiDimensional" in str(excinfo.value)
def __produzir_matriz_bi_dimensional_a_partir_de_wolfram_subpod(subpod): resultado_wolfram = subpod['plaintext'].replace('(', '').replace( ')', '').replace('|', ',').replace(' ', '') return MatrizBiDimensional([[ float(numero) if len(numero.split('/')) != 2 else float(numero.split('/')[0]) / float(numero.split('/')[1]) for numero in linha.split(',') ] for linha in resultado_wolfram.split('\n')])
def test_iv_propriedade_conjugacao_hermitiana_matrizes_A_B_complexas_aleatorias_mxn_aleatorios(): m = random.randint(1,100) n = random.randint(1,100) o = random.randint(1,100) A = MatrizBiDimensional([[complex(random.randint(-10,10),random.randint(-10,10)) for j in range(n)] for i in range(m)]) B = MatrizBiDimensional([[complex(random.randint(-10,10),random.randint(-10,10)) for j in range(o)] for i in range(n)]) assert (A * B).transposto_hermitiano() == B.transposto_hermitiano() * A.transposto_hermitiano()
def test_iv_propriedade_transposicao_A_B_multiplicados_transposta_igual_B_transposta_multiplicado_A_transposta(): m = random.randint(1,100) n = random.randint(1,100) o = random.randint(1,100) A = MatrizBiDimensional([[random.randint(1,1000) for j in range(n)] for i in range(m)]) B = MatrizBiDimensional([[random.randint(1,1000) for j in range(o)] for i in range(n)]) assert (A*B).transpor() == B.transpor() * A.transpor()
def test_inversa_adjunta_classica_igual_inversa_fila_operacoes_elementares(): A = MatrizBiDimensional([[1,2,3],\ [3,5,6],\ [7,1,9]]) assert [[round(A.inversa(metodo_adjunta_classica=True)[i][j], 4) for j in range(3)] for i in range(3)] == [[round(A.inversa(metodo_adjunta_classica=False)[i][j], 4) for j in range(3)] for i in range(3)]
def test_matriz_adjunta(): A = MatrizBiDimensional([[1,2,3],\ [3,5,6],\ [7,1,9]]) assert A.adjunta() == MatrizBiDimensional([[39, -15, -3], [15, -12, 3], [-32, 13, -1]])
def test_excecao_matriz_cofatores_nao_quadrada(): with pytest.raises(MatrizInconsistenteException) as excinfo: a = MatrizBiDimensional([[1,2,3],\ [4,5,6]]) a.cofatores() assert 'A matriz especificada não é quadrada, portanto, não pode ter matriz de cofatores calculada!'
def test_comparacao_determinantes_5_matrizes_aleatorias_ordem_3(): for execucao in range(5): A = MatrizBiDimensional([[random.uniform(-5,5) for i in range(3)] for i in range(3)]) assert round(A.determinante(), 4) == round(wolfram_determinante(A), 4)
def test_getitem_linha_2_coluna_3(): matriz = MatrizBiDimensional([[1, 2, 3],\ [4, 5, 6],\ [7, 8, 9]]) assert matriz[1][2] == 6
def test_excecao_determinante_matriz_nao_quadrada(): with pytest.raises(MatrizInconsistenteException) as excinfo: a = MatrizBiDimensional([[1, 2, 3],\ [4, 5, 6]]) a.determinante() assert "A ordem da matriz deve ser quadrada para que seu determinante possa ser calculado" in str(excinfo.value)
def test_private_determinante_somatorio_produtorio_das_permutacoes(): A = MatrizBiDimensional([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) assert A._MatrizBiDimensional__determinante_somatorio_produtorio_das_permutacoes() == 0
def test_private_produtorio_permutacao_2_1_0(): A = MatrizBiDimensional([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) assert A._MatrizBiDimensional__produtorio([2, 1, 0]) == 3*5*7
def test_private_produtorio_permutacao_0_2_1(): A = MatrizBiDimensional([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) assert A._MatrizBiDimensional__produtorio([0, 2, 1]) == 1*6*8
def test_private_sinal_permutacao_1_0_2(): A = MatrizBiDimensional.identidade(3) assert A._MatrizBiDimensional__sinal_permutacao([1, 2, 0]) == 1
def test_private_sinal_permutacao_0_2_1(): A = MatrizBiDimensional.identidade(3) assert A._MatrizBiDimensional__sinal_permutacao([0, 2, 1]) == -1
def test_property_colunas(): matriz = MatrizBiDimensional([[1, 2, 3],\ [4, 5, 6],\ [7, 8, 9]]) assert matriz.colunas == 3
def test_property_ordem(): matriz = MatrizBiDimensional([[1, 2, 3],\ [4, 5, 6]]) assert matriz.ordem == (2, 3)
def test_private_pares_ordenados_para_verificacao_de_sinal_de_permutacoes_matriz_ordem_5(): A = MatrizBiDimensional.identidade(5) assert A._MatrizBiDimensional__pares_ordenados_para_verificacao_de_sinal_de_permutacoes() == [(0,1),(0,2),(0,3),(0,4),(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]