Skip to content
Merged
Show file tree
Hide file tree
Changes from 62 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
a4418cf
sage.groups.additive_abelian: More # optional
mkoeppe Mar 11, 2023
e8ffe05
src/sage/groups/old.pyx: Add # optional
mkoeppe Mar 12, 2023
250fe18
src/sage/groups/additive_abelian/additive_abelian_wrapper.py: More # …
mkoeppe Mar 12, 2023
e0833e3
sage.groups: More # optional
mkoeppe Mar 13, 2023
44267e8
sage.groups: More # optional
mkoeppe Mar 18, 2023
c5d0dc6
sage.groups: More # optional
mkoeppe Apr 24, 2023
9a0b7d5
sage.groups: More # optional
mkoeppe Apr 25, 2023
d930b86
sage.groups: Fix # optional
mkoeppe May 13, 2023
1db61db
sage.groups: Fix # optional
mkoeppe May 13, 2023
4eb10cf
sage.groups: Add # optional
mkoeppe May 15, 2023
7dfdb06
Massive modularization fixes
mkoeppe May 17, 2023
9ea490d
src/sage/groups/braid.py: Modularization fix
mkoeppe May 20, 2023
ff7160a
More # optional
mkoeppe May 20, 2023
91b864e
sage.groups.perm_gps: Docstring cosmetics
mkoeppe May 23, 2023
d469cee
sage.groups: Add # optional
mkoeppe May 27, 2023
9785e7c
Add # optional
mkoeppe May 28, 2023
f67f93a
sage.groups: Add # optional
mkoeppe Jun 2, 2023
dcb1245
sage.groups: Add # optional
mkoeppe Jun 3, 2023
bb2839f
More # optional
mkoeppe Jun 4, 2023
4c049fb
More # optional
mkoeppe Jun 8, 2023
0c540ad
More # optional
mkoeppe Jun 9, 2023
456eb79
More # optional
mkoeppe Jun 11, 2023
2060548
src/sage/groups/groups_catalog.py: Use lazy_import
mkoeppe Jun 13, 2023
ad506ba
sage.groups.perm_gps: Modularization fixes for imports
mkoeppe Jun 16, 2023
e531f22
src/sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label…
mkoeppe Jun 16, 2023
f59d175
Add # optional
mkoeppe Jun 16, 2023
9916a1b
Fix imports
mkoeppe Jun 19, 2023
bf476b4
./sage -fixdoctests --long --distribution 'sagemath-modules' --probe …
mkoeppe Jul 1, 2023
ba6f9d2
./sage -fixdoctests --long --distribution 'sagemath-modules' --probe …
mkoeppe Jul 1, 2023
da35c29
./sage -fixdoctests --only-tags --overwrite src/sage/groups
mkoeppe Jul 13, 2023
56cd020
sage.groups: Update # needs
mkoeppe Jul 14, 2023
720ed90
sage.groups.matrix_gps: Update # needs
mkoeppe Jul 14, 2023
adc367a
sage.groups: Update # needs
mkoeppe Jul 14, 2023
6513050
sage.groups: Update # needs
mkoeppe Aug 7, 2023
9cbed2c
src/sage/groups: Update file-level doctest tag
mkoeppe Aug 7, 2023
b5804cf
src/sage/groups: sage -fixdoctests --only-tags
mkoeppe Aug 8, 2023
3934ed8
Update # needs
mkoeppe Aug 13, 2023
1a80d41
sage.groups: Restore lost comments
mkoeppe Sep 1, 2023
490cf3d
sage.groups: More block tags, doctest cosmetics
mkoeppe Sep 1, 2023
55e201c
sage.groups: More block tags, tag corrections
mkoeppe Sep 1, 2023
0ae88e7
sage.groups: More block tags, tag corrections
mkoeppe Sep 1, 2023
b0dbe78
sage.groups.matrix_gps: Remove some unnecessary # needs
mkoeppe Sep 1, 2023
fd374b1
src/sage/groups/matrix_gps/coxeter_group.py: Move import from number_…
mkoeppe Sep 1, 2023
9ce4300
src/sage/groups/matrix_gps/finitely_generated_gap.py: Move imports fr…
mkoeppe Sep 1, 2023
3410a40
src/sage/groups/group_semidirect_product.py: Doctest cosmetics
mkoeppe Sep 1, 2023
ade8009
sage.groups.matrix_gps: Fix # needs
mkoeppe Sep 1, 2023
2ec7684
src/sage/combinat/root_system/coxeter_group.py: Make imports of Refle…
mkoeppe Sep 1, 2023
8f47096
sage.groups.matrix_gps: Use file and block tags
mkoeppe Sep 2, 2023
f545f7c
src/sage/groups/affine_gps: Remove unnecessary tags
mkoeppe Sep 2, 2023
0151c23
sage.groups: Update # needs
mkoeppe Sep 2, 2023
cabcb56
sage.groups: Update # needs
mkoeppe Sep 2, 2023
3738574
sage.groups: Update # needs
mkoeppe Sep 2, 2023
607cb9c
sage.groups.matrix_gps: Update # needs
mkoeppe Sep 2, 2023
ed9fcb4
src/sage/sets/set_from_iterator.py: update doctest output
mkoeppe Sep 2, 2023
46f4200
src/sage/groups/braid.py: More block tags, doctest cosmetics, add mis…
mkoeppe Sep 2, 2023
ea6d9f3
src/sage/groups/galois_group.py: More block tags, doctest cosmetics
mkoeppe Sep 2, 2023
7ee72c7
src/sage/groups/misc_gps/imaginary_groups.py: More block tags
mkoeppe Sep 2, 2023
808c0f8
src/sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label…
mkoeppe Sep 2, 2023
c831802
src/sage/groups/perm_gps/permgroup_element.pyx: More block tags
mkoeppe Sep 2, 2023
39fc225
src/sage/groups/perm_gps/permgroup_element.pyx: Make docstrings raw
mkoeppe Sep 2, 2023
556ebad
src/sage/groups/perm_gps/permgroup_morphism.py: Make docstrings raw
mkoeppe Sep 2, 2023
2d0a7fa
src/sage/groups/generic.py: Fix doctest dataflow warnings
mkoeppe Sep 3, 2023
836c848
Merge remote-tracking branch 'upstream/develop' into needs_for_sage_g…
mkoeppe Sep 10, 2023
12f6ef8
bootstrap: Use 'ENABLE_SYSTEM_SITE_PACKAGES=yes sage-get-system-packa…
mkoeppe Sep 11, 2023
d271651
Merge branch 'fix_bootstrapped_pkg_metadata' into needs_for_sage_groups
mkoeppe Sep 13, 2023
0785206
Update pyproject.toml files to use version info from build/pkgs/setup…
mkoeppe Sep 13, 2023
366725c
Merge branch 'fix_bootstrapped_pkg_metadata' into pyproject_toml_setu…
mkoeppe Sep 13, 2023
02c01f3
Merge branch 'pyproject_toml_setuptools' into needs_for_sage_groups
mkoeppe Sep 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/sage/combinat/root_system/coxeter_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
# https://www.gnu.org/licenses/
# ***************************************************************************

