def __init__(self, group, base_ring=IntegerRing()): r""" See :class:`GroupAlgebra` for full documentation. EXAMPLES:: sage: GroupAlgebra(GL(3, GF(7))) Group algebra of group "General Linear Group of degree 3 over Finite Field of size 7" over base ring Integer Ring """ from sage.groups.group import is_Group if not base_ring.is_commutative(): raise NotImplementedError("Base ring must be commutative") if not is_Group(group): raise TypeError('"%s" is not a group' % group) self._group = group CombinatorialFreeModule.__init__(self, base_ring, group, prefix='', bracket=False, category=HopfAlgebrasWithBasis(base_ring)) if not base_ring.has_coerce_map_from(group) : ## some matrix groups assume that coercion is only valid to ## other matrix groups. This is a workaround ## call _element_constructor_ to coerce group elements #try : self._populate_coercion_lists_(coerce_list=[base_ring, group]) #except TypeError : # self._populate_coercion_lists_( coerce_list = [base_ring] ) else : self._populate_coercion_lists_(coerce_list=[base_ring])
def __init__(self, group, base_ring = IntegerRing()): r""" Create the given group algebra. INPUT: -- (Group) group: a generic group. -- (Ring) base_ring: a commutative ring. OUTPUT: -- a GroupAlgebra instance. EXAMPLES:: sage: from sage.algebras.group_algebra import GroupAlgebra doctest:1: DeprecationWarning:... sage: GroupAlgebra(GL(3, GF(7))) Group algebra of group "General Linear Group of degree 3 over Finite Field of size 7" over base ring Integer Ring sage: GroupAlgebra(1) Traceback (most recent call last): ... TypeError: "1" is not a group sage: GroupAlgebra(SU(2, GF(4, 'a')), IntegerModRing(12)).category() Category of group algebras over Ring of integers modulo 12 """ if not base_ring.is_commutative(): raise NotImplementedError("Base ring must be commutative") if not is_Group(group): raise TypeError('"%s" is not a group' % group) ParentWithGens.__init__(self, base_ring, category = GroupAlgebras(base_ring)) self._formal_sum_module = FormalSums(base_ring) self._group = group
def __init__(self, group, base_ring=IntegerRing()): r""" See :class:`GroupAlgebra` for full documentation. EXAMPLES:: sage: GroupAlgebra(GL(3, GF(7))) Group algebra of group "General Linear Group of degree 3 over Finite Field of size 7" over base ring Integer Ring """ from sage.groups.group import is_Group if not base_ring.is_commutative(): raise NotImplementedError("Base ring must be commutative") if not is_Group(group): raise TypeError('"%s" is not a group' % group) self._group = group CombinatorialFreeModule.__init__(self, base_ring, group, prefix='', bracket=False, category=GroupAlgebras(base_ring)) if not base_ring.has_coerce_map_from(group): ## some matrix groups assume that coercion is only valid to ## other matrix groups. This is a workaround ## call _element_constructor_ to coerce group elements #try : self._populate_coercion_lists_(coerce_list=[group])
def _element_constructor_(self, x): r""" Try to turn ``x`` into an element of ``self``. INPUT: - ``x`` - an element of some group algebra or of a ring or of a group OUTPUT: ``x`` as a member of ``self``. sage: G = KleinFourGroup() sage: f = G.gen(0) sage: ZG = GroupAlgebra(G) sage: ZG(f) # indirect doctest (3,4) sage: ZG(1) == ZG(G(1)) True sage: G = AbelianGroup(1) sage: ZG = GroupAlgebra(G) sage: f = ZG.group().gen() sage: ZG(FormalSum([(1,f), (2, f**2)])) f + 2*f^2 sage: G = GL(2,7) sage: OG = GroupAlgebra(G, ZZ[sqrt(5)]) sage: OG(2) 2*[1 0] [0 1] sage: OG(G(2)) # conversion is not the obvious one [2 0] [0 2] sage: OG(FormalSum([ (1, G(2)), (2, RR(0.77)) ]) ) Traceback (most recent call last): ... TypeError: Attempt to coerce non-integral RealNumber to Integer sage: OG(OG.base_ring().gens()[1]) sqrt5*[1 0] [0 1] """ from sage.rings.all import is_Ring from sage.groups.group import is_Group from sage.structure.formal_sum import FormalSum k = self.base_ring() G = self.group() S = x.parent() if isinstance(S, GroupAlgebra): if self.has_coerce_map_from(S): # coerce monomials, coerce coefficients, reassemble d = x.monomial_coefficients() new_d = {} for g in d: g1 = G(g) if g1 in new_d: new_d[g1] += k(d[g]) + new_d[g1] else: new_d[g1] = k(d[g]) return self._from_dict(new_d) elif is_Ring(S): # coerce to multiple of identity element return k(x) * self(1) elif is_Group(S): # Check whether group coerces to base_ring first. if k.has_coerce_map_from(S): return k(x) * self(1) if G.has_coerce_map_from(S): return self.monomial(self.group()(x)) elif isinstance(x, FormalSum) and k.has_coerce_map_from(S.base_ring()): y = [(G(g), k(coeff)) for coeff,g in x] return self.sum_of_terms(y) raise TypeError("Don't know how to create an element of %s from %s" % \ (self, x))
def _element_constructor_(self, x): r""" Try to turn ``x`` into an element of ``self``. INPUT: - ``x`` - an element of some group algebra or of a ring or of a group OUTPUT: ``x`` as a member of ``self``. sage: G = KleinFourGroup() sage: f = G.gen(0) sage: ZG = GroupAlgebra(G) sage: ZG(f) # indirect doctest (3,4) sage: ZG(1) == ZG(G(1)) True sage: G = AbelianGroup(1) sage: ZG = GroupAlgebra(G) sage: f = ZG.group().gen() sage: ZG(FormalSum([(1,f), (2, f**2)])) f + 2*f^2 sage: G = GL(2,7) sage: OG = GroupAlgebra(G, ZZ[sqrt(5)]) sage: OG(2) 2*[1 0] [0 1] sage: OG(G(2)) # conversion is not the obvious one [2 0] [0 2] sage: OG(FormalSum([ (1, G(2)), (2, RR(0.77)) ]) ) Traceback (most recent call last): ... TypeError: Attempt to coerce non-integral RealNumber to Integer sage: OG(OG.base_ring().basis()[1]) sqrt5*[1 0] [0 1] """ from sage.rings.ring import is_Ring from sage.groups.group import is_Group from sage.structure.formal_sum import FormalSum k = self.base_ring() G = self.group() S = x.parent() if isinstance(S, GroupAlgebra): if self.has_coerce_map_from(S): # coerce monomials, coerce coefficients, reassemble d = x.monomial_coefficients() new_d = {} for g in d: g1 = G(g) if g1 in new_d: new_d[g1] += k(d[g]) + new_d[g1] else: new_d[g1] = k(d[g]) return self._from_dict(new_d) elif is_Ring(S): # coerce to multiple of identity element return k(x) * self(1) elif is_Group(S): # Check whether group coerces to base_ring first. if k.has_coerce_map_from(S): return k(x) * self(1) if G.has_coerce_map_from(S): return self.monomial(self.group()(x)) elif isinstance(x, FormalSum) and k.has_coerce_map_from(S.base_ring()): y = [(G(g), k(coeff)) for coeff, g in x] return self.sum_of_terms(y) raise TypeError("Don't know how to create an element of %s from %s" % \ (self, x))