def __init__(self, M, prefix='T', category=None, **options): r""" Initialize ``self``. EXAMPLES:: sage: C = CombinatorialFreeModule(QQ, ['a','b','c']) sage: TA = TensorAlgebra(C) sage: TestSuite(TA).run() sage: m = SymmetricFunctions(QQ).m() sage: Tm = TensorAlgebra(m) sage: TestSuite(Tm).run() """ self._base_module = M R = M.base_ring() category = GradedHopfAlgebrasWithBasis( R.category()).or_subcategory(category) CombinatorialFreeModule.__init__(self, R, IndexedFreeMonoid(M.indices()), prefix=prefix, category=category, **options) # the following is not the best option, but it's better than nothing. self._print_options['tensor_symbol'] = options.get( 'tensor_symbol', tensor.symbol)
def __classcall_private__(cls, index_set=None, names=None, commutative=False, **kwds): r""" Construct a free monoid or a free abelian monoid, depending on the input. Also, normalize the input. EXAMPLES:: sage: F.<a,b,c,d,e> = FreeMonoid(); F Free monoid on 5 generators (a, b, c, d, e) sage: FreeMonoid(index_set=ZZ) Free monoid indexed by Integer Ring sage: F.<x,y,z> = FreeMonoid(abelian=True); F Free abelian monoid on 3 generators (x, y, z) sage: FreeMonoid(index_set=ZZ, commutative=True) Free abelian monoid indexed by Integer Ring sage: F = FreeMonoid(index_set=ZZ, names='x,y,z') sage: G = FreeMonoid(index_set=ZZ, names=['x', 'y', 'z']) sage: F == G True sage: F is G True sage: FreeMonoid(2, names='a,b') is FreeMonoid(names=['a','b']) True Fix a bug when ``index_set`` is ``None`` and ``names`` is a string (:trac:`26221`):: sage: FreeMonoid(2, names=['a','b']) is FreeMonoid(names='a,b') True """ if 'abelian' in kwds: commutative = kwds.pop('abelian') if commutative: from sage.monoids.free_abelian_monoid import FreeAbelianMonoid return FreeAbelianMonoid(index_set, names, **kwds) # Swap args (this works if names is None as well) if isinstance(index_set, str): names, index_set = index_set, names if index_set is None and names is not None: if isinstance(names, str): index_set = names.count(',') + 1 else: index_set = len(names) if index_set not in ZZ: if names is not None: names = normalize_names(-1, names) from sage.monoids.indexed_free_monoid import IndexedFreeMonoid return IndexedFreeMonoid(index_set, names=names, **kwds) if names is None: raise ValueError("names must be specified") names = normalize_names(index_set, names) return super(FreeMonoid, cls).__classcall__(cls, index_set, names)
def free(index_set=None, names=None, **kwds): r""" Return a free monoid on `n` generators or with the generators indexed by a set `I`. A free monoid is constructed by specifing either: - the number of generators and/or the names of the generators - the indexing set for the generators INPUT: - ``index_set`` -- (optional) an index set for the generators; if an integer, then this represents `\{0, 1, \ldots, n-1\}` - ``names`` -- a string or list/tuple/iterable of strings (default: ``'x'``); the generator names or name prefix EXAMPLES:: sage: Monoids.free(index_set=ZZ) Free monoid indexed by Integer Ring sage: Monoids().free(ZZ) Free monoid indexed by Integer Ring sage: F.<x,y,z> = Monoids().free(); F Free monoid indexed by {'x', 'y', 'z'} """ if names is not None: if isinstance(names, str): from sage.rings.all import ZZ if ',' not in names and index_set in ZZ: names = [names + repr(i) for i in range(index_set)] else: names = names.split(',') names = tuple(names) if index_set is None: index_set = names from sage.monoids.indexed_free_monoid import IndexedFreeMonoid return IndexedFreeMonoid(index_set, names=names, **kwds)
def FreeMonoid(index_set=None, names=None, commutative=False, **kwds): r""" Return a free monoid on `n` generators or with the generators indexed by a set `I`. We construct free monoids by specifing either: - the number of generators and/or the names of the generators - the indexing set for the generators INPUT: - ``index_set`` -- an indexing set for the generators; if an integer, than this becomes `\{0, 1, \ldots, n-1\}` - ``names`` -- names of generators - ``commutative`` -- (default: ``False``) whether the free monoid is commutative or not OUTPUT: A free monoid. EXAMPLES:: sage: F.<a,b,c,d,e> = FreeMonoid(); F Free monoid on 5 generators (a, b, c, d, e) sage: FreeMonoid(index_set=ZZ) Free monoid indexed by Integer Ring sage: F.<x,y,z> = FreeMonoid(abelian=True); F Free abelian monoid on 3 generators (x, y, z) sage: FreeMonoid(index_set=ZZ, commutative=True) Free abelian monoid indexed by Integer Ring TESTS:: sage: FreeMonoid(index_set=ZZ, names='x,y,z') Free monoid indexed by Integer Ring """ if 'abelian' in kwds: commutative = kwds.pop('abelian') if commutative: from sage.monoids.free_abelian_monoid import FreeAbelianMonoid return FreeAbelianMonoid(index_set, names, **kwds) if isinstance(index_set, str): # Swap args (this works if names is None as well) names, index_set = index_set, names if index_set is None and names is not None: if isinstance(names, str): index_set = names.count(',') else: index_set = len(names) if index_set not in ZZ: if names is not None: names = normalize_names(-1, names) from sage.monoids.indexed_free_monoid import IndexedFreeMonoid return IndexedFreeMonoid(index_set, names=names, **kwds) if names is None: raise ValueError("names must be specified") return FreeMonoid_factory(index_set, names)