from sage.combinat.root_system.weyl_group import WeylGroup
from sage.combinat.root_system.reflection_group_real import ReflectionGroup
from sage.combinat.root_system.cartan_type import CartanType
from sage.misc.lazy_import import lazy_import

lazy_import('from sage.combinat.root_system.reflection_group_real', 'ReflectionGroup')
lazy_import('sage.combinat.root_system.weyl_group', 'WeylGroup')


def CoxeterGroup(data, implementation="reflection", base_ring=None, index_set=None):
Expand Down
201 changes: 107 additions & 94 deletions src/sage/groups/abelian_gps/abelian_group.py

Large diffs are not rendered by default.

15 changes: 8 additions & 7 deletions src/sage/groups/abelian_gps/abelian_group_element.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,16 +97,16 @@ def as_permutation(self):

EXAMPLES::

sage: G = AbelianGroup(3,[2,3,4],names="abc"); G
sage: G = AbelianGroup(3, [2,3,4], names="abc"); G
Multiplicative Abelian group isomorphic to C2 x C3 x C4
sage: a,b,c = G.gens()
sage: Gp = G.permutation_group(); Gp
sage: Gp = G.permutation_group(); Gp # needs sage.groups
Permutation Group with generators [(6,7,8,9), (3,4,5), (1,2)]
sage: a.as_permutation()
sage: a.as_permutation() # needs sage.libs.gap
(1,2)
sage: ap = a.as_permutation(); ap
sage: ap = a.as_permutation(); ap # needs sage.libs.gap
(1,2)
sage: ap in Gp
sage: ap in Gp # needs sage.groups sage.libs.gap
True
"""
from sage.libs.gap.libgap import libgap
Expand Down Expand Up @@ -138,13 +138,14 @@ def word_problem(self, words):

EXAMPLES::

sage: G = AbelianGroup(2,[2,3], names="xy")
sage: # needs sage.libs.gap
sage: G = AbelianGroup(2, [2,3], names="xy")
sage: x,y = G.gens()
sage: x.word_problem([x,y])
[[x, 1]]
sage: y.word_problem([x,y])
[[y, 1]]
sage: v = (y*x).word_problem([x,y]); v #random
sage: v = (y*x).word_problem([x,y]); v # random
[[x, 1], [y, 1]]
sage: prod([x^i for x,i in v]) == y*x
True
Expand Down
84 changes: 47 additions & 37 deletions src/sage/groups/abelian_gps/dual_abelian_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
sage: F = AbelianGroup(5, [2,5,7,8,9], names='abcde')
sage: (a, b, c, d, e) = F.gens()

sage: # needs sage.rings.number_field
sage: Fd = F.dual_group(names='ABCDE')
sage: Fd.base_ring()
Cyclotomic Field of order 2520 and degree 576
Expand All @@ -34,6 +35,7 @@
sage: A(b), A(c), A(d), A(e)
(1, 1, 1, 1)

sage: # needs sage.rings.real_mpfr
sage: Fd = F.dual_group(names='ABCDE', base_ring=CC)
sage: A,B,C,D,E = Fd.gens()
sage: A(a) # abs tol 1e-8
Expand Down Expand Up @@ -78,6 +80,7 @@ def is_DualAbelianGroup(x):

EXAMPLES::

sage: # needs sage.rings.number_field
sage: from sage.groups.abelian_gps.dual_abelian_group import is_DualAbelianGroup
sage: F = AbelianGroup(5,[3,5,7,8,9], names=list("abcde"))
sage: Fd = F.dual_group()
Expand All @@ -100,11 +103,12 @@ class DualAbelianGroup_class(UniqueRepresentation, AbelianGroupBase):
EXAMPLES::

sage: F = AbelianGroup(5,[3,5,7,8,9], names="abcde")
sage: F.dual_group()
sage: F.dual_group() # needs sage.rings.number_field
Dual of Abelian Group isomorphic to Z/3Z x Z/5Z x Z/7Z x Z/8Z x Z/9Z
over Cyclotomic Field of order 2520 and degree 576

sage: F = AbelianGroup(4,[15,7,8,9], names="abcd")
sage: F.dual_group(base_ring=CC)
sage: F.dual_group(base_ring=CC) # needs sage.rings.real_mpfr
Dual of Abelian Group isomorphic to Z/15Z x Z/7Z x Z/8Z x Z/9Z
over Complex Field with 53 bits of precision
"""
Expand All @@ -117,7 +121,7 @@ def __init__(self, G, names, base_ring):
EXAMPLES::

