Path: blob/master/sage/monoids/free_abelian_monoid_element.py
4095 views
"""1Abelian monoid elements23AUTHORS:45- David Kohel (2005-09)67EXAMPLES:89Recall the example from abelian monoids.1011::1213sage: F = FreeAbelianMonoid(5,names = list("abcde"))14sage: (a,b,c,d,e) = F.gens()15sage: a*b^2*e*d16a*b^2*d*e17sage: x = b^2*e*d*a^718sage: x19a^7*b^2*d*e20sage: x.list()21[7, 2, 0, 1, 1]2223It is important to note that lists are mutable and the returned24list is not a copy. As a result, reassignment of an element of the25list changes the object.2627::2829sage: x.list()[0] = 030sage: x31b^2*d*e32"""3334#*****************************************************************************35# Copyright (C) 2006 William Stein <[email protected]>36# Copyright (C) 2005 David Kohel <[email protected]>37#38# Distributed under the terms of the GNU General Public License (GPL)39# http://www.gnu.org/licenses/40#*****************************************************************************414243from sage.rings.integer import Integer44from sage.structure.element import MonoidElement4546def is_FreeAbelianMonoidElement(x):47r"""48Queries whether ``x`` is an object of type ``FreeAbelianMonoidElement``.4950INPUT:5152- ``x`` -- an object.5354OUTPUT:5556- ``True`` if ``x`` is an object of type ``FreeAbelianMonoidElement``;57``False`` otherwise.58"""59return isinstance(x, FreeAbelianMonoidElement)6061class FreeAbelianMonoidElement(MonoidElement):62def __init__(self, F, x):63"""64Create the element x of the FreeAbelianMonoid F.6566EXAMPLES::6768sage: F = FreeAbelianMonoid(5, 'abcde')69sage: F70Free abelian monoid on 5 generators (a, b, c, d, e)71sage: F(1)72173sage: a, b, c, d, e = F.gens()74sage: a^2 * b^3 * a^2 * b^475a^4*b^776sage: F = FreeAbelianMonoid(5, 'abcde')77sage: a, b, c, d, e = F.gens()78sage: a in F79True80sage: a*b in F81True82"""83MonoidElement.__init__(self, F)84self.__repr = None85n = F.ngens()86if isinstance(x, (int, long, Integer)) and x == 1:87self.__element_vector = [ 0 for i in range(n) ]88elif isinstance(x, list):89if len(x) != n:90raise IndexError, \91"Argument length (= %s) must be %s."%(len(x), n)92self.__element_vector = x93else:94raise TypeError, "Argument x (= %s) is of wrong type."%x9596def __repr__(self):97s = ""98A = self.parent()99n = A.ngens()100x = A.variable_names()101v = self.__element_vector102for i in range(n):103if v[i] == 0:104continue105elif v[i] == 1:106if len(s) > 0: s += "*"107s += "%s"%x[i]108else:109if len(s) > 0: s += "*"110s += "%s^%s"%(x[i],v[i])111if len(s) == 0: s = "1"112return s113114def __mul__(self, y):115if not isinstance(y, FreeAbelianMonoidElement):116raise TypeError, "Argument y (= %s) is of wrong type."%y117M = self.parent()118z = M(1)119xelt = self.__element_vector120yelt = y.__element_vector121z.__element_vector = [ xelt[i]+yelt[i] for i in range(len(xelt)) ]122return z123124def __pow__(self, n):125"""126Raises self to the power of n.127128AUTHORS:129130- Tom Boothby (2007-08): Replaced O(log n) time, O(n) space131algorithm with O(1) time and space"algorithm".132133EXAMPLES::134135sage: F = FreeAbelianMonoid(5,names = list("abcde"))136sage: (a,b,c,d,e) = F.gens()137sage: x = a*b^2*e*d; x138a*b^2*d*e139sage: x^3140a^3*b^6*d^3*e^3141sage: x^01421143"""144145if not isinstance(n, (int, long, Integer)):146raise TypeError, "Argument n (= %s) must be an integer."%n147if n < 0:148raise IndexError, "Argument n (= %s) must be positive."%n149elif n == 1:150return self151z = self.parent()(1)152if n == 0:153return z154else:155z.__element_vector = [i*n for i in self.__element_vector]156return z157158159def list(self):160"""161Return (a reference to) the underlying list used to represent this162element. If this is a monoid in an abelian monoid on `n`163generators, then this is a list of nonnegative integers of length164`n`.165166EXAMPLES::167168sage: F = FreeAbelianMonoid(5, 'abcde')169sage: (a, b, c, d, e) = F.gens()170sage: a.list()171[1, 0, 0, 0, 0]172"""173return self.__element_vector174175176177178