| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414 | import randomfrom sympy.core.numbers import Ifrom sympy.core.numbers import Rationalfrom sympy.core.symbol import (Symbol, symbols)from sympy.functions.elementary.miscellaneous import sqrtfrom sympy.polys.polytools import Polyfrom sympy.matrices import Matrix, eye, onesfrom sympy.abc import x, y, zfrom sympy.testing.pytest import raisesfrom sympy.matrices.common import NonSquareMatrixErrorfrom sympy.functions.combinatorial.factorials import factorial, subfactorialdef test_determinant():    M = Matrix()    assert M.det() == 1    # Evaluating these directly because they are never reached via M.det()    assert M._eval_det_bareiss() == 1    assert M._eval_det_berkowitz() == 1    assert M._eval_det_lu() == 1    M = Matrix([ [0] ])    assert M.det() == 0    assert M._eval_det_bareiss() == 0    assert M._eval_det_berkowitz() == 0    assert M._eval_det_lu() == 0    M = Matrix([ [5] ])    assert M.det() == 5    assert M._eval_det_bareiss() == 5    assert M._eval_det_berkowitz() == 5    assert M._eval_det_lu() == 5    M = Matrix(( (-3,  2),                 ( 8, -5) ))    assert M.det(method="domain-ge") == -1    assert M.det(method="bareiss") == -1    assert M.det(method="berkowitz") == -1    assert M.det(method="lu") == -1    M = Matrix(( (x,   1),                 (y, 2*y) ))    assert M.det(method="domain-ge") == 2*x*y - y    assert M.det(method="bareiss") == 2*x*y - y    assert M.det(method="berkowitz") == 2*x*y - y    assert M.det(method="lu") == 2*x*y - y    M = Matrix(( (1, 1, 1),                 (1, 2, 3),                 (1, 3, 6) ))    assert M.det(method="domain-ge") == 1    assert M.det(method="bareiss") == 1    assert M.det(method="berkowitz") == 1    assert M.det(method="lu") == 1    M = Matrix(( ( 3, -2,  0, 5),                 (-2,  1, -2, 2),                 ( 0, -2,  5, 0),                 ( 5,  0,  3, 4) ))    assert M.det(method="domain-ge") == -289    assert M.det(method="bareiss") == -289    assert M.det(method="berkowitz") == -289    assert M.det(method="lu") == -289    M = Matrix(( ( 1,  2,  3,  4),                 ( 5,  6,  7,  8),                 ( 9, 10, 11, 12),                 (13, 14, 15, 16) ))    assert M.det(method="domain-ge") == 0    assert M.det(method="bareiss") == 0    assert M.det(method="berkowitz") == 0    assert M.det(method="lu") == 0    M = Matrix(( (3, 2, 0, 0, 0),                 (0, 3, 2, 0, 0),                 (0, 0, 3, 2, 0),                 (0, 0, 0, 3, 2),                 (2, 0, 0, 0, 3) ))    assert M.det(method="domain-ge") == 275    assert M.det(method="bareiss") == 275    assert M.det(method="berkowitz") == 275    assert M.det(method="lu") == 275    M = Matrix(( ( 3,  0,  0, 0),                 (-2,  1,  0, 0),                 ( 0, -2,  5, 0),                 ( 5,  0,  3, 4) ))    assert M.det(method="domain-ge") == 60    assert M.det(method="bareiss") == 60    assert M.det(method="berkowitz") == 60    assert M.det(method="lu") == 60    M = Matrix(( ( 1,  0,  0,  0),                 ( 5,  0,  0,  0),                 ( 9, 10, 11, 0),                 (13, 14, 15, 16) ))    assert M.det(method="domain-ge") == 0    assert M.det(method="bareiss") == 0    assert M.det(method="berkowitz") == 0    assert M.det(method="lu") == 0    M = Matrix(( (3, 2, 0, 0, 0),                 (0, 3, 2, 0, 0),                 (0, 0, 3, 2, 0),                 (0, 0, 0, 3, 2),                 (0, 0, 0, 0, 3) ))    assert M.det(method="domain-ge") == 243    assert M.det(method="bareiss") == 243    assert M.det(method="berkowitz") == 243    assert M.det(method="lu") == 243    M = Matrix(( (1, 0,  1,  2, 12),                 (2, 0,  1,  1,  4),                 (2, 1,  1, -1,  3),                 (3, 2, -1,  1,  8),                 (1, 1,  1,  0,  6) ))    assert M.det(method="domain-ge") == -55    assert M.det(method="bareiss") == -55    assert M.det(method="berkowitz") == -55    assert M.det(method="lu") == -55    M = Matrix(( (-5,  2,  3,  4,  5),                 ( 1, -4,  3,  4,  5),                 ( 1,  2, -3,  4,  5),                 ( 1,  2,  3, -2,  5),                 ( 1,  2,  3,  4, -1) ))    assert M.det(method="domain-ge") == 11664    assert M.det(method="bareiss") == 11664    assert M.det(method="berkowitz") == 11664    assert M.det(method="lu") == 11664    M = Matrix(( ( 2,  7, -1, 3, 2),                 ( 0,  0,  1, 0, 1),                 (-2,  0,  7, 0, 2),                 (-3, -2,  4, 5, 3),                 ( 1,  0,  0, 0, 1) ))    assert M.det(method="domain-ge") == 123    assert M.det(method="bareiss") == 123    assert M.det(method="berkowitz") == 123    assert M.det(method="lu") == 123    M = Matrix(( (x, y, z),                 (1, 0, 0),                 (y, z, x) ))    assert M.det(method="domain-ge") == z**2 - x*y    assert M.det(method="bareiss") == z**2 - x*y    assert M.det(method="berkowitz") == z**2 - x*y    assert M.det(method="lu") == z**2 - x*y    # issue 13835    a = symbols('a')    M = lambda n: Matrix([[i + a*j for i in range(n)]                          for j in range(n)])    assert M(5).det() == 0    assert M(6).det() == 0    assert M(7).det() == 0def test_issue_14517():    M = Matrix([        [   0, 10*I,    10*I,       0],        [10*I,    0,       0,    10*I],        [10*I,    0, 5 + 2*I,    10*I],        [   0, 10*I,    10*I, 5 + 2*I]])    ev = M.eigenvals()    # test one random eigenvalue, the computation is a little slow    test_ev = random.choice(list(ev.keys()))    assert (M - test_ev*eye(4)).det() == 0def test_legacy_det():    # Minimal support for legacy keys for 'method' in det()    # Partially copied from test_determinant()    M = Matrix(( ( 3, -2,  0, 5),                 (-2,  1, -2, 2),                 ( 0, -2,  5, 0),                 ( 5,  0,  3, 4) ))    assert M.det(method="bareis") == -289    assert M.det(method="det_lu") == -289    assert M.det(method="det_LU") == -289    M = Matrix(( (3, 2, 0, 0, 0),                 (0, 3, 2, 0, 0),                 (0, 0, 3, 2, 0),                 (0, 0, 0, 3, 2),                 (2, 0, 0, 0, 3) ))    assert M.det(method="bareis") == 275    assert M.det(method="det_lu") == 275    assert M.det(method="Bareis") == 275    M = Matrix(( (1, 0,  1,  2, 12),                 (2, 0,  1,  1,  4),                 (2, 1,  1, -1,  3),                 (3, 2, -1,  1,  8),                 (1, 1,  1,  0,  6) ))    assert M.det(method="bareis") == -55    assert M.det(method="det_lu") == -55    assert M.det(method="BAREISS") == -55    M = Matrix(( ( 3,  0,  0, 0),                 (-2,  1,  0, 0),                 ( 0, -2,  5, 0),                 ( 5,  0,  3, 4) ))    assert M.det(method="bareiss") == 60    assert M.det(method="berkowitz") == 60    assert M.det(method="lu") == 60    M = Matrix(( ( 1,  0,  0,  0),                 ( 5,  0,  0,  0),                 ( 9, 10, 11, 0),                 (13, 14, 15, 16) ))    assert M.det(method="bareiss") == 0    assert M.det(method="berkowitz") == 0    assert M.det(method="lu") == 0    M = Matrix(( (3, 2, 0, 0, 0),                 (0, 3, 2, 0, 0),                 (0, 0, 3, 2, 0),                 (0, 0, 0, 3, 2),                 (0, 0, 0, 0, 3) ))    assert M.det(method="bareiss") == 243    assert M.det(method="berkowitz") == 243    assert M.det(method="lu") == 243    M = Matrix(( (-5,  2,  3,  4,  5),                 ( 1, -4,  3,  4,  5),                 ( 1,  2, -3,  4,  5),                 ( 1,  2,  3, -2,  5),                 ( 1,  2,  3,  4, -1) ))    assert M.det(method="bareis") == 11664    assert M.det(method="det_lu") == 11664    assert M.det(method="BERKOWITZ") == 11664    M = Matrix(( ( 2,  7, -1, 3, 2),                 ( 0,  0,  1, 0, 1),                 (-2,  0,  7, 0, 2),                 (-3, -2,  4, 5, 3),                 ( 1,  0,  0, 0, 1) ))    assert M.det(method="bareis") == 123    assert M.det(method="det_lu") == 123    assert M.det(method="LU") == 123def eye_Determinant(n):    return Matrix(n, n, lambda i, j: int(i == j))def zeros_Determinant(n):    return Matrix(n, n, lambda i, j: 0)def test_det():    a = Matrix(2, 3, [1, 2, 3, 4, 5, 6])    raises(NonSquareMatrixError, lambda: a.det())    z = zeros_Determinant(2)    ey = eye_Determinant(2)    assert z.det() == 0    assert ey.det() == 1    x = Symbol('x')    a = Matrix(0, 0, [])    b = Matrix(1, 1, [5])    c = Matrix(2, 2, [1, 2, 3, 4])    d = Matrix(3, 3, [1, 2, 3, 4, 5, 6, 7, 8, 8])    e = Matrix(4, 4,        [x, 1, 2, 3, 4, 5, 6, 7, 2, 9, 10, 11, 12, 13, 14, 14])    from sympy.abc import i, j, k, l, m, n    f = Matrix(3, 3, [i, l, m, 0, j, n, 0, 0, k])    g = Matrix(3, 3, [i, 0, 0, l, j, 0, m, n, k])    h = Matrix(3, 3, [x**3, 0, 0, i, x**-1, 0, j, k, x**-2])    # the method keyword for `det` doesn't kick in until 4x4 matrices,    # so there is no need to test all methods on smaller ones    assert a.det() == 1    assert b.det() == 5    assert c.det() == -2    assert d.det() == 3    assert e.det() == 4*x - 24    assert e.det(method="domain-ge") == 4*x - 24    assert e.det(method='bareiss') == 4*x - 24    assert e.det(method='berkowitz') == 4*x - 24    assert f.det() == i*j*k    assert g.det() == i*j*k    assert h.det() == 1    raises(ValueError, lambda: e.det(iszerofunc="test"))def test_permanent():    M = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])    assert M.per() == 450    for i in range(1, 12):        assert ones(i, i).per() == ones(i, i).T.per() == factorial(i)        assert (ones(i, i)-eye(i)).per() == (ones(i, i)-eye(i)).T.per() == subfactorial(i)    a1, a2, a3, a4, a5 = symbols('a_1 a_2 a_3 a_4 a_5')    M = Matrix([a1, a2, a3, a4, a5])    assert M.per() == M.T.per() == a1 + a2 + a3 + a4 + a5def test_adjugate():    x = Symbol('x')    e = Matrix(4, 4,        [x, 1, 2, 3, 4, 5, 6, 7, 2, 9, 10, 11, 12, 13, 14, 14])    adj = Matrix([        [   4,         -8,         4,         0],        [  76, -14*x - 68,  14*x - 8, -4*x + 24],        [-122, 17*x + 142, -21*x + 4,  8*x - 48],        [  48,  -4*x - 72,       8*x, -4*x + 24]])    assert e.adjugate() == adj    assert e.adjugate(method='bareiss') == adj    assert e.adjugate(method='berkowitz') == adj    a = Matrix(2, 3, [1, 2, 3, 4, 5, 6])    raises(NonSquareMatrixError, lambda: a.adjugate())def test_util():    R = Rational    v1 = Matrix(1, 3, [1, 2, 3])    v2 = Matrix(1, 3, [3, 4, 5])    assert v1.norm() == sqrt(14)    assert v1.project(v2) == Matrix(1, 3, [R(39)/25, R(52)/25, R(13)/5])    assert Matrix.zeros(1, 2) == Matrix(1, 2, [0, 0])    assert ones(1, 2) == Matrix(1, 2, [1, 1])    assert v1.copy() == v1    # cofactor    assert eye(3) == eye(3).cofactor_matrix()    test = Matrix([[1, 3, 2], [2, 6, 3], [2, 3, 6]])    assert test.cofactor_matrix() == \        Matrix([[27, -6, -6], [-12, 2, 3], [-3, 1, 0]])    test = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])    assert test.cofactor_matrix() == \        Matrix([[-3, 6, -3], [6, -12, 6], [-3, 6, -3]])def test_cofactor_and_minors():    x = Symbol('x')    e = Matrix(4, 4,        [x, 1, 2, 3, 4, 5, 6, 7, 2, 9, 10, 11, 12, 13, 14, 14])    m = Matrix([        [ x,  1,  3],        [ 2,  9, 11],        [12, 13, 14]])    cm = Matrix([        [ 4,         76,       -122,        48],        [-8, -14*x - 68, 17*x + 142, -4*x - 72],        [ 4,   14*x - 8,  -21*x + 4,       8*x],        [ 0,  -4*x + 24,   8*x - 48, -4*x + 24]])    sub = Matrix([            [x, 1,  2],            [4, 5,  6],            [2, 9, 10]])    assert e.minor_submatrix(1, 2) == m    assert e.minor_submatrix(-1, -1) == sub    assert e.minor(1, 2) == -17*x - 142    assert e.cofactor(1, 2) == 17*x + 142    assert e.cofactor_matrix() == cm    assert e.cofactor_matrix(method="bareiss") == cm    assert e.cofactor_matrix(method="berkowitz") == cm    raises(ValueError, lambda: e.cofactor(4, 5))    raises(ValueError, lambda: e.minor(4, 5))    raises(ValueError, lambda: e.minor_submatrix(4, 5))    a = Matrix(2, 3, [1, 2, 3, 4, 5, 6])    assert a.minor_submatrix(0, 0) == Matrix([[5, 6]])    raises(ValueError, lambda:        Matrix(0, 0, []).minor_submatrix(0, 0))    raises(NonSquareMatrixError, lambda: a.cofactor(0, 0))    raises(NonSquareMatrixError, lambda: a.minor(0, 0))    raises(NonSquareMatrixError, lambda: a.cofactor_matrix())def test_charpoly():    x, y = Symbol('x'), Symbol('y')    z, t = Symbol('z'), Symbol('t')    from sympy.abc import a,b,c    m = Matrix(3, 3, [1, 2, 3, 4, 5, 6, 7, 8, 9])    assert eye_Determinant(3).charpoly(x) == Poly((x - 1)**3, x)    assert eye_Determinant(3).charpoly(y) == Poly((y - 1)**3, y)    assert m.charpoly() == Poly(x**3 - 15*x**2 - 18*x, x)    raises(NonSquareMatrixError, lambda: Matrix([[1], [2]]).charpoly())    n = Matrix(4, 4, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])    assert n.charpoly() == Poly(x**4, x)    n = Matrix(4, 4, [45, 0, 0, 0, 0, 23, 0, 0, 0, 0, 87, 0, 0, 0, 0, 12])    assert n.charpoly() == Poly(x**4 - 167*x**3 + 8811*x**2 - 173457*x + 1080540, x)    n = Matrix(3, 3, [x, 0, 0, a, y, 0, b, c, z])    assert n.charpoly() == Poly(t**3 - (x+y+z)*t**2 + t*(x*y+y*z+x*z) - x*y*z, t)
 |