sage: F = AbelianGroup(5,[3,5,7,8,9], names="abcde")
sage: F.dual_group()
sage: F.dual_group() # needs sage.rings.number_field
Dual of Abelian Group isomorphic to Z/3Z x Z/5Z x Z/7Z x Z/8Z x Z/9Z
over Cyclotomic Field of order 2520 and degree 576
"""
Expand Down Expand Up @@ -174,12 +178,13 @@ def _repr_(self):
EXAMPLES::

sage: F = AbelianGroup(5, [2,5,7,8,9], names='abcde')
sage: Fd = F.dual_group(names='ABCDE', base_ring=CyclotomicField(2*5*7*8*9))
sage: Fd # indirect doctest
sage: Fd = F.dual_group(names='ABCDE', # needs sage.rings.number_field
....: base_ring=CyclotomicField(2*5*7*8*9))
sage: Fd # indirect doctest # needs sage.rings.number_field
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 = F.dual_group(names='ABCDE', base_ring=CC)
sage: Fd
sage: Fd = F.dual_group(names='ABCDE', base_ring=CC) # needs sage.rings.real_mpfr
sage: Fd # needs sage.rings.real_mpfr
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
"""
Expand All @@ -202,8 +207,8 @@ def _latex_(self):
EXAMPLES::

