EXAMPLES:
We create a 3x3 matrix with rational entries and do some operations with it.
sage: a = matrix(QQ, 3,3, [1,2/3, -4/5, 1,1,1, 8,2, -3/19]); a
[ 1 2/3 -4/5]
[ 1 1 1]
[ 8 2 -3/19]
sage: a.det()
2303/285
sage: a.charpoly()
x^3 - 35/19*x^2 + 1259/285*x - 2303/285
sage: b = a^(-1); b
[ -615/2303 -426/2303 418/2303]
[ 2325/2303 1779/2303 -513/2303]
[-1710/2303 950/2303 95/2303]
sage: b.det()
285/2303
sage: a == b
False
sage: a < b
False
sage: b < a
True
sage: a > b
True
sage: a*b
[1 0 0]
[0 1 0]
[0 0 1]
TESTS:
sage: a = matrix(QQ,2,range(4), sparse=False)
sage: loads(dumps(a)) == a
True
Copy a matrix over QQ.
EXAMPLES:
sage: a = MatrixSpace(QQ,3)([1/n for n in range(1,10)])
sage: -a
[ -1 -1/2 -1/3]
[-1/4 -1/5 -1/6]
[-1/7 -1/8 -1/9]
EXAMPLES:
sage: a = matrix(QQ,3,range(9))
sage: a.inverse()
...
ZeroDivisionError: input matrix must be nonsingular
sage: a = matrix(QQ, 2, [1, 5, 17, 3])
sage: a.inverse()
[-3/82 5/82]
[17/82 -1/82]
INPUT:
check_invertible - default: True (whether to check that matrix is invertible)
algorithm
- default: “default” – use special cased code or pari up to 25 rows, then use iml
- “pari” – use pari
- “iml” – use an iml-based algorithm
OUTPUT: the inverse of self
Note
EXAMPLES:
sage: a = matrix(QQ,3,[1,2,5,3,2,1,1,1,1,])
sage: a.__invert__main(check_invertible=False)
[1/2 3/2 -4]
[ -1 -2 7]
[1/2 1/2 -2]
A 1x1 matrix (a special case):
sage: a = matrix(QQ, 1, [390284089234])
sage: a.__invert__main()
[1/390284089234]
A 2x2 matrix (a special hand-coded case):
sage: a = matrix(QQ, 2, [1, 5, 17, 3]); a
[ 1 5]
[17 3]
sage: a.inverse()
[-3/82 5/82]
[17/82 -1/82]
sage: a.__invert__main() * a
[1 0]
[0 1]
Negate a matrix over QQ.
EXAMPLES:
sage: a = MatrixSpace(QQ,3)([1/n for n in range(1,10)])
sage: -a
[ -1 -1/2 -1/3]
[-1/4 -1/5 -1/6]
[-1/7 -1/8 -1/9]
Add two dense matrices over QQ.
EXAMPLES:
sage: a = MatrixSpace(QQ,3)(range(9))
sage: b = MatrixSpace(QQ,3)([1/n for n in range(1,10)])
sage: a+b
[ 1 3/2 7/3]
[13/4 21/5 31/6]
[43/7 57/8 73/9]
sage: b.swap_rows(1,2)
sage: #a+b
Unsafe technical function that very quickly adds the j-th column of A to the i-th column of self.
Does not check mutability.
Return the adjoint of this matrix.
Assumes self is a square matrix (checked in adjoint).
EXAMPLES:
sage: m = matrix(QQ,3,[1..9])/9; m
[1/9 2/9 1/3]
[4/9 5/9 2/3]
[7/9 8/9 1]
sage: m.adjoint()
[-1/27 2/27 -1/27]
[ 2/27 -4/27 2/27]
[-1/27 2/27 -1/27]
INPUT:
OUTPUT: D*self, D
The product is a matrix over ZZ
EXAMPLES:
sage: a = matrix(QQ,2,[-1/6,-7,3,5/4]); a
[-1/6 -7]
[ 3 5/4]
sage: a._clear_denom()
([ -2 -84]
[ 36 15], 12)
Returns the decomposition of the free module on which this matrix A acts from the right (i.e., the action is x goes to x A), along with whether this matrix acts irreducibly on each factor. The factors are guaranteed to be sorted in the same way as the corresponding factors of the characteristic polynomial.
INPUT:
Note
IMPORTANT: If you expect that the subspaces in the answer are spanned by vectors with small height coordinates, use algorithm=’multimodular’ and height_guess=1; this is potentially much faster than the default. If you know for a fact the answer will be very small, use algorithm=’multimodular’, height_guess=bound on height, proof=False
OUTPUT:
Return the determinant of this matrix computed using pari.
Returns reduced row-echelon form using a multi-modular algorithm. Does not change self.
REFERENCE:
INPUT:
Compute the echelon form of self using classical algorithm and set the pivots of self. This is useful when the input matrix is small, or for timing or educational purposes.
EXAMPLES:
sage: a = matrix(QQ,2,[1..6])
sage: P = a._echelon_in_place_classical(); a
[ 1 0 -1]
[ 0 1 2]
Return space separated string of the entries in this matrix, in the given base. This is optimized for speed.
INPUT: base -an integer = 36; (default: 10)
EXAMPLES:
sage: m = matrix(QQ,2,3,[1,2/3,-3/4,1,-2/3,-45/17])
sage: m._export_as_string(10)
'1 2/3 -3/4 1 -2/3 -45/17'
sage: m._export_as_string(16)
'1 2/3 -3/4 1 -2/3 -2d/11'
Return the inverse of this matrix computed using pari.
EXAMPLES:
sage: matrix(QQ,2,[1,2,3,4])._invert_pari()
[ -2 1]
[ 3/2 -1/2]
Optimizations: When doing the rational_recon lift of a (mod m) first see if |a| < sqrt(m/2) in which case it lifts to an integer (often a=0 or 1).
If that fails, keep track of the lcm d of denominators found so far, and check to see if z = a*d lifts to an integer with |z| <= sqrt(m/2). If so, no need to do rational recon. This should be the case for most a after a while, and should saves substantial time!
EXAMPLES:
sage: a = matrix(QQ,2,range(6))
sage: (3/4) * a
[ 0 3/4 3/2]
[ 9/4 3 15/4]
EXAMPLES:
sage: m = matrix(QQ,2,3,[1,2/3,-3/4,1,-2/3,-45/17])
sage: m._magma_init_(magma)
'Matrix(RationalField(),2,3,StringToIntegerSequence("204 136 -153 204 -136 -540"))/204'
sage: magma(m) # optional - magma
[ 1 2/3 -3/4]
[ 1 -2/3 -45/17]
Use the standard matrix multiplication algorithm.
This is never used by default, since it is slow.
EXAMPLES:
sage: n = 3
sage: a = matrix(QQ,n,range(n^2))/3
sage: b = matrix(QQ,n,range(1, n^2 + 1))/5
sage: a._multiply_classical(b)
[ 6/5 7/5 8/5]
[18/5 22/5 26/5]
[ 6 37/5 44/5]
Multiply this matrix by right using a multimodular algorithm and return the result.
INPUT:
EXAMPLES:
sage: a = MatrixSpace(QQ,10,5)(range(50))
sage: b = MatrixSpace(QQ,5,12)([1/n for n in range(1,61)])
sage: a._multiply_over_integers(b) == a._multiply_over_integers(b, algorithm='multimodular')
True
sage: a = MatrixSpace(QQ,3)(range(9))
sage: b = MatrixSpace(QQ,3)([1/n for n in range(1,10)])
sage: a._multiply_over_integers(b, algorithm = 'multimodular')
[ 15/28 9/20 7/18]
[ 33/7 117/40 20/9]
[249/28 27/5 73/18]
Return the product of self and right, computed using PARI.
EXAMPLES:
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9])._multiply_pari(matrix(QQ,2,[1,2,3,4]))
[ -9/5 -34/15]
[ 25/12 59/18]
We verify that 0 rows or columns works:
sage: x = matrix(QQ,2,0); y= matrix(QQ,0,2); x*y
[0 0]
[0 0]
Return pari version of this matrix.
EXAMPLES:
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9])._pari_()
[1/5, -2/3; 3/4, 4/9]
Return the rank of this matrix computed using pari.
EXAMPLES:
sage: matrix(QQ,3,[1..9])._rank_pari()
2
Set row i of self to -(row r of A), but where we only take the given column positions in that row of A. We do not zero out the other entries of self’s row i either.
INPUT:
EXAMPLES:
sage: a = matrix(QQ,2,3,range(6)); a
[0 1 2]
[3 4 5]
sage: a._set_row_to_negative_of_row_of_A_using_subset_of_columns(0,a,1,[1,2])
sage: a
[-4 -5 2]
[ 3 4 5]
Subtract two dense matrices over QQ.
EXAMPLES:
sage: a = MatrixSpace(QQ,3)(range(9))
sage: b = MatrixSpace(QQ,3)([1/n for n in range(1,10)])
sage: a-b
[ -1 1/2 5/3]
[11/4 19/5 29/6]
[41/7 55/8 71/9]
Returns the antitranspose of self, without changing self.
EXAMPLES:
sage: A = matrix(QQ,2,3,range(6))
sage: type(A)
<type 'sage.matrix.matrix_rational_dense.Matrix_rational_dense'>
sage: A.antitranspose()
[5 2]
[4 1]
[3 0]
sage: A
[0 1 2]
[3 4 5]
sage: A.subdivide(1,2); A
[0 1|2]
[---+-]
[3 4|5]
sage: A.antitranspose()
[5|2]
[-+-]
[4|1]
[3|0]
Create the matrix over R with entries the entries of self coerced into R.
EXAMPLES:
sage: a = matrix(QQ,2,[1/2,-1,2,3])
sage: a.change_ring(GF(3))
[2 2]
[2 0]
sage: a.change_ring(ZZ)
...
TypeError: matrix has denominators so can't change to ZZ.
sage: b = a.change_ring(QQ['x']); b
[1/2 -1]
[ 2 3]
sage: b.parent()
Full MatrixSpace of 2 by 2 dense matrices over Univariate Polynomial Ring in x over Rational Field
TESTS:
Make sure that subdivisions are preserved when changing rings:
sage: a = matrix(QQ, 3, range(9))
sage: a.subdivide(2,1); a
[0|1 2]
[3|4 5]
[-+---]
[6|7 8]
sage: a.change_ring(ZZ).change_ring(QQ)
[0|1 2]
[3|4 5]
[-+---]
[6|7 8]
sage: a.change_ring(GF(3))
[0|1 2]
[0|1 2]
[-+---]
[0|1 2]
Return the characteristic polynomial of this matrix.
INPUT:
OUTPUT: a polynomial over the rational numbers.
EXAMPLES:
sage: a = matrix(QQ, 3, [4/3, 2/5, 1/5, 4, -3/2, 0, 0, -2/3, 3/4])
sage: f = a.charpoly(); f
x^3 - 7/12*x^2 - 149/40*x + 97/30
sage: f(a)
[0 0 0]
[0 0 0]
[0 0 0]
Return the i-th column of this matrix as a dense vector.
EXAMPLES:
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9]).column(1)
(-2/3, 4/9)
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9]).column(1,from_list=True)
(-2/3, 4/9)
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9]).column(-1)
(-2/3, 4/9)
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9]).column(-2)
(1/5, 3/4)
Returns the decomposition of the free module on which this matrix A acts from the right (i.e., the action is x goes to x A), along with whether this matrix acts irreducibly on each factor. The factors are guaranteed to be sorted in the same way as the corresponding factors of the characteristic polynomial.
Let A be the matrix acting from the on the vector space V of column
vectors. Assume that A is square. This function computes maximal
subspaces W_1, ..., W_n corresponding to Galois conjugacy classes
of eigenvalues of A. More precisely, let f(X) be the characteristic
polynomial of A. This function computes the subspace
, where g_i(X) is an irreducible
factor of f(X) and g_i(X) exactly divides f(X). If the optional
parameter is_diagonalizable is True, then we let W_i = ker(g(A)),
since then we know that ker(g(A)) =
.
If dual is True, also returns the corresponding decomposition of V under the action of the transpose of A. The factors are guaranteed to correspond.
INPUT:
Note
IMPORTANT: If you expect that the subspaces in the answer are spanned by vectors with small height coordinates, use algorithm=’multimodular’ and height_guess=1; this is potentially much faster than the default. If you know for a fact the answer will be very small, use algorithm=’multimodular’, height_guess=bound on height, proof=False.
You can get very very fast decomposition with proof=False.
EXAMPLES:
sage: a = matrix(QQ,3,[1..9])
sage: a.decomposition()
[
(Vector space of degree 3 and dimension 1 over Rational Field
Basis matrix:
[ 1 -2 1], True),
(Vector space of degree 3 and dimension 2 over Rational Field
Basis matrix:
[ 1 0 -1]
[ 0 1 2], True)
]
Return the denominator of this matrix.
OUTPUT: a Sage Integer
EXAMPLES:
sage: b = matrix(QQ,2,range(6)); b[0,0]=-5007/293; b
[-5007/293 1 2]
[ 3 4 5]
sage: b.denominator()
293
Return the determinant of this matrix.
INPUT:
proof - bool or None; if None use proof.linear_algebra(); only relevant for the padic algorithm.
algorithm:
“default” – use PARI for up to 7 rows, then use integer
“pari” – use PARI
“integer” – clear denominators and call det on integer matrix
Note
It would be VERY VERY hard for det to fail even with proof=False.
ALGORITHM: Clear denominators and call the integer determinant function.
EXAMPLES:
sage: m = matrix(QQ,3,[1,2/3,4/5, 2,2,2, 5,3,2/5])
sage: m.determinant()
-34/15
sage: m.charpoly()
x^3 - 17/5*x^2 - 122/15*x + 34/15
INPUT:
OUTPUT: self is no in reduced row echelon form.
EXAMPLES:
sage: a = matrix(QQ, 4, range(16)); a[0,0] = 1/19; a[0,1] = 1/5; a
[1/19 1/5 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 12 13 14 15]
sage: a.echelon_form()
[ 1 0 0 -76/157]
[ 0 1 0 -5/157]
[ 0 0 1 238/157]
[ 0 0 0 0]
sage: a.echelon_form(algorithm='multimodular')
[ 1 0 0 -76/157]
[ 0 1 0 -5/157]
[ 0 0 1 238/157]
[ 0 0 0 0]
INPUT:
- ‘default’ (default): use heuristic choice
- ‘padic’: an algorithm based on the IML p-adic solver.
- ‘multimodular’: uses a multimodular algorithm the uses linbox modulo many primes.
- ‘classical’: just clear each column using Gauss elimination
OUTPUT:
EXAMPLES:
sage: a = matrix(QQ, 4, range(16)); a[0,0] = 1/19; a[0,1] = 1/5; a
[1/19 1/5 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 12 13 14 15]
sage: a.echelonize(); a
[ 1 0 0 -76/157]
[ 0 1 0 -5/157]
[ 0 0 1 238/157]
[ 0 0 0 0]
sage: a = matrix(QQ, 4, range(16)); a[0,0] = 1/19; a[0,1] = 1/5
sage: a.echelonize(algorithm='multimodular'); a
[ 1 0 0 -76/157]
[ 0 1 0 -5/157]
[ 0 0 1 238/157]
[ 0 0 0 0]
Return the height of this matrix, which is the maximum of the absolute values of all numerators and denominators of entries in this matrix.
OUTPUT: an Integer
EXAMPLES:
sage: b = matrix(QQ,2,range(6)); b[0,0]=-5007/293; b
[-5007/293 1 2]
[ 3 4 5]
sage: b.height()
5007
Compute the inverse of this matrix.
Warning
This function is deprecated. Use inverse instead.
EXAMPLES:
sage: a = matrix(QQ,3,range(9))
sage: a.invert()
...
ZeroDivisionError: input matrix must be nonsingular
Return the minimal polynomial of this matrix.
INPUT:
OUTPUT: a polynomial over the rational numbers.
EXAMPLES:
sage: a = matrix(QQ, 3, [4/3, 2/5, 1/5, 4, -3/2, 0, 0, -2/3, 3/4])
sage: f = a.minpoly(); f
x^3 - 7/12*x^2 - 149/40*x + 97/30
sage: a = Mat(ZZ,4)(range(16))
sage: f = a.minpoly(); f.factor()
x * (x^2 - 30*x - 80)
sage: f(a) == 0
True
sage: a = matrix(QQ, 4, [1..4^2])
sage: factor(a.minpoly())
x * (x^2 - 34*x - 80)
sage: factor(a.minpoly('y'))
y * (y^2 - 34*y - 80)
sage: factor(a.charpoly())
x^2 * (x^2 - 34*x - 80)
sage: b = matrix(QQ, 4, [-1, 2, 2, 0, 0, 4, 2, 2, 0, 0, -1, -2, 0, -4, 0, 4])
sage: a = matrix(QQ, 4, [1, 1, 0,0, 0,1,0,0, 0,0,5,0, 0,0,0,5])
sage: c = b^(-1)*a*b
sage: factor(c.minpoly())
(x - 5) * (x - 1)^2
sage: factor(c.charpoly())
(x - 5)^2 * (x - 1)^2
Randomize density proportion of the entries of this matrix, leaving the rest unchanged.
If x and y are given, randomized entries of this matrix have numerators and denominators bounded by x and y and have density 1.
INPUT:
EXAMPLES:
sage: a = matrix(QQ,2,4); a.randomize(); a
[ 0 -1 2 -2]
[ 1 -1 2 1]
sage: a = matrix(QQ,2,4); a.randomize(density=0.5); a
[ -1 -2 0 0]
[ 0 0 1/2 0]
sage: a = matrix(QQ,2,4); a.randomize(num_bound=100, den_bound=100); a
[ 14/27 21/25 43/42 -48/67]
[-19/55 64/67 -11/51 76]
sage: a = matrix(QQ,2,4); a.randomize(distribution='1/n'); a
[ 3 1/9 1/2 1/4]
[ 1 1/39 2 -1955/2]
Return the rank of this matrix.
Return the right kernel of this matrix, as a vector space over QQ. For a left kernel use self.left_kernel() or just self.kernel().
INPUT:
EXAMPLES:
A non-trivial right kernel over the rationals::
sage: A = matrix(QQ, [[2,1,-5,-8],[-1,-1,4,6],[1,0,-1,-2]])
sage: A.right_kernel()
Vector space of degree 4 and dimension 2 over Rational Field
Basis matrix:
[ 1 0 -2 3/2]
[ 0 1 1 -1/2]
A trivial right kernel, plus left kernel (via superclass)::
sage: M=Matrix(QQ,[[1/2,3],[0,1],[1,1]])
sage: M.right_kernel()
Vector space of degree 2 and dimension 0 over Rational Field
Basis matrix:
[]
sage: M.left_kernel()
Vector space of degree 3 and dimension 1 over Rational Field
Basis matrix:
[ 1 -5/2 -1/2]
Return the i-th row of this matrix as a dense vector.
EXAMPLES:
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9]).row(1)
(3/4, 4/9)
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9]).row(1,from_list=True)
(3/4, 4/9)
sage: matrix(QQ,2,[1/5,-2/3,3/4,4/9]).row(-2)
(1/5, -2/3)
Set row i equal to s times row j.
EXAMPLES:
sage: a = matrix(QQ,2,3,range(6)); a
[0 1 2]
[3 4 5]
sage: a.set_row_to_multiple_of_row(1,0,-3)
sage: a
[ 0 1 2]
[ 0 -3 -6]
Returns the transpose of self, without changing self.
EXAMPLES:
We create a matrix, compute its transpose, and note that the original matrix is not changed.
sage: A = matrix(QQ,2,3,xrange(6))
sage: type(A)
<type 'sage.matrix.matrix_rational_dense.Matrix_rational_dense'>
sage: B = A.transpose()
sage: print B
[0 3]
[1 4]
[2 5]
sage: print A
[0 1 2]
[3 4 5]
sage: A.subdivide(None, 1); A
[0|1 2]
[3|4 5]
sage: A.transpose()
[0 3]
[---]
[1 4]
[2 5]