Path: blob/master/sage/algebras/free_algebra_quotient_element.py
4129 views
"""1Free algebra quotient elements23AUTHORS:4- William Stein (2011-11-19): improved doctest coverage to 100%5- David Kohel (2005-09): initial version67"""89from __future__ import with_statement1011#*****************************************************************************12# Copyright (C) 2005 David Kohel <[email protected]>13#14# Distributed under the terms of the GNU General Public License (GPL)15#16# This code is distributed in the hope that it will be useful,17# but WITHOUT ANY WARRANTY; without even the implied warranty18# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.19#20# See the GNU General Public License for more details; the full text21# is available at:22#23# http://www.gnu.org/licenses/24#*****************************************************************************2526from sage.misc.misc import repr_lincomb27from sage.rings.ring_element import RingElement28from sage.rings.integer import Integer29from sage.algebras.algebra_element import AlgebraElement30from sage.modules.free_module_element import FreeModuleElement31from sage.monoids.free_monoid_element import FreeMonoidElement32from sage.algebras.free_algebra_element import FreeAlgebraElement33from sage.structure.parent_gens import localvars3435def is_FreeAlgebraQuotientElement(x):36"""37EXAMPLES::3839sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)40sage: sage.algebras.free_algebra_quotient_element.is_FreeAlgebraQuotientElement(i)41True4243Of course this is testing the data type::4445sage: sage.algebras.free_algebra_quotient_element.is_FreeAlgebraQuotientElement(1)46False47sage: sage.algebras.free_algebra_quotient_element.is_FreeAlgebraQuotientElement(H(1))48True49"""50return isinstance(x, FreeAlgebraQuotientElement)5152class FreeAlgebraQuotientElement(AlgebraElement):53def __init__(self, A, x):54"""55Create the element x of the FreeAlgebraQuotient A.5657EXAMPLES::5859sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)60sage: sage.algebras.free_algebra_quotient.FreeAlgebraQuotientElement(H, i)61i62sage: a = sage.algebras.free_algebra_quotient.FreeAlgebraQuotientElement(H, 1); a63164sage: a in H65True6667TESTS::6869sage: TestSuite(i).run()70"""71AlgebraElement.__init__(self, A)72Q = self.parent()7374if isinstance(x, FreeAlgebraQuotientElement) and x.parent() == Q:75self.__vector = Q.module()(x.vector())76return77if isinstance(x, (int, long, Integer)):78self.__vector = Q.module().gen(0) * x79return80elif isinstance(x, FreeModuleElement) and x.parent() is Q.module():81self.__vector = x82return83elif isinstance(x, FreeModuleElement) and x.parent() == A.module():84self.__vector = x85return86R = A.base_ring()87M = A.module()88F = A.monoid()89B = A.monomial_basis()9091if isinstance(x, (int, long, Integer)):92self.__vector = x*M.gen(0)93elif isinstance(x, RingElement) and not isinstance(x, AlgebraElement) and x in R:94self.__vector = x * M.gen(0)95elif isinstance(x, FreeMonoidElement) and x.parent() is F:96if x in B:97self.__vector = M.gen(B.index(x))98else:99raise AttributeError("Argument x (= %s) is not in monomial basis"%x)100elif isinstance(x, list) and len(x) == A.dimension():101try:102self.__vector = M(x)103except TypeError:104raise TypeError("Argument x (= %s) is of the wrong type."%x)105elif isinstance(x, FreeAlgebraElement) and x.parent() is A.free_algebra():106# Need to do more work here to include monomials not107# represented in the monomial basis.108self.__vector = M(0)109for m, c in x._FreeAlgebraElement__monomial_coefficients.iteritems():110self.__vector += c*M.gen(B.index(m))111elif isinstance(x, dict):112self.__vector = M(0)113for m, c in x.iteritems():114self.__vector += c*M.gen(B.index(m))115elif isinstance(x, AlgebraElement) and x.parent().ambient_algebra() is A:116self.__vector = x.ambient_algebra_element().vector()117else:118raise TypeError("Argument x (= %s) is of the wrong type."%x)119120def _repr_(self):121"""122EXAMPLES::123124sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)125sage: i._repr_()126'i'127"""128Q = self.parent()129M = Q.monoid()130with localvars(M, Q.variable_names()):131cffs = list(self.__vector)132mons = Q.monomial_basis()133return repr_lincomb(zip(mons, cffs), strip_one=True)134135def _latex_(self):136"""137EXAMPLES::138139sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)140sage: ((2/3)*i - j)._latex_()141'\\frac{2}{3}i + \\left(-1\\right)j'142"""143Q = self.parent()144M = Q.monoid()145with localvars(M, Q.variable_names()):146cffs = tuple(self.__vector)147mons = Q.monomial_basis()148return repr_lincomb(zip(mons, cffs), is_latex=True, strip_one=True)149150def vector(self):151"""152Return underlying vector representation of this element.153154EXAMPLES::155156sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)157sage: ((2/3)*i - j).vector()158(0, 2/3, -1, 0)159"""160return self.__vector161162def __cmp__(self, right):163"""164Compare two quotient algebra elements; done by comparing the165underlying vector representatives.166167EXAMPLES::168169sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)170sage: cmp(i,j)1711172sage: cmp(j,i)173-1174sage: cmp(i,i)1750176sage: i == 1177False178sage: i + j == j + i179True180"""181return cmp(self.vector(), right.vector())182183def __neg__(self):184"""185Return negative of self.186187EXAMPLES::188189sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)190sage: -i191-i192sage: -(2/3*i - 3/7*j + k)193-2/3*i + 3/7*j - k194"""195y = self.parent()(0)196y.__vector = -self.__vector197return y198199def _add_(self, y):200"""201EXAMPLES::202203sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)204sage: 2/3*i + 4*j + k2052/3*i + 4*j + k206"""207A = self.parent()208z = A(0)209z.__vector = self.__vector + y.__vector210return z211212def _sub_(self, y):213"""214EXAMPLES::215216sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)217sage: 2/3*i - 4*j2182/3*i - 4*j219sage: a = 2/3*i - 4*j; a2202/3*i - 4*j221sage: a - a2220223"""224A = self.parent()225z = A(0)226z.__vector = self.__vector - y.__vector227return z228229def _mul_(self, y):230"""231EXAMPLES::232233sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)234sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10)235-5459/25 + 40*i - 12*j + 340*k236237Double check that the above is actually right::238239sage: R.<i,j,k> = QuaternionAlgebra(QQ,-1,-1)240sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10)241-5459/25 + 40*i - 12*j + 340*k242"""243A = self.parent()244def monomial_product(X,w,m):245mats = X._FreeAlgebraQuotient__matrix_action246for (j,k) in m._element_list:247M = mats[int(j)]248for l in range(k): w *= M249return w250u = self.__vector.__copy__()251v = y.__vector252z = A(0)253B = A.monomial_basis()254for i in range(A.dimension()):255c = v[i]256if c != 0: z.__vector += monomial_product(A,c*u,B[i])257return z258259def _rmul_(self, c):260"""261EXAMPLES::262263sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)264sage: 3 * (-1+i-2*j+k)265-3 + 3*i - 6*j + 3*k266sage: (-1+i-2*j+k)._rmul_(3)267-3 + 3*i - 6*j + 3*k268"""269return self.parent([c*a for a in self.__vector])270271def _lmul_(self, c):272"""273EXAMPLES::274275sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)276sage: (-1+i-2*j+k) * 3277-3 + 3*i - 6*j + 3*k278sage: (-1+i-2*j+k)._lmul_(3)279-3 + 3*i - 6*j + 3*k280"""281return self.parent([a*c for a in self.__vector])282283284285