sage: F = AbelianGroup(3, [2]*3)
sage: Fd = F.dual_group()
sage: Fd._latex_()
sage: Fd = F.dual_group() # needs sage.rings.number_field
sage: Fd._latex_() # needs sage.rings.number_field
'$\\mathrm{DualAbelianGroup}( AbelianGroup ( 3, (2, 2, 2) ) )$'
"""
return r"$\mathrm{DualAbelianGroup}( AbelianGroup ( %s, %s ) )$" % (self.ngens(), self.gens_orders())
Expand All @@ -215,12 +220,13 @@ def random_element(self):
EXAMPLES::

sage: G = AbelianGroup([2,3,9])
sage: Gd = G.dual_group(base_ring=CC)
sage: Gd.random_element().parent() is Gd
sage: Gd = G.dual_group(base_ring=CC) # needs sage.rings.real_mpfr
sage: Gd.random_element().parent() is Gd # needs sage.rings.real_mpfr
True

sage: N = 43^2-1
sage: G = AbelianGroup([N],names="a")
sage: # needs sage.rings.real_mpfr
sage: N = 43^2 - 1
sage: G = AbelianGroup([N], names="a")
sage: Gd = G.dual_group(names="A", base_ring=CC)
sage: a, = G.gens()
sage: A, = Gd.gens()
Expand All @@ -243,7 +249,8 @@ def gen(self, i=0):

EXAMPLES::

sage: F = AbelianGroup(3,[1,2,3],names='a')
sage: # needs sage.rings.number_field
sage: F = AbelianGroup(3, [1,2,3], names='a')
sage: Fd = F.dual_group(names="A")
sage: Fd.0
1
Expand All @@ -270,8 +277,8 @@ def gens(self):

EXAMPLES::

sage: F = AbelianGroup([7,11]).dual_group()
sage: F.gens()
sage: F = AbelianGroup([7,11]).dual_group() # needs sage.rings.number_field
sage: F.gens() # needs sage.rings.number_field
(X0, X1)
"""
n = self.group().ngens()
Expand All @@ -284,8 +291,8 @@ def ngens(self):
EXAMPLES::

sage: F = AbelianGroup([7]*100)
sage: Fd = F.dual_group()
sage: Fd.ngens()
sage: Fd = F.dual_group() # needs sage.rings.number_field
sage: Fd.ngens() # needs sage.rings.number_field
100
"""
return self.group().ngens()
Expand All @@ -301,8 +308,8 @@ def gens_orders(self):
EXAMPLES::

sage: F = AbelianGroup([5]*1000)
sage: Fd = F.dual_group()
sage: invs = Fd.gens_orders(); len(invs)
sage: Fd = F.dual_group() # needs sage.rings.number_field
sage: invs = Fd.gens_orders(); len(invs) # needs sage.rings.number_field
1000
"""
return self.group().gens_orders()
Expand All @@ -316,8 +323,8 @@ def invariants(self):
EXAMPLES::

