The problem is just with printing elements of the ring; the function is_atomic_repr
is just used to determine whether or not to write parentheses around the coefficients of a polynomial (e.g. the elements of ZZ
are atomic, but elements of a polynomial ring are not).
Matrix_space doesn't have one, but you can give it one easily:
sage: A = MatrixSpace(QQ, 2)
sage: PA.<x> = PolynomialRing(A)
sage: def iar():
... return True
...
sage: A.is_atomic_repr = iar
sage: x
[1 0]
[0 1]*x
Note that things will still print in silly ways, because matrices always print a linebreak after printing the top row:
sage: f = PA.random_element()
sage: f
[ 1 1]
[-1/2 0]*x^2 + [1/2 1/2]
[ 0 -2]*x + [-1/2 0]
[ -1 0]
sage: f[0]
[-1/2 0]
[ -1 0]
sage: f[1]
[1/2 1/2]
[ 0 -2]
You can still work with polynomials and print their coefficients without defining is_atomic_repr
:
sage: B = MatrixSpace(ZZ, 2)
sage: PB.<x> = PolynomialRing(B)
sage: f = x - 1
sage: (f^2).coeffs()
[
[1 0] [-2 0] [1 0]
[0 1], [ 0 -2], [0 1]
]
sage: (f^2+1).dict()
{0: [2 0]
[0 2], 1: [-2 0]
[ 0 -2], 2: [1 0]
[0 1]}
sage: ((x^2 + 1)^2).padded_list()
[
[1 0] [0 0] [2 0] [0 0] [1 0]
[0 1], [0 0], [0 2], [0 0], [0 1]
]
sage: ((f^2 - f)^3)[0]
[8 0]
[0 8]
sage: ((f^2 - f)^3)[4]
[33 0]
[ 0 33]