Path: blob/master/src/sage/algebras/free_algebra_quotient_element.py
8818 views
"""1Free algebra quotient elements23AUTHORS:4- William Stein (2011-11-19): improved doctest coverage to 100%5- David Kohel (2005-09): initial version67"""89#*****************************************************************************10# Copyright (C) 2005 David Kohel <[email protected]>11#12# Distributed under the terms of the GNU General Public License (GPL)13#14# This code is distributed in the hope that it will be useful,15# but WITHOUT ANY WARRANTY; without even the implied warranty16# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.17#18# See the GNU General Public License for more details; the full text19# is available at:20#21# http://www.gnu.org/licenses/22#*****************************************************************************2324from sage.misc.misc import repr_lincomb25from sage.rings.ring_element import RingElement26from sage.rings.integer import Integer27from sage.algebras.algebra_element import AlgebraElement28from sage.modules.free_module_element import FreeModuleElement29from sage.monoids.free_monoid_element import FreeMonoidElement30from sage.algebras.free_algebra_element import FreeAlgebraElement31from sage.structure.parent_gens import localvars3233def is_FreeAlgebraQuotientElement(x):34"""35EXAMPLES::3637sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)38sage: sage.algebras.free_algebra_quotient_element.is_FreeAlgebraQuotientElement(i)39True4041Of course this is testing the data type::4243sage: sage.algebras.free_algebra_quotient_element.is_FreeAlgebraQuotientElement(1)44False45sage: sage.algebras.free_algebra_quotient_element.is_FreeAlgebraQuotientElement(H(1))46True47"""48return isinstance(x, FreeAlgebraQuotientElement)4950class FreeAlgebraQuotientElement(AlgebraElement):51def __init__(self, A, x):52"""53Create the element x of the FreeAlgebraQuotient A.5455EXAMPLES::5657sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)58sage: sage.algebras.free_algebra_quotient.FreeAlgebraQuotientElement(H, i)59i60sage: a = sage.algebras.free_algebra_quotient.FreeAlgebraQuotientElement(H, 1); a61162sage: a in H63True6465TESTS::6667sage: TestSuite(i).run()68"""69AlgebraElement.__init__(self, A)70Q = self.parent()7172if isinstance(x, FreeAlgebraQuotientElement) and x.parent() == Q:73self.__vector = Q.module()(x.vector())74return75if isinstance(x, (int, long, Integer)):76self.__vector = Q.module().gen(0) * x77return78elif isinstance(x, FreeModuleElement) and x.parent() is Q.module():79self.__vector = x80return81elif isinstance(x, FreeModuleElement) and x.parent() == A.module():82self.__vector = x83return84R = A.base_ring()85M = A.module()86F = A.monoid()87B = A.monomial_basis()8889if isinstance(x, (int, long, Integer)):90self.__vector = x*M.gen(0)91elif isinstance(x, RingElement) and not isinstance(x, AlgebraElement) and x in R:92self.__vector = x * M.gen(0)93elif isinstance(x, FreeMonoidElement) and x.parent() is F:94if x in B:95self.__vector = M.gen(B.index(x))96else:97raise AttributeError("Argument x (= %s) is not in monomial basis"%x)98elif isinstance(x, list) and len(x) == A.dimension():99try:100self.__vector = M(x)101except TypeError:102raise TypeError("Argument x (= %s) is of the wrong type."%x)103elif isinstance(x, FreeAlgebraElement) and x.parent() is A.free_algebra():104# Need to do more work here to include monomials not105# represented in the monomial basis.106self.__vector = M(0)107for m, c in x._FreeAlgebraElement__monomial_coefficients.iteritems():108self.__vector += c*M.gen(B.index(m))109elif isinstance(x, dict):110self.__vector = M(0)111for m, c in x.iteritems():112self.__vector += c*M.gen(B.index(m))113elif isinstance(x, AlgebraElement) and x.parent().ambient_algebra() is A:114self.__vector = x.ambient_algebra_element().vector()115else:116raise TypeError("Argument x (= %s) is of the wrong type."%x)117118def _repr_(self):119"""120EXAMPLES::121122sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(ZZ)123sage: i._repr_()124'i'125"""126Q = self.parent()127M = Q.monoid()128with localvars(M, Q.variable_names()):129cffs = list(self.__vector)130mons = Q.monomial_basis()131return repr_lincomb(zip(mons, cffs), strip_one=True)132133def _latex_(self):134"""135EXAMPLES::136137sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)138sage: ((2/3)*i - j)._latex_()139'\\frac{2}{3}i - j'140"""141Q = self.parent()142M = Q.monoid()143with localvars(M, Q.variable_names()):144cffs = tuple(self.__vector)145mons = Q.monomial_basis()146return repr_lincomb(zip(mons, cffs), is_latex=True, strip_one=True)147148def vector(self):149"""150Return underlying vector representation of this element.151152EXAMPLES::153154sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)155sage: ((2/3)*i - j).vector()156(0, 2/3, -1, 0)157"""158return self.__vector159160def __cmp__(self, right):161"""162Compare two quotient algebra elements; done by comparing the163underlying vector representatives.164165EXAMPLES::166167sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)168sage: cmp(i,j)1691170sage: cmp(j,i)171-1172sage: cmp(i,i)1730174sage: i == 1175False176sage: i + j == j + i177True178"""179return cmp(self.vector(), right.vector())180181def __neg__(self):182"""183Return negative of self.184185EXAMPLES::186187sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)188sage: -i189-i190sage: -(2/3*i - 3/7*j + k)191-2/3*i + 3/7*j - k192"""193y = self.parent()(0)194y.__vector = -self.__vector195return y196197def _add_(self, y):198"""199EXAMPLES::200201sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)202sage: 2/3*i + 4*j + k2032/3*i + 4*j + k204"""205A = self.parent()206z = A(0)207z.__vector = self.__vector + y.__vector208return z209210def _sub_(self, y):211"""212EXAMPLES::213214sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)215sage: 2/3*i - 4*j2162/3*i - 4*j217sage: a = 2/3*i - 4*j; a2182/3*i - 4*j219sage: a - a2200221"""222A = self.parent()223z = A(0)224z.__vector = self.__vector - y.__vector225return z226227def _mul_(self, y):228"""229EXAMPLES::230231sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)232sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10)233-5459/25 + 40*i - 12*j + 340*k234235Double check that the above is actually right::236237sage: R.<i,j,k> = QuaternionAlgebra(QQ,-1,-1)238sage: a = (5 + 2*i - 3/5*j + 17*k); a*(a+10)239-5459/25 + 40*i - 12*j + 340*k240"""241A = self.parent()242def monomial_product(X,w,m):243mats = X._FreeAlgebraQuotient__matrix_action244for (j,k) in m._element_list:245M = mats[int(j)]246for l in range(k): w *= M247return w248u = self.__vector.__copy__()249v = y.__vector250z = A(0)251B = A.monomial_basis()252for i in range(A.dimension()):253c = v[i]254if c != 0: z.__vector += monomial_product(A,c*u,B[i])255return z256257def _rmul_(self, c):258"""259EXAMPLES::260261sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)262sage: 3 * (-1+i-2*j+k)263-3 + 3*i - 6*j + 3*k264sage: (-1+i-2*j+k)._rmul_(3)265-3 + 3*i - 6*j + 3*k266"""267return self.parent([c*a for a in self.__vector])268269def _lmul_(self, c):270"""271EXAMPLES::272273sage: H, (i,j,k) = sage.algebras.free_algebra_quotient.hamilton_quatalg(QQ)274sage: (-1+i-2*j+k) * 3275-3 + 3*i - 6*j + 3*k276sage: (-1+i-2*j+k)._lmul_(3)277-3 + 3*i - 6*j + 3*k278"""279return self.parent([a*c for a in self.__vector])280281282283