sage: F = AbelianGroup([5]*1000)
sage: Fd = F.dual_group()
sage: invs = Fd.gens_orders(); len(invs)
sage: Fd = F.dual_group() # needs sage.rings.number_field
sage: invs = Fd.gens_orders(); len(invs) # needs sage.rings.number_field
1000
"""
# TODO: deprecate
Expand All @@ -331,9 +338,9 @@ def __contains__(self, X):

sage: F = AbelianGroup(5,[2, 3, 5, 7, 8], names="abcde")
sage: a,b,c,d,e = F.gens()
sage: Fd = F.dual_group(names = "ABCDE")
sage: A,B,C,D,E = Fd.gens()
sage: A*B^2*D^7 in Fd
sage: Fd = F.dual_group(names="ABCDE") # needs sage.rings.number_field
sage: A,B,C,D,E = Fd.gens() # needs sage.rings.number_field
sage: A*B^2*D^7 in Fd # needs sage.rings.number_field
True
"""
return X.parent() == self and is_DualAbelianGroupElement(X)
Expand All @@ -345,8 +352,8 @@ def order(self):
EXAMPLES::

sage: G = AbelianGroup([2,3,9])
sage: Gd = G.dual_group()
sage: Gd.order()
sage: Gd = G.dual_group() # needs sage.rings.number_field
sage: Gd.order() # needs sage.rings.number_field
54
"""
G = self.group()
Expand All @@ -359,10 +366,10 @@ def is_commutative(self):
EXAMPLES::

sage: G = AbelianGroup([2,3,9])
sage: Gd = G.dual_group()
sage: Gd.is_commutative()
sage: Gd = G.dual_group() # needs sage.rings.number_field
sage: Gd.is_commutative() # needs sage.rings.number_field
True
sage: Gd.is_abelian()
sage: Gd.is_abelian() # needs sage.rings.number_field
True
"""
return True
Expand All @@ -375,8 +382,8 @@ def list(self):
EXAMPLES::

sage: G = AbelianGroup([2,3], names="ab")
sage: Gd = G.dual_group(names="AB")
sage: Gd.list()
sage: Gd = G.dual_group(names="AB") # needs sage.rings.number_field
sage: Gd.list() # needs sage.rings.number_field
(1, B, B^2, A, A*B, A*B^2)
"""
if not self.is_finite():
Expand All @@ -391,18 +398,21 @@ def __iter__(self):
EXAMPLES::

sage: G = AbelianGroup([2,3], names="ab")
sage: Gd = G.dual_group(names="AB")
sage: [X for X in Gd]
sage: Gd = G.dual_group(names="AB") # needs sage.rings.number_field
sage: [X for X in Gd] # needs sage.rings.number_field
[1, B, B^2, A, A*B, A*B^2]
sage: N = 43^2-1
sage: G = AbelianGroup([N],names="a")

sage: # needs sage.rings.real_mpfr
sage: N = 43^2 - 1
sage: G = AbelianGroup([N], names="a")
sage: Gd = G.dual_group(names="A", base_ring=CC)
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])
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
"""
yield from self.list()
14 changes: 8 additions & 6 deletions src/sage/groups/abelian_gps/dual_abelian_group_element.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
sage: F
Multiplicative Abelian group isomorphic to C2 x C3 x C5 x C7 x C8

sage: Fd = F.dual_group(names="ABCDE")
sage: Fd
sage: Fd = F.dual_group(names="ABCDE"); Fd # needs sage.rings.number_field
Dual of Abelian Group isomorphic to Z/2Z x Z/3Z x Z/5Z x Z/7Z x Z/8Z
over Cyclotomic Field of order 840 and degree 192

The elements of the dual group can be evaluated on elements of the original group::

sage: # needs sage.rings.number_field
sage: a,b,c,d,e = F.gens()
sage: A,B,C,D,E = Fd.gens()
sage: A*B^2*D^7
Expand Down Expand Up @@ -71,10 +71,10 @@ def is_DualAbelianGroupElement(x) -> bool:
EXAMPLES::

