22.5 Basic functionality for dual groups of finite multiplicative Abelian groups

Module: sage.groups.abelian_gps.dual_abelian_group

Basic functionality for dual groups of finite multiplicative Abelian groups

Author Log:

TODO: * additive abelian groups should also be supported.

The basic idea is very simple. Let G be an abelian group and $ G^*$ its dual (i.e., the group of homomorphisms from G to $ \mathbf{C}^\times$ ). Let $ g_j$ , $ j=1,..,n$ , denote generators of $ G$ - say $ g_j$ is of order $ m_j>1$ . There are generators $ X_j$ , $ j=1,..,n$ , of $ G^*$ for which $ X_j(g_j)=\exp(2\pi i/m_j)$ and $ X_i(g_j)=1$ if $ i\not= j$ . These are used to construct $ G^*$ in the DualAbelianGroup class below.

SAGE supports multiplicative abelian groups on any prescribed finite number $ n > 0$ of generators. Use the AbelianGroup function to create an abelian group, the DualAbelianGroup function to create its dual, and then the gen and gens functions to obtain the corresponding generators. You can print the generators as arbitrary strings using the optional names argument to the DualAbelianGroup function.

Module-level Functions

DualAbelianGroup( G, [names=X], [base_ring=Complex Field with 53 bits of precision])

Create the dual group of the multiplicative abelian group $ G$ .

Input:

G
- a finite abelian group
names
- (optional) names of generators

Output: The dual group of G.

sage: F = AbelianGroup(5, [2,5,7,8,9], names='abcde')
sage: (a, b, c, d, e) = F.gens()
sage: Fd = DualAbelianGroup(F,names='ABCDE')
sage: A,B,C,D,E = Fd.gens()
sage: A(a)    ## random
-1.0000000000000000 + 0.00000000000000013834419720915037*I
sage: A(b); A(c); A(d); A(e)
1.00000000000000
1.00000000000000
1.00000000000000
1.00000000000000

is_DualAbelianGroup( x)

Return True if $ x$ is the dual group of an abelian group.

sage: F = AbelianGroup(5,[3,5,7,8,9],names = list("abcde"))
sage: Fd = DualAbelianGroup(F)
sage: is_DualAbelianGroup(Fd)
True
sage: F = AbelianGroup(3,[1,2,3],names='a')
sage: Fd = DualAbelianGroup(F)
sage: Fd.gens()
(X0, X1)
sage: F.gens()
(a0, a1)

Class: DualAbelianGroup_class

class DualAbelianGroup_class
Dual of abelian group.

sage: F = AbelianGroup(5,[3,5,7,8,9],names = list("abcde"))
sage: DualAbelianGroup(F)
Dual of Abelian Group isomorphic to Z/3Z x Z/5Z x Z/7Z x Z/8Z x Z/9Z  over
Complex Field with 53 bits of precision
sage: F = AbelianGroup(4,[15,7,8,9],names = list("abcd"))
sage: DualAbelianGroup(F)
Dual of Abelian Group isomorphic to Z/3Z x Z/5Z x Z/7Z x Z/8Z x Z/9Z  over
Complex Field with 53 bits of precision

DualAbelianGroup_class( self, G, [names=X], [bse_ring=None])

If G has invariants invs = [n1,...,nk] then the default base_ring is CyclotoomicField(N), where N = LCM(n1,...,nk).

Functions: base_ring,$ \,$ gen,$ \,$ group,$ \,$ invariants,$ \,$ is_commutative,$ \,$ list,$ \,$ ngens,$ \,$ order,$ \,$ random,$ \,$ random_element

gen( self, [i=0])

The $ i$ -th generator of the abelian group.

sage: F = AbelianGroup(3,[1,2,3],names='a')
sage: Fd = DualAbelianGroup(F, names="A")
sage: Fd.0
A0
sage: Fd.1
A1
sage: Fd.invariants()
[2, 3]

invariants( self)

The invariants of the dual group.

sage: F = AbelianGroup(1000)
sage: Fd = DualAbelianGroup(F)
sage: invs = Fd.invariants(); len(invs)
1000

This can be slow for 10000 or more generators.

is_commutative( self)

Return True since this group is commutative.

