Dense matrices over the rational field¶
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: TestSuite(a).run()
-
class
sage.matrix.matrix_rational_dense.
MatrixWindow
¶ Bases:
object
-
class
sage.matrix.matrix_rational_dense.
Matrix_rational_dense
¶ Bases:
sage.matrix.matrix_dense.Matrix_dense
-
LLL
(*args, **kwargs)¶ Return an LLL reduced or approximated LLL reduced lattice for
self
interpreted as a lattice.For details on input parameters, see
sage.matrix.matrix_integer_dense.Matrix_integer_dense.LLL()
.EXAMPLE:
sage: A = Matrix(QQ, 3, 3, [1/n for n in range(1, 10)]) sage: A.LLL() [ 1/28 -1/40 -1/18] [ 1/28 -1/40 1/18] [ 0 -3/40 0]
-
antitranspose
()¶ 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]
-
change_ring
(R)¶ 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) Traceback (most recent call last): ... 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]
-
charpoly
(var='x', algorithm='linbox')¶ Return the characteristic polynomial of this matrix.
INPUT:
var
- ‘x’ (string)algorithm
- ‘linbox’ (default) or ‘generic’
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]
TESTS:
The cached polynomial should be independent of the
var
argument (trac ticket #12292). We check (indirectly) that the second call uses the cached value by noting that its result is not cached:sage: M = MatrixSpace(QQ, 2) sage: A = M(range(0, 2^2)) sage: type(A) <type 'sage.matrix.matrix_rational_dense.Matrix_rational_dense'> sage: A.charpoly('x') x^2 - 3*x - 2 sage: A.charpoly('y') y^2 - 3*y - 2 sage: A._cache['charpoly_linbox'] x^2 - 3*x - 2
-
column
(i, from_list=False)¶ Return the i-th column of this matrix as a dense vector.
- INPUT:
i
- integerfrom_list
- ignored
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)
-
decomposition
(is_diagonalizable=False, dual=False, algorithm='default', height_guess=None, proof=None)¶ 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 \(W_i = ker(g_(A)^n)\), 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)) = \(ker(g(A)^n)\).
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:
is_diagonalizable
- ignoreddual
- whether to also return decompositions for the dualalgorithm
- ‘default’: use default algorithm for computing Echelon forms
- ‘multimodular’: much better if the answers factors have small height
height_guess
- positive integer; only used by the multimodular algorithmproof
- bool or None (default: None, see proof.linear_algebra or sage.structure.proof); only used by the multimodular algorithm. Note that the Sage global default is proof=True.
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) ]
-
denominator
()¶ 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
-
determinant
(algorithm='default', proof=None)¶ 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
-
echelon_form
(algorithm='default', height_guess=None, proof=None, **kwds)¶ INPUT:
algorithm
- ‘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
height_guess
,**kwds
- all passed to the multimodular algorithm; ignored by the p-adic algorithm.proof
- bool or None (default: None, see proof.linear_algebra or sage.structure.proof). Passed to the multimodular algorithm. Note that the Sage global default is proof=True.
OUTPUT: the reduced row echelon form of self.
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]
The result is an immutable matrix, so if you want to modify the result then you need to make a copy. This checks that trac ticket #10543 is fixed.
sage: A = matrix(QQ, 2, range(6)) sage: E = A.echelon_form() sage: E.is_mutable() False sage: F = copy(E) sage: F[0,0] = 50 sage: F [50 0 -1] [ 0 1 2]
-
echelonize
(algorithm='default', height_guess=None, proof=None, **kwds)¶ Transform the matrix
self
into reduced row echelon form in place.INPUT:
algorithm
:
'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
height_guess
,**kwds
- all passed to the multimodular algorithm; ignored by the p-adic algorithm.proof
- bool or None (default: None, see proof.linear_algebra or sage.structure.proof). Passed to the multimodular algorithm. Note that the Sage global default isproof=True
.
OUTPUT:
Nothing. The matrix
self
is transformed into reduced row echelon form in place.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]
TESTS:
Echelonizing a matrix in place throws away the cache of the old matrix (trac ticket #14506):
sage: a = Matrix(QQ, [[1,2],[3,4]]) sage: a.det(); a._clear_denom() -2 ( [1 2] [3 4], 1 ) sage: a.echelonize(algorithm="padic") sage: sorted(a._cache.items()) [('in_echelon_form', True), ('pivots', (0, 1))] sage: a = Matrix(QQ, [[1,3],[3,4]]) sage: a.det(); a._clear_denom() -5 ( [1 3] [3 4], 1 ) sage: a.echelonize(algorithm="multimodular") sage: sorted(a._cache.items()) [('in_echelon_form', True), ('pivots', (0, 1))]
-
height
()¶ 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
-
minpoly
(var='x', algorithm='linbox')¶ Return the minimal polynomial of this matrix.
INPUT:
var
- ‘x’ (string)algorithm
- ‘linbox’ (default) or ‘generic’
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
-
prod_of_row_sums
(cols)¶
-
randomize
(density=1, num_bound=2, den_bound=2, distribution=None, nonzero=False)¶ Randomize
density
proportion of the entries of this matrix, leaving the rest unchanged.If
x
andy
are given, randomized entries of this matrix have numerators and denominators bounded byx
andy
and have density 1.INPUT:
density
- number between 0 and 1 (default: 1)num_bound
- numerator bound (default: 2)den_bound
- denominator bound (default: 2)distribution
-None
or ‘1/n’ (default:None
); if ‘1/n’ thennum_bound
,den_bound
are ignored and numbers are chosen using the GMP functionmpq_randomize_entry_recip_uniform
nonzero
- Bool (default:False
); whether the new entries are forced to be non-zero
OUTPUT:
- None, the matrix is modified in-space
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]
-
rank
()¶ Return the rank of this matrix.
- EXAMPLES::
- sage: matrix(QQ,3,[1..9]).rank() 2 sage: matrix(QQ,100,[1..100^2]).rank() 2
-
row
(i, from_list=False)¶ Return the i-th row of this matrix as a dense vector.
- INPUT:
i
- integerfrom_list
- ignored
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_to_multiple_of_row
(i, j, s)¶ 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]
-
transpose
()¶ 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]
.T
is a convenient shortcut for the transpose:sage: print(A.T) [0 3] [1 4] [2 5]
sage: A.subdivide(None, 1); A [0|1 2] [3|4 5] sage: A.transpose() [0 3] [---] [1 4] [2 5]
-