sage: from sage.groups.abelian_gps.dual_abelian_group import is_DualAbelianGroupElement
sage: F = AbelianGroup(5, [5,5,7,8,9], names=list("abcde")).dual_group()
sage: is_DualAbelianGroupElement(F)
sage: F = AbelianGroup(5, [5,5,7,8,9], names=list("abcde")).dual_group() # needs sage.rings.number_field
sage: is_DualAbelianGroupElement(F) # needs sage.rings.number_field
False
sage: is_DualAbelianGroupElement(F.an_element())
sage: is_DualAbelianGroupElement(F.an_element()) # needs sage.rings.number_field
True
"""
return isinstance(x, DualAbelianGroupElement)
Expand All @@ -96,6 +96,7 @@ def __call__(self, g):

EXAMPLES::

sage: # needs sage.rings.number_field
sage: F = AbelianGroup(5, [2,3,5,7,8], names="abcde")
sage: a,b,c,d,e = F.gens()
sage: Fd = F.dual_group(names="ABCDE")
Expand All @@ -117,7 +118,7 @@ def __call__(self, g):
sage: a, = F.gens()
sage: Fd = F.dual_group(names="A", base_ring=GF(29))
sage: A, = Fd.gens()
sage: A(a)
sage: A(a) # needs sage.libs.pari
16
"""
F = self.parent().base_ring()
Expand Down Expand Up @@ -146,6 +147,7 @@ def word_problem(self, words):

EXAMPLES::

sage: # needs sage.rings.number_field
sage: G = AbelianGroup(5,[3, 5, 5, 7, 8], names="abcde")
sage: Gd = G.dual_group(names="abcde")
sage: a,b,c,d,e = Gd.gens()
Expand Down
25 changes: 13 additions & 12 deletions src/sage/groups/abelian_gps/element_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ class AbelianGroupElementBase(MultiplicativeGroupElement):
EXAMPLES::

sage: F = AbelianGroup(3,[7,8,9])
sage: Fd = F.dual_group(names="ABC")
sage: A,B,C = Fd.gens()
sage: A*B^-1 in Fd
sage: Fd = F.dual_group(names="ABC") # needs sage.rings.number_field
sage: A,B,C = Fd.gens() # needs sage.rings.number_field
sage: A*B^-1 in Fd # needs sage.rings.number_field
True
"""

Expand All @@ -61,9 +61,9 @@ def __init__(self, parent, exponents):
EXAMPLES::

sage: F = AbelianGroup(3,[7,8,9])
sage: Fd = F.dual_group(names="ABC")
sage: A,B,C = Fd.gens()
sage: A*B^-1 in Fd
sage: Fd = F.dual_group(names="ABC") # needs sage.rings.number_field
sage: A,B,C = Fd.gens() # needs sage.rings.number_field
sage: A*B^-1 in Fd # needs sage.rings.number_field
True

Check that :issue:`35216` is fixed::
Expand Down Expand Up @@ -125,7 +125,7 @@ def _libgap_(self):
TESTS::

sage: F.<a,b,c> = AbelianGroup([7,8,9])
sage: libgap(a**2 * c) * libgap(b * c**2)
sage: libgap(a**2 * c) * libgap(b * c**2) # needs sage.libs.gap
f1^2*f2*f6
"""
from sage.misc.misc_c import prod
Expand All @@ -147,6 +147,7 @@ def list(self):

EXAMPLES::

sage: # needs sage.rings.number_field
sage: F = AbelianGroup(5,[2, 3, 5, 7, 8], names="abcde")
sage: a,b,c,d,e = F.gens()
sage: Ad = F.dual_group(names="ABCDE")
Expand Down Expand Up @@ -208,8 +209,8 @@ def _richcmp_(self, other, op):
sage: a > b
True

sage: Gd.<A,B> = G.dual_group()
sage: A > B
sage: Gd.<A,B> = G.dual_group() # needs sage.rings.number_field
sage: A > B # needs sage.rings.number_field
True
"""
return richcmp(self._exponents, other._exponents, op)
Expand All @@ -226,9 +227,9 @@ def order(self):
EXAMPLES::

sage: F = AbelianGroup(3,[7,8,9])
sage: Fd = F.dual_group()
sage: A,B,C = Fd.gens()
sage: (B*C).order()
sage: Fd = F.dual_group() # needs sage.rings.number_field
sage: A,B,C = Fd.gens() # needs sage.rings.number_field
sage: (B*C).order() # needs sage.rings.number_field
72

sage: F = AbelianGroup(3,[7,8,9]); F
Expand Down
Loading