sage: G = AbelianGroup([2,3,9])
sage: Gd = DualAbelianGroup(G)
sage: Gd.is_commutative()
True
sage: Gd.is_abelian()
True

list( self)

Return list of all elements of this group.

sage: G = AbelianGroup([2,3], names = "ab")
sage: Gd = DualAbelianGroup(G, names = "AB")
sage: Gd.list()
[1, B, B^2, A, A*B, A*B^2]

ngens( self)

The number of generators of the dual group.

sage: F = AbelianGroup(1000)
sage: Fd = DualAbelianGroup(F)
sage: Fd.ngens()
1000

This can be slow for 10000 or more generators.

order( self)

Return the order of this group.

sage: G = AbelianGroup([2,3,9])
sage: Gd = DualAbelianGroup(G)
sage: Gd.order()
54

random( self)

Deprecated. Use self.random_element() instead.

random_element( self)

Return a random element of this dual group.

sage: G = AbelianGroup([2,3,9])
sage: Gd = DualAbelianGroup(G)
sage: Gd.random_element()
X0*X1^2*X2
sage: N = 43^2-1
sage: G = AbelianGroup([N],names="a")
sage: Gd = DualAbelianGroup(G,names="A")
sage: a, = G.gens()
sage: A, = Gd.gens()
sage: x = a^(N/4); y = a^(N/3); z = a^(N/14)
sage: X = Gd.random_element(); X
A^615
sage: len([a for a in [x,y,z] if abs(X(a)-1)>10^(-8)])
2

Special Functions: __call__,$ \,$ __contains__,$ \,$ __init__,$ \,$ __iter__,$ \,$ __str__,$ \,$ _latex_,$ \,$ _repr_

__call__( self, x)

Create an element of this abelian group from $ x$ .

sage: F = AbelianGroup(10, [2]*10)
sage: Fd = DualAbelianGroup(F)
sage: Fd(Fd.2)
X2
sage: Fd(1)
1

__contains__( self, X)

Implements "in".

sage: F = AbelianGroup(5,[2, 3, 5, 7, 8], names="abcde")
sage: a,b,c,d,e = F.gens()
sage: Fd = DualAbelianGroup(F, names = "ABCDE")
sage: A,B,C,D,E = Fd.gens()
sage: A*B^2*D^7 in Fd
True

__iter__( self)

Return an iterator over the elements of this group.

sage: G = AbelianGroup([2,3], names = "ab")
sage: Gd = DualAbelianGroup(G, names = "AB")
sage: [X for X in Gd]
[1, B, B^2, A, A*B, A*B^2]
sage: N = 43^2-1
sage: G = AbelianGroup([N],names="a")
sage: Gd = DualAbelianGroup(G,names="A")
sage: a, = G.gens()
sage: A, = Gd.gens()
sage: x = a^(N/4)
sage: y = a^(N/3)
sage: z = a^(N/14)
sage: len([X for X in Gd if abs(X(x)-1)>0.01 and abs(X(y)-1)>0.01 and abs(X(z)-1)>0.01])
880

__str__( self)

Print method.

       sage: F = AbelianGroup(3,[5,64,729],names = list("abc"))
       sage: Fd = DualAbelianGroup(F)
sage: print Fd
       DualAbelianGroup( AbelianGroup ( 3, [5, 64, 729] ) )

_latex_( self)

Return latex representation of this group.

sage: F = AbelianGroup(3, [2]*3)
sage: Fd = DualAbelianGroup(F)
sage: Fd._latex_()  
'${\rm DualAbelianGroup}( AbelianGroup ( 3, [2, 2, 2] ) )$'

_repr_( self)

sage: F = AbelianGroup(5, [2,5,7,8,9], names='abcde')
sage: Fd = DualAbelianGroup(F,names='ABCDE',base_ring = CyclotomicField(2*5*7*8*9))
sage: Fd
Dual of Abelian Group isomorphic to Z/2Z x Z/5Z x Z/7Z x Z/8Z x Z/9Z  over
Cyclotomic Field of order 5040 and degree 1152
sage: Fd = DualAbelianGroup(F,names='ABCDE')
sage: Fd
Dual of Abelian Group isomorphic to Z/2Z x Z/5Z x Z/7Z x Z/8Z x Z/9Z  over
Complex Field with 53 bits of precision

See About this document... for information on suggesting changes.