Miscellaneous matrix functions#
- sage.matrix.matrix_misc.permanental_minor_polynomial(A, permanent_only=False, var='t', prec=None)#
Return the polynomial of the sums of permanental minors of
A
.INPUT:
– a matrix – if True, return only the permanent of – name of the polynomial variable – if prec is not None, truncate the polynomial at precision
The polynomial of the sums of permanental minors is
where
is the -th permanental minor of (that can also be obtained through the methodpermanental_minor()
viaA.permanental_minor(i)
).The algorithm implemented by that function has been developed by P. Butera and M. Pernici, see [BP2015]. Its complexity is
where and are the number of rows and columns of . Moreover, if is a banded matrix with width , that is for and , then the complexity of the algorithm is .INPUT:
A
– matrixpermanent_only
– optional boolean. IfTrue
, only the permanent is computed (might be faster).var
– a variable name
EXAMPLES:
sage: from sage.matrix.matrix_misc import permanental_minor_polynomial sage: m = matrix([[1,1],[1,2]]) sage: permanental_minor_polynomial(m) 3*t^2 + 5*t + 1 sage: permanental_minor_polynomial(m, permanent_only=True) 3 sage: permanental_minor_polynomial(m, prec=2) 5*t + 1
sage: M = MatrixSpace(ZZ,4,4) sage: A = M([1,0,1,0,1,0,1,0,1,0,10,10,1,0,1,1]) sage: permanental_minor_polynomial(A) 84*t^3 + 114*t^2 + 28*t + 1 sage: [A.permanental_minor(i) for i in range(5)] [1, 28, 114, 84, 0]
An example over
:sage: M = MatrixSpace(QQ,2,2) sage: A = M([1/5,2/7,3/2,4/5]) sage: permanental_minor_polynomial(A, True) 103/175
An example with polynomial coefficients:
sage: R.<a> = PolynomialRing(ZZ) sage: A = MatrixSpace(R,2)([[a,1], [a,a+1]]) sage: permanental_minor_polynomial(A, True) a^2 + 2*a
A usage of the
var
argument:sage: m = matrix(ZZ,4,[0,1,2,3,1,2,3,0,2,3,0,1,3,0,1,2]) sage: permanental_minor_polynomial(m, var='x') 164*x^4 + 384*x^3 + 172*x^2 + 24*x + 1
ALGORITHM:
The permanent
of a matrix is the coefficient of the monomial inEvaluating this product one can neglect
, that is can be considered to be nilpotent of order .To formalize this procedure, consider the algebra
where the are commuting, nilpotent of order (i.e. ). Formally it is the quotient ring of the polynomial ring in quotiented by the ideal generated by the .We will mostly consider the ring
of polynomials over . We denote a generic element of by or if we want to emphasize that some monomials in the are missing.Introduce an “integration” operation
over and consisting in the sum of the coefficients of the non-vanishing monomials in (i.e. the result of setting all variables to ). Let us emphasize that this is not a morphism of algebras as while !Let us consider an example of computation. Let
and . Thenand
In this formalism, the permanent is just
A useful property of
which makes this algorithm efficient for band matrices is the following: let and be polynomials in where . Then one haswhere
are replaced by in . Informally, we can “integrate” these variables before performing the product. More generally, if a monomial is missing in one of the terms of a product of two terms, then it can be integrated in the other term.Now let us consider an
matrix with . The sum of permanental `k`-minors of `A` iswhere the sum is over the
-subsets of rows and -subsets of columns and is the submatrix obtained from by keeping only the rows and columns . Of course and note that is just the sum of all entries of the matrix.The generating function of these sums of permanental minors is
In fact the
coefficient of corresponds to choosing rows of ; is associated to the i-th column; nilpotency avoids having twice the same column in a product of ’s.For more details, see the article [BP2015].
From a technical point of view, the product in
is implemented as a subroutine inprm_mul()
. The indices of the rows and columns actually start at , so the variables are . Polynomials are represented in dictionary form: to a variable is associated the key (or in Python1 << i
). The keys associated to products are obtained by considering the development in base : to the monomial is associated the key . So the product corresponds to the key while has key . In particular all operations on monomials are implemented via bitwise operations on the keys.
- sage.matrix.matrix_misc.prm_mul(p1, p2, mask_free, prec)#
Return the product of
p1
andp2
, putting free variables inmask_free
to .This function is mainly use as a subroutine of
permanental_minor_polynomial()
.INPUT:
– polynomials as dictionariesmask_free
– an integer mask that give the list of free variables (the -th variable is free if the -th bit ofmask_free
is )prec
– ifprec
is notNone
, truncate the product at precisionprec
EXAMPLES:
sage: from sage.matrix.matrix_misc import prm_mul sage: t = polygen(ZZ, 't') sage: p1 = {0: 1, 1: t, 4: t} sage: p2 = {0: 1, 1: t, 2: t} sage: prm_mul(p1, p2, 1, None) {0: 2*t + 1, 2: t^2 + t, 4: t^2 + t, 6: t^2}
- sage.matrix.matrix_misc.row_iterator(A)#