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
its dual (i.e., the group of homomorphisms from G to
). Let
,
, denote generators of
- say
is of order
. There are generators
,
, of
for which
and
if
. These
are used to construct
in the DualAbelianGroup class below.
SAGE supports multiplicative abelian groups on any prescribed finite
number
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
G, [names=X], [base_ring=Complex Field with 53 bits of precision]) |
Create the dual group of the multiplicative abelian group
.
Input:
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
x) |
Return True if
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
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
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
self, [i=0]) |
The
-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]
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.
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
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]
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.
self) |
Return the order of this group.
sage: G = AbelianGroup([2,3,9]) sage: Gd = DualAbelianGroup(G) sage: Gd.order() 54
self) |
Deprecated. Use self.random_element() instead.
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_
self, x) |
Create an element of this abelian group from
.
sage: F = AbelianGroup(10, [2]*10) sage: Fd = DualAbelianGroup(F) sage: Fd(Fd.2) X2 sage: Fd(1) 1
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
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
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] ) )
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] ) )$'
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.