class FiniteDimensionalEJAElementSubalgebra(FiniteDimensionalEJASubalgebra):
- def __init__(self, elt, orthonormalize=True, **kwargs):
+ def __init__(self, elt, **kwargs):
superalgebra = elt.parent()
- powers = tuple( elt**k for k in range(superalgebra.dimension()) )
- power_vectors = ( p.to_vector() for p in powers )
- P = matrix(superalgebra.base_ring(), power_vectors)
-
- if orthonormalize:
- basis = powers # let god sort 'em out
- else:
- # Echelonize the matrix ourselves, because otherwise the
- # call to P.pivot_rows() below can choose a non-optimal
- # row-reduction algorithm. In particular, scaling can
- # help over AA because it avoids the RecursionError that
- # gets thrown when we have to look too hard for a root.
- #
- # Beware: QQ supports an entirely different set of "algorithm"
- # keywords than do AA and RR.
- algo = None
- if superalgebra.base_ring() is not QQ:
- algo = "scaled_partial_pivoting"
- P.echelonize(algorithm=algo)
-
- # In this case, we just need to figure out which elements
- # of the "powers" list are redundant... First compute the
- # vector subspace spanned by the powers of the given
- # element.
-
- # Figure out which powers form a linearly-independent set.
- ind_rows = P.pivot_rows()
-
- # Pick those out of the list of all powers.
- basis = tuple(map(powers.__getitem__, ind_rows))
-
+ # TODO: going up to the superalgebra dimension here is
+ # overkill. We should append p vectors as rows to a matrix
+ # and continually rref() it until the rank stops going
+ # up. When n=10 but the dimension of the algebra is 1, that
+ # can save a shitload of time (especially over AA).
+ powers = tuple( elt**k for k in range(elt.degree()) )
super().__init__(superalgebra,
- basis,
+ powers,
associative=True,
**kwargs)
sage: J.one()
e0 + e1 + e2 + e3 + e4
sage: x = sum(J.gens())
- sage: A = x.subalgebra_generated_by()
+ sage: A = x.subalgebra_generated_by(orthonormalize=False)
sage: A.one()
f0
sage: A.one().superalgebra_element()
sage: set_random_seed()
sage: x = random_eja().random_element()
- sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
+ sage: A = x.subalgebra_generated_by()
sage: x = A.random_element()
sage: A.one()*x == x and x*A.one() == x
True
sage: set_random_seed()
sage: x = random_eja(field=QQ,orthonormalize=False).random_element()
- sage: A = x.subalgebra_generated_by()
+ sage: A = x.subalgebra_generated_by(orthonormalize=False)
sage: actual = A.one().operator().matrix()
sage: expected = matrix.identity(A.base_ring(), A.dimension())
sage: actual == expected
sage: set_random_seed()
sage: x = random_eja().random_element()
- sage: A = x.subalgebra_generated_by(orthonormalize_basis=True)
+ sage: A = x.subalgebra_generated_by()
sage: actual = A.one().operator().matrix()
sage: expected = matrix.identity(A.base_ring(), A.dimension())
sage: actual == expected