From bfc5cdfe0fb76e8b56c65ea4453a5ff9c9a7c620 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 20 Feb 2023 11:46:26 -0800 Subject: [PATCH 01/23] src/sage/rings/finite_rings/integer_mod.pyx: Move import from sage.groups into method --- src/sage/rings/finite_rings/integer_mod.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index 9a77aadd7c3..22b8cb62986 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -108,7 +108,6 @@ from sage.structure.parent cimport Parent from sage.arith.misc import CRT as crt from sage.arith.functions import lcm -from sage.groups.generic import discrete_log cdef Integer one_Z = Integer(1) @@ -781,6 +780,7 @@ cdef class IntegerMod_abstract(FiniteRingElement): if p == 2 and e >= 3: # (ZZ/2^e)* is not cyclic; must not give unsolvable DLPs to Pari try: + from sage.groups.generic import discrete_log v = discrete_log(a_red, b_red, nb) except ValueError: raise ValueError(f"no logarithm of {self} found to base {b} modulo {self.modulus()}" From 4c437cb947997f814b71ec64cd777def01a7dc79 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 3 Jun 2023 17:00:24 -0700 Subject: [PATCH 02/23] sage.rings: More # optional --- src/sage/rings/finite_rings/integer_mod.pyx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index 22b8cb62986..301313731df 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -4099,7 +4099,7 @@ def lucas_q1(mm, IntegerMod_abstract P): TESTS:: sage: from sage.rings.finite_rings.integer_mod import lucas_q1 - sage: all(lucas_q1(k, a) == BinaryRecurrenceSequence(a, -1, 2, a)(k) # optional - sage.combinat + sage: all(lucas_q1(k, a) == BinaryRecurrenceSequence(a, -1, 2, a)(k) # optional - sage.combinat sage.modules ....: for a in Integers(23) ....: for k in range(13)) True @@ -4167,7 +4167,7 @@ def lucas(k, P, Q=1, n=None): sage: p = randint(0,100000) sage: q = randint(0,100000) sage: n = randint(1,100) - sage: all(lucas(k, p, q, n)[0] == Mod(lucas_number2(k, p, q), n) # optional - sage.combinat + sage: all(lucas(k, p, q, n)[0] == Mod(lucas_number2(k, p, q), n) # optional - sage.combinat sage.libs.gap ....: for k in Integers(20)) True sage: from sage.rings.finite_rings.integer_mod import lucas @@ -4175,7 +4175,8 @@ def lucas(k, P, Q=1, n=None): sage: q = randint(0,100000) sage: n = randint(1,100) sage: k = randint(0,100) - sage: lucas(k, p, q, n) == [Mod(lucas_number2(k, p, q), n), Mod(q^(int(k/2)), n)] # optional - sage.combinat + sage: lucas(k, p, q, n) == [Mod(lucas_number2(k, p, q), n), # optional - sage.combinat + ....: Mod(q^(int(k/2)), n)] True EXAMPLES:: From 97b539850a38da2108f64cc8f1f1be98c1f610e6 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Fri, 9 Jun 2023 00:55:41 -0700 Subject: [PATCH 03/23] More # optional --- src/sage/rings/finite_rings/integer_mod.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index 301313731df..1dcfcb2b285 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -4175,7 +4175,7 @@ def lucas(k, P, Q=1, n=None): sage: q = randint(0,100000) sage: n = randint(1,100) sage: k = randint(0,100) - sage: lucas(k, p, q, n) == [Mod(lucas_number2(k, p, q), n), # optional - sage.combinat + sage: lucas(k, p, q, n) == [Mod(lucas_number2(k, p, q), n), # optional - sage.combinat sage.libs.gap ....: Mod(q^(int(k/2)), n)] True From d1f57049d1e04c4b5de93ca6c92456b0700173e1 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Tue, 27 Jun 2023 20:59:11 -0700 Subject: [PATCH 04/23] sage.rings.finite_rings: More # optional --- .../finite_rings/finite_field_prime_modn.py | 14 +-- .../rings/finite_rings/hom_finite_field.pyx | 100 +++++++++--------- .../finite_rings/hom_prime_finite_field.pyx | 8 +- src/sage/rings/finite_rings/homset.py | 66 ++++++------ 4 files changed, 94 insertions(+), 94 deletions(-) diff --git a/src/sage/rings/finite_rings/finite_field_prime_modn.py b/src/sage/rings/finite_rings/finite_field_prime_modn.py index afd18b7d64d..75ce63db376 100644 --- a/src/sage/rings/finite_rings/finite_field_prime_modn.py +++ b/src/sage/rings/finite_rings/finite_field_prime_modn.py @@ -47,7 +47,7 @@ class FiniteField_prime_modn(FiniteField_generic, integer_mod_ring.IntegerModRin sage: FiniteField(3) Finite Field of size 3 - sage: FiniteField(next_prime(1000)) + sage: FiniteField(next_prime(1000)) # optional - sage.rings.finite_rings Finite Field of size 1009 """ def __init__(self, p, check=True, modulus=None): @@ -104,7 +104,7 @@ def _coerce_map_from_(self, S): 5 sage: 12 % 7 5 - sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 11319 + sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 11319 # optional - sage.rings.finite_rings 1 sage: K. = QuadraticField(337) # See trac 11319 sage: pp = K.ideal(13).factor()[0][0] @@ -117,12 +117,12 @@ def _coerce_map_from_(self, S): Check that :trac:`19573` is resolved:: - sage: Integers(9).hom(GF(3)) + sage: Integers(9).hom(GF(3)) # optional - sage.rings.finite_rings Natural morphism: From: Ring of integers modulo 9 To: Finite Field of size 3 - sage: Integers(9).hom(GF(5)) + sage: Integers(9).hom(GF(5)) # optional - sage.rings.finite_rings Traceback (most recent call last): ... TypeError: natural coercion morphism from Ring of integers modulo 9 to Finite Field of size 5 not defined @@ -201,7 +201,7 @@ def is_prime_field(self): sage: k.is_prime_field() True - sage: k. = GF(3^2) + sage: k. = GF(3^2) # optional - sage.rings.finite_rings sage: k.is_prime_field() False """ @@ -271,7 +271,7 @@ def gen(self, n=0): sage: k = GF(13) sage: k.gen() 1 - sage: k = GF(1009, modulus="primitive") + sage: k = GF(1009, modulus="primitive") # optional - sage.rings.finite_rings sage: k.gen() # this gives a primitive element 11 sage: k.gen(1) @@ -304,7 +304,7 @@ def __iter__(self): We can even start iterating over something that would be too big to actually enumerate:: - sage: K = GF(next_prime(2^256)) + sage: K = GF(next_prime(2^256)) # optional - sage.rings.finite_rings sage: all = iter(K) sage: next(all) 0 diff --git a/src/sage/rings/finite_rings/hom_finite_field.pyx b/src/sage/rings/finite_rings/hom_finite_field.pyx index 23240b9d5b1..5062fd943a6 100644 --- a/src/sage/rings/finite_rings/hom_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_finite_field.pyx @@ -13,8 +13,8 @@ EXAMPLES:: Construction of an embedding:: - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f Ring morphism: From: Finite Field in t of size 3^7 @@ -44,8 +44,8 @@ map which is the inverse of `f` on the image of `f`:: There is no embedding of `GF(5^6)` into `GF(5^11)`:: - sage: k. = GF(5^6) - sage: K. = GF(5^11) + sage: k. = GF(5^6) # optional - sage.rings.finite_rings + sage: K. = GF(5^11) # optional - sage.rings.finite_rings sage: FiniteFieldHomomorphism_generic(Hom(k, K)) Traceback (most recent call last): ... @@ -54,7 +54,7 @@ There is no embedding of `GF(5^6)` into `GF(5^11)`:: Construction of Frobenius endomorphisms:: - sage: k. = GF(7^14) + sage: k. = GF(7^14) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^7 on Finite Field in t of size 7^14 sage: Frob(t) @@ -125,8 +125,8 @@ cdef class SectionFiniteFieldHomomorphism_generic(Section): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section() sage: g(f(t^3+t^2+1)) @@ -153,8 +153,8 @@ cdef class SectionFiniteFieldHomomorphism_generic(Section): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section() sage: g._repr_() @@ -170,8 +170,8 @@ cdef class SectionFiniteFieldHomomorphism_generic(Section): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section() sage: g._latex_() @@ -188,8 +188,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: TestSuite(f).run() @@ -199,16 +199,16 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f Ring morphism: From: Finite Field in t of size 3^7 To: Finite Field in T of size 3^21 Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T - sage: k. = GF(3^6) - sage: K. = GF(3^9) + sage: k. = GF(3^6) # optional - sage.rings.finite_rings + sage: K. = GF(3^9) # optional - sage.rings.finite_rings sage: FiniteFieldHomomorphism_generic(Hom(k, K)) Traceback (most recent call last): ... @@ -249,8 +249,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = copy(f) sage: g.section()(g(t)) == f.section()(f(t)) @@ -282,8 +282,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f._latex_() '\\Bold{F}_{3^{7}} \\hookrightarrow \\Bold{F}_{3^{21}}' @@ -295,8 +295,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^3) - sage: K. = GF(3^9) + sage: k. = GF(3^3) # optional - sage.rings.finite_rings + sage: K. = GF(3^9) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f(t) 2*T^6 + 2*T^4 + T^2 + T @@ -323,8 +323,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^3) - sage: K. = GF(3^9) + sage: k. = GF(3^3) # optional - sage.rings.finite_rings + sage: K. = GF(3^9) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f.is_injective() True @@ -340,8 +340,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^3) - sage: K. = GF(3^9) + sage: k. = GF(3^3) # optional - sage.rings.finite_rings + sage: K. = GF(3^9) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f.is_surjective() False @@ -364,8 +364,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) - sage: K. = GF(3^21) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: K. = GF(3^21) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section(); g Section of Ring morphism: @@ -395,7 +395,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: - sage: k. = GF(3^7) + sage: k. = GF(3^7) # optional - sage.rings.finite_rings sage: K., f = k.extension(3, map=True) sage: b = f(t^2); b 2*T^20 + 2*T^19 + T^18 + T^15 + 2*T^14 + 2*T^13 + 2*T^12 + T^8 + 2*T^6 + T^5 + 2*T^4 + T^3 + 2*T^2 + T @@ -417,7 +417,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: embed = Frob.fixed_field()[1] sage: hash(embed) # random @@ -431,7 +431,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: embed = Frob.fixed_field()[1] sage: embed.__reduce__() # indirect doctest @@ -459,7 +459,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: embed = Frob.fixed_field()[1] sage: f = loads(dumps(embed)) @@ -481,7 +481,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): TESTS:: - sage: k. = GF(7^11) + sage: k. = GF(7^11) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism(5) sage: TestSuite(Frob).run() @@ -506,7 +506,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FrobeniusEndomorphism_finite_field - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: FrobeniusEndomorphism_finite_field(k) Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3 sage: FrobeniusEndomorphism_finite_field(k, 2) @@ -543,7 +543,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3 @@ -567,7 +567,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3 @@ -590,7 +590,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: Frob._latex_() 't \\mapsto t^{5}' @@ -612,7 +612,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): """ TESTS:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: Frob(t) 2*t^2 + 4*t + 4 @@ -631,7 +631,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) + sage: k. = GF(5^12) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: Frob.order() 12 @@ -654,7 +654,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) + sage: k. = GF(5^12) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: Frob.power() 1 @@ -672,7 +672,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) + sage: k. = GF(5^12) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12 sage: Frob^2 @@ -694,7 +694,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(7^11) + sage: k. = GF(7^11) # optional - sage.rings.finite_rings sage: f = k.frobenius_endomorphism(5) sage: (f.inverse() * f).is_identity() True @@ -707,7 +707,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) + sage: k. = GF(5^12) # optional - sage.rings.finite_rings sage: f = k.frobenius_endomorphism(); f Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12 sage: g = k.frobenius_endomorphism(2); g @@ -745,7 +745,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^6) + sage: k. = GF(5^6) # optional - sage.rings.finite_rings sage: f = k.frobenius_endomorphism(2) sage: kfixed, embed = f.fixed_field() sage: kfixed @@ -778,7 +778,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: Frob.is_injective() True @@ -793,7 +793,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: Frob.is_surjective() True @@ -807,7 +807,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: Frob.is_identity() False @@ -822,7 +822,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism() sage: hash(Frob) # random 383183030479672104 @@ -835,7 +835,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): TESTS:: - sage: k. = GF(5^3) + sage: k. = GF(5^3) # optional - sage.rings.finite_rings sage: Frob = k.frobenius_endomorphism(2) sage: Frob Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3 diff --git a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx index acf63449e5a..d688de98acd 100644 --- a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx @@ -53,15 +53,15 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime sage: k = GF(3) - sage: K. = GF(3^4) + sage: K. = GF(3^4) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f Ring morphism: From: Finite Field of size 3 To: Finite Field in T of size 3^4 Defn: 1 |--> 1 - sage: k. = GF(3^2) - sage: K. = GF(3^4) + sage: k. = GF(3^2) # optional - sage.rings.finite_rings + sage: K. = GF(3^4) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f Traceback (most recent call last): ... @@ -81,7 +81,7 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime sage: k = GF(3) - sage: K. = GF(3^5) + sage: K. = GF(3^5) # optional - sage.rings.finite_rings sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)) sage: a = f(4); a 1 diff --git a/src/sage/rings/finite_rings/homset.py b/src/sage/rings/finite_rings/homset.py index ef629016983..3e62ac60015 100644 --- a/src/sage/rings/finite_rings/homset.py +++ b/src/sage/rings/finite_rings/homset.py @@ -6,8 +6,8 @@ EXAMPLES:: sage: R. = ZZ[] - sage: E. = GF(25, modulus = t^2 - 2) - sage: F. = GF(625) + sage: E. = GF(25, modulus = t^2 - 2) # optional - sage.rings.finite_rings + sage: F. = GF(625) # optional - sage.rings.finite_rings sage: H = Hom(E, F) sage: f = H([4*b^3 + 4*b^2 + 4*b]); f Ring morphism: @@ -27,10 +27,10 @@ sage: End(E) Automorphism group of Finite Field in a of size 5^2 - sage: End(GF(7))[0] + sage: End(GF(7))[0] # optional - sage.rings.finite_rings Ring endomorphism of Finite Field of size 7 Defn: 1 |--> 1 - sage: H = Hom(GF(7), GF(49, 'c')) + sage: H = Hom(GF(7), GF(49, 'c')) # optional - sage.rings.finite_rings sage: H[0](2) 2 """ @@ -59,8 +59,8 @@ def __call__(self, im_gens, base_map=None, check=True): EXAMPLES:: sage: R. = ZZ[] - sage: E. = GF(25, modulus = t^2 - 2) - sage: F. = GF(625) + sage: E. = GF(25, modulus = t^2 - 2) # optional - sage.rings.finite_rings + sage: F. = GF(625) # optional - sage.rings.finite_rings sage: End(E) Automorphism group of Finite Field in a of size 5^2 sage: list(Hom(E, F)) @@ -74,17 +74,17 @@ def __call__(self, im_gens, base_map=None, check=True): Defn: a |--> b^3 + b^2 + b] sage: [phi(2*a)^2 for phi in Hom(E, F)] [3, 3] - sage: End(GF(7))[0] + sage: End(GF(7))[0] # optional - sage.rings.finite_rings Ring endomorphism of Finite Field of size 7 Defn: 1 |--> 1 - sage: H = Hom(GF(7), GF(49, 'c')) + sage: H = Hom(GF(7), GF(49, 'c')) # optional - sage.rings.finite_rings sage: H[0](2) 2 - sage: Hom(GF(49, 'c'), GF(7)).list() + sage: Hom(GF(49, 'c'), GF(7)).list() # optional - sage.rings.finite_rings [] - sage: Hom(GF(49, 'c'), GF(81, 'd')).list() + sage: Hom(GF(49, 'c'), GF(81, 'd')).list() # optional - sage.rings.finite_rings [] - sage: H = Hom(GF(9, 'a'), GF(81, 'b')) + sage: H = Hom(GF(9, 'a'), GF(81, 'b')) # optional - sage.rings.finite_rings sage: H == loads(dumps(H)) True """ @@ -116,8 +116,8 @@ def _coerce_impl(self, x): EXAMPLES:: - sage: k. = GF(25) - sage: l. = GF(625) + sage: k. = GF(25) # optional - sage.rings.finite_rings + sage: l. = GF(625) # optional - sage.rings.finite_rings sage: H = Hom(k, l) sage: G = loads(dumps(H)) sage: H is G @@ -142,11 +142,11 @@ def _repr_(self): EXAMPLES:: - sage: Hom(GF(4, 'a'), GF(16, 'b'))._repr_() + sage: Hom(GF(4, 'a'), GF(16, 'b'))._repr_() # optional - sage.rings.finite_rings 'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in b of size 2^4' - sage: Hom(GF(4, 'a'), GF(4, 'c'))._repr_() + sage: Hom(GF(4, 'a'), GF(4, 'c'))._repr_() # optional - sage.rings.finite_rings 'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in c of size 2^2' - sage: Hom(GF(4, 'a'), GF(4, 'a'))._repr_() + sage: Hom(GF(4, 'a'), GF(4, 'a'))._repr_() # optional - sage.rings.finite_rings 'Automorphism group of Finite Field in a of size 2^2' """ D = self.domain() @@ -162,11 +162,11 @@ def is_aut(self): EXAMPLES:: - sage: Hom(GF(4, 'a'), GF(16, 'b')).is_aut() + sage: Hom(GF(4, 'a'), GF(16, 'b')).is_aut() # optional - sage.rings.finite_rings False - sage: Hom(GF(4, 'a'), GF(4, 'c')).is_aut() + sage: Hom(GF(4, 'a'), GF(4, 'c')).is_aut() # optional - sage.rings.finite_rings False - sage: Hom(GF(4, 'a'), GF(4, 'a')).is_aut() + sage: Hom(GF(4, 'a'), GF(4, 'a')).is_aut() # optional - sage.rings.finite_rings True """ return self.domain() == self.codomain() @@ -177,12 +177,12 @@ def order(self): EXAMPLES:: - sage: K. = GF(125) + sage: K. = GF(125) # optional - sage.rings.finite_rings sage: End(K) Automorphism group of Finite Field in a of size 5^3 sage: End(K).order() 3 - sage: L. = GF(25) + sage: L. = GF(25) # optional - sage.rings.finite_rings sage: Hom(L, K).order() == Hom(K, L).order() == 0 True """ @@ -200,7 +200,7 @@ def __len__(self): EXAMPLES:: - sage: K. = GF(25) + sage: K. = GF(25) # optional - sage.rings.finite_rings sage: len(End(K)) 2 """ @@ -212,7 +212,7 @@ def list(self): EXAMPLES:: - sage: K. = GF(25) + sage: K. = GF(25) # optional - sage.rings.finite_rings sage: End(K) Automorphism group of Finite Field in a of size 5^2 sage: list(End(K)) @@ -220,7 +220,7 @@ def list(self): Defn: a |--> 4*a + 1, Ring endomorphism of Finite Field in a of size 5^2 Defn: a |--> a] - sage: L. = GF(7^6) + sage: L. = GF(7^6) # optional - sage.rings.finite_rings sage: [g for g in End(L) if (g^3)(z) == z] [Ring endomorphism of Finite Field in z of size 7^6 Defn: z |--> z, @@ -231,8 +231,8 @@ def list(self): Between isomorphic fields with different moduli:: - sage: k1 = GF(1009) - sage: k2 = GF(1009, modulus="primitive") + sage: k1 = GF(1009) # optional - sage.rings.finite_rings + sage: k2 = GF(1009, modulus="primitive") # optional - sage.rings.finite_rings sage: Hom(k1, k2).list() [ Ring morphism: @@ -248,8 +248,8 @@ def list(self): Defn: 11 |--> 11 ] - sage: k1. = GF(1009^2, modulus="first_lexicographic") - sage: k2. = GF(1009^2, modulus="conway") + sage: k1. = GF(1009^2, modulus="first_lexicographic") # optional - sage.rings.finite_rings + sage: k2. = GF(1009^2, modulus="conway") # optional - sage.rings.finite_rings sage: Hom(k1, k2).list() [ Ring morphism: @@ -266,7 +266,7 @@ def list(self): Check that :trac:`11390` is fixed:: - sage: K = GF(1<<16,'a'); L = GF(1<<32,'b') + sage: K = GF(1<<16,'a'); L = GF(1<<32,'b') # optional - sage.rings.finite_rings sage: K.Hom(L)[0] Ring morphism: From: Finite Field in a of size 2^16 @@ -294,7 +294,7 @@ def __getitem__(self, n): """ EXAMPLES:: - sage: H = Hom(GF(32, 'a'), GF(1024, 'b')) + sage: H = Hom(GF(32, 'a'), GF(1024, 'b')) # optional - sage.rings.finite_rings sage: H[1] Ring morphism: From: Finite Field in a of size 2^5 @@ -320,7 +320,7 @@ def index(self, item): EXAMPLES:: - sage: K. = GF(1024) + sage: K. = GF(1024) # optional - sage.rings.finite_rings sage: g = End(K)[3] sage: End(K).index(g) == 3 True @@ -333,13 +333,13 @@ def _an_element_(self): TESTS:: - sage: Hom(GF(3^3, 'a'), GF(3^6, 'b')).an_element() + sage: Hom(GF(3^3, 'a'), GF(3^6, 'b')).an_element() # optional - sage.rings.finite_rings Ring morphism: From: Finite Field in a of size 3^3 To: Finite Field in b of size 3^6 Defn: a |--> 2*b^5 + 2*b^4 - sage: Hom(GF(3^3, 'a'), GF(3^2, 'c')).an_element() + sage: Hom(GF(3^3, 'a'), GF(3^2, 'c')).an_element() # optional - sage.rings.finite_rings Traceback (most recent call last): ... EmptySetError: no homomorphisms from Finite Field in a of size 3^3 to Finite Field in c of size 3^2 From a1e4409baab5475c01bf9913327125ed6d5f2c08 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Wed, 28 Jun 2023 09:55:11 -0700 Subject: [PATCH 05/23] sage.rings.finite_rings: ./sage -fixdoctests --only-tags --- .../rings/finite_rings/hom_finite_field.pyx | 101 +++++++++--------- .../finite_rings/hom_prime_finite_field.pyx | 6 +- src/sage/rings/finite_rings/homset.py | 67 ++++++------ 3 files changed, 88 insertions(+), 86 deletions(-) diff --git a/src/sage/rings/finite_rings/hom_finite_field.pyx b/src/sage/rings/finite_rings/hom_finite_field.pyx index 5062fd943a6..d1f99453a17 100644 --- a/src/sage/rings/finite_rings/hom_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_finite_field.pyx @@ -1,3 +1,4 @@ +# sage.doctest: optional - sage.rings.finite_rings """ Finite field morphisms @@ -13,8 +14,8 @@ EXAMPLES:: Construction of an embedding:: - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f Ring morphism: From: Finite Field in t of size 3^7 @@ -44,8 +45,8 @@ map which is the inverse of `f` on the image of `f`:: There is no embedding of `GF(5^6)` into `GF(5^11)`:: - sage: k. = GF(5^6) # optional - sage.rings.finite_rings - sage: K. = GF(5^11) # optional - sage.rings.finite_rings + sage: k. = GF(5^6) + sage: K. = GF(5^11) sage: FiniteFieldHomomorphism_generic(Hom(k, K)) Traceback (most recent call last): ... @@ -54,7 +55,7 @@ There is no embedding of `GF(5^6)` into `GF(5^11)`:: Construction of Frobenius endomorphisms:: - sage: k. = GF(7^14) # optional - sage.rings.finite_rings + sage: k. = GF(7^14) sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^7 on Finite Field in t of size 7^14 sage: Frob(t) @@ -125,8 +126,8 @@ cdef class SectionFiniteFieldHomomorphism_generic(Section): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section() sage: g(f(t^3+t^2+1)) @@ -153,8 +154,8 @@ cdef class SectionFiniteFieldHomomorphism_generic(Section): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section() sage: g._repr_() @@ -170,8 +171,8 @@ cdef class SectionFiniteFieldHomomorphism_generic(Section): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section() sage: g._latex_() @@ -188,8 +189,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: TestSuite(f).run() @@ -199,16 +200,16 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)); f Ring morphism: From: Finite Field in t of size 3^7 To: Finite Field in T of size 3^21 Defn: t |--> T^20 + 2*T^18 + T^16 + 2*T^13 + T^9 + 2*T^8 + T^7 + T^6 + T^5 + T^3 + 2*T^2 + T - sage: k. = GF(3^6) # optional - sage.rings.finite_rings - sage: K. = GF(3^9) # optional - sage.rings.finite_rings + sage: k. = GF(3^6) + sage: K. = GF(3^9) sage: FiniteFieldHomomorphism_generic(Hom(k, K)) Traceback (most recent call last): ... @@ -249,8 +250,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = copy(f) sage: g.section()(g(t)) == f.section()(f(t)) @@ -282,8 +283,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f._latex_() '\\Bold{F}_{3^{7}} \\hookrightarrow \\Bold{F}_{3^{21}}' @@ -295,8 +296,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^3) # optional - sage.rings.finite_rings - sage: K. = GF(3^9) # optional - sage.rings.finite_rings + sage: k. = GF(3^3) + sage: K. = GF(3^9) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f(t) 2*T^6 + 2*T^4 + T^2 + T @@ -323,8 +324,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^3) # optional - sage.rings.finite_rings - sage: K. = GF(3^9) # optional - sage.rings.finite_rings + sage: k. = GF(3^3) + sage: K. = GF(3^9) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f.is_injective() True @@ -340,8 +341,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^3) # optional - sage.rings.finite_rings - sage: K. = GF(3^9) # optional - sage.rings.finite_rings + sage: k. = GF(3^3) + sage: K. = GF(3^9) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: f.is_surjective() False @@ -364,8 +365,8 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: sage: from sage.rings.finite_rings.hom_finite_field import FiniteFieldHomomorphism_generic - sage: k. = GF(3^7) # optional - sage.rings.finite_rings - sage: K. = GF(3^21) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) + sage: K. = GF(3^21) sage: f = FiniteFieldHomomorphism_generic(Hom(k, K)) sage: g = f.section(); g Section of Ring morphism: @@ -395,7 +396,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): EXAMPLES:: - sage: k. = GF(3^7) # optional - sage.rings.finite_rings + sage: k. = GF(3^7) sage: K., f = k.extension(3, map=True) sage: b = f(t^2); b 2*T^20 + 2*T^19 + T^18 + T^15 + 2*T^14 + 2*T^13 + 2*T^12 + T^8 + 2*T^6 + T^5 + 2*T^4 + T^3 + 2*T^2 + T @@ -417,7 +418,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: embed = Frob.fixed_field()[1] sage: hash(embed) # random @@ -431,7 +432,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: embed = Frob.fixed_field()[1] sage: embed.__reduce__() # indirect doctest @@ -459,7 +460,7 @@ cdef class FiniteFieldHomomorphism_generic(RingHomomorphism_im_gens): TESTS:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: embed = Frob.fixed_field()[1] sage: f = loads(dumps(embed)) @@ -481,7 +482,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): TESTS:: - sage: k. = GF(7^11) # optional - sage.rings.finite_rings + sage: k. = GF(7^11) sage: Frob = k.frobenius_endomorphism(5) sage: TestSuite(Frob).run() @@ -506,7 +507,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): TESTS:: sage: from sage.rings.finite_rings.hom_finite_field import FrobeniusEndomorphism_finite_field - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: FrobeniusEndomorphism_finite_field(k) Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3 sage: FrobeniusEndomorphism_finite_field(k, 2) @@ -543,7 +544,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3 @@ -567,7 +568,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^3 @@ -590,7 +591,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: Frob._latex_() 't \\mapsto t^{5}' @@ -612,7 +613,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): """ TESTS:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: Frob(t) 2*t^2 + 4*t + 4 @@ -631,7 +632,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) # optional - sage.rings.finite_rings + sage: k. = GF(5^12) sage: Frob = k.frobenius_endomorphism() sage: Frob.order() 12 @@ -654,7 +655,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) # optional - sage.rings.finite_rings + sage: k. = GF(5^12) sage: Frob = k.frobenius_endomorphism() sage: Frob.power() 1 @@ -672,7 +673,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) # optional - sage.rings.finite_rings + sage: k. = GF(5^12) sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12 sage: Frob^2 @@ -694,7 +695,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(7^11) # optional - sage.rings.finite_rings + sage: k. = GF(7^11) sage: f = k.frobenius_endomorphism(5) sage: (f.inverse() * f).is_identity() True @@ -707,7 +708,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^12) # optional - sage.rings.finite_rings + sage: k. = GF(5^12) sage: f = k.frobenius_endomorphism(); f Frobenius endomorphism t |--> t^5 on Finite Field in t of size 5^12 sage: g = k.frobenius_endomorphism(2); g @@ -745,7 +746,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^6) # optional - sage.rings.finite_rings + sage: k. = GF(5^6) sage: f = k.frobenius_endomorphism(2) sage: kfixed, embed = f.fixed_field() sage: kfixed @@ -778,7 +779,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: Frob.is_injective() True @@ -793,7 +794,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: Frob.is_surjective() True @@ -807,7 +808,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: Frob.is_identity() False @@ -822,7 +823,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): EXAMPLES:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism() sage: hash(Frob) # random 383183030479672104 @@ -835,7 +836,7 @@ cdef class FrobeniusEndomorphism_finite_field(FrobeniusEndomorphism_generic): TESTS:: - sage: k. = GF(5^3) # optional - sage.rings.finite_rings + sage: k. = GF(5^3) sage: Frob = k.frobenius_endomorphism(2) sage: Frob Frobenius endomorphism t |--> t^(5^2) on Finite Field in t of size 5^3 diff --git a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx index d688de98acd..691a6bffb7c 100644 --- a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx @@ -54,7 +54,7 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime sage: k = GF(3) sage: K. = GF(3^4) # optional - sage.rings.finite_rings - sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f + sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f # optional - sage.rings.finite_rings Ring morphism: From: Finite Field of size 3 To: Finite Field in T of size 3^4 @@ -62,7 +62,7 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): sage: k. = GF(3^2) # optional - sage.rings.finite_rings sage: K. = GF(3^4) # optional - sage.rings.finite_rings - sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f + sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f # optional - sage.rings.finite_rings Traceback (most recent call last): ... TypeError: The domain is not a finite prime field @@ -82,7 +82,7 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime sage: k = GF(3) sage: K. = GF(3^5) # optional - sage.rings.finite_rings - sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)) + sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)) # optional - sage.rings.finite_rings sage: a = f(4); a 1 sage: a.parent() diff --git a/src/sage/rings/finite_rings/homset.py b/src/sage/rings/finite_rings/homset.py index 3e62ac60015..dca345cc879 100644 --- a/src/sage/rings/finite_rings/homset.py +++ b/src/sage/rings/finite_rings/homset.py @@ -1,3 +1,4 @@ +# sage.doctest: optional - sage.rings.finite_rings """ Homset for finite fields @@ -6,8 +7,8 @@ EXAMPLES:: sage: R. = ZZ[] - sage: E. = GF(25, modulus = t^2 - 2) # optional - sage.rings.finite_rings - sage: F. = GF(625) # optional - sage.rings.finite_rings + sage: E. = GF(25, modulus = t^2 - 2) + sage: F. = GF(625) sage: H = Hom(E, F) sage: f = H([4*b^3 + 4*b^2 + 4*b]); f Ring morphism: @@ -27,10 +28,10 @@ sage: End(E) Automorphism group of Finite Field in a of size 5^2 - sage: End(GF(7))[0] # optional - sage.rings.finite_rings + sage: End(GF(7))[0] Ring endomorphism of Finite Field of size 7 Defn: 1 |--> 1 - sage: H = Hom(GF(7), GF(49, 'c')) # optional - sage.rings.finite_rings + sage: H = Hom(GF(7), GF(49, 'c')) sage: H[0](2) 2 """ @@ -59,8 +60,8 @@ def __call__(self, im_gens, base_map=None, check=True): EXAMPLES:: sage: R. = ZZ[] - sage: E. = GF(25, modulus = t^2 - 2) # optional - sage.rings.finite_rings - sage: F. = GF(625) # optional - sage.rings.finite_rings + sage: E. = GF(25, modulus = t^2 - 2) + sage: F. = GF(625) sage: End(E) Automorphism group of Finite Field in a of size 5^2 sage: list(Hom(E, F)) @@ -74,17 +75,17 @@ def __call__(self, im_gens, base_map=None, check=True): Defn: a |--> b^3 + b^2 + b] sage: [phi(2*a)^2 for phi in Hom(E, F)] [3, 3] - sage: End(GF(7))[0] # optional - sage.rings.finite_rings + sage: End(GF(7))[0] Ring endomorphism of Finite Field of size 7 Defn: 1 |--> 1 - sage: H = Hom(GF(7), GF(49, 'c')) # optional - sage.rings.finite_rings + sage: H = Hom(GF(7), GF(49, 'c')) sage: H[0](2) 2 - sage: Hom(GF(49, 'c'), GF(7)).list() # optional - sage.rings.finite_rings + sage: Hom(GF(49, 'c'), GF(7)).list() [] - sage: Hom(GF(49, 'c'), GF(81, 'd')).list() # optional - sage.rings.finite_rings + sage: Hom(GF(49, 'c'), GF(81, 'd')).list() [] - sage: H = Hom(GF(9, 'a'), GF(81, 'b')) # optional - sage.rings.finite_rings + sage: H = Hom(GF(9, 'a'), GF(81, 'b')) sage: H == loads(dumps(H)) True """ @@ -116,8 +117,8 @@ def _coerce_impl(self, x): EXAMPLES:: - sage: k. = GF(25) # optional - sage.rings.finite_rings - sage: l. = GF(625) # optional - sage.rings.finite_rings + sage: k. = GF(25) + sage: l. = GF(625) sage: H = Hom(k, l) sage: G = loads(dumps(H)) sage: H is G @@ -142,11 +143,11 @@ def _repr_(self): EXAMPLES:: - sage: Hom(GF(4, 'a'), GF(16, 'b'))._repr_() # optional - sage.rings.finite_rings + sage: Hom(GF(4, 'a'), GF(16, 'b'))._repr_() 'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in b of size 2^4' - sage: Hom(GF(4, 'a'), GF(4, 'c'))._repr_() # optional - sage.rings.finite_rings + sage: Hom(GF(4, 'a'), GF(4, 'c'))._repr_() 'Set of field embeddings from Finite Field in a of size 2^2 to Finite Field in c of size 2^2' - sage: Hom(GF(4, 'a'), GF(4, 'a'))._repr_() # optional - sage.rings.finite_rings + sage: Hom(GF(4, 'a'), GF(4, 'a'))._repr_() 'Automorphism group of Finite Field in a of size 2^2' """ D = self.domain() @@ -162,11 +163,11 @@ def is_aut(self): EXAMPLES:: - sage: Hom(GF(4, 'a'), GF(16, 'b')).is_aut() # optional - sage.rings.finite_rings + sage: Hom(GF(4, 'a'), GF(16, 'b')).is_aut() False - sage: Hom(GF(4, 'a'), GF(4, 'c')).is_aut() # optional - sage.rings.finite_rings + sage: Hom(GF(4, 'a'), GF(4, 'c')).is_aut() False - sage: Hom(GF(4, 'a'), GF(4, 'a')).is_aut() # optional - sage.rings.finite_rings + sage: Hom(GF(4, 'a'), GF(4, 'a')).is_aut() True """ return self.domain() == self.codomain() @@ -177,12 +178,12 @@ def order(self): EXAMPLES:: - sage: K. = GF(125) # optional - sage.rings.finite_rings + sage: K. = GF(125) sage: End(K) Automorphism group of Finite Field in a of size 5^3 sage: End(K).order() 3 - sage: L. = GF(25) # optional - sage.rings.finite_rings + sage: L. = GF(25) sage: Hom(L, K).order() == Hom(K, L).order() == 0 True """ @@ -200,7 +201,7 @@ def __len__(self): EXAMPLES:: - sage: K. = GF(25) # optional - sage.rings.finite_rings + sage: K. = GF(25) sage: len(End(K)) 2 """ @@ -212,7 +213,7 @@ def list(self): EXAMPLES:: - sage: K. = GF(25) # optional - sage.rings.finite_rings + sage: K. = GF(25) sage: End(K) Automorphism group of Finite Field in a of size 5^2 sage: list(End(K)) @@ -220,7 +221,7 @@ def list(self): Defn: a |--> 4*a + 1, Ring endomorphism of Finite Field in a of size 5^2 Defn: a |--> a] - sage: L. = GF(7^6) # optional - sage.rings.finite_rings + sage: L. = GF(7^6) sage: [g for g in End(L) if (g^3)(z) == z] [Ring endomorphism of Finite Field in z of size 7^6 Defn: z |--> z, @@ -231,8 +232,8 @@ def list(self): Between isomorphic fields with different moduli:: - sage: k1 = GF(1009) # optional - sage.rings.finite_rings - sage: k2 = GF(1009, modulus="primitive") # optional - sage.rings.finite_rings + sage: k1 = GF(1009) + sage: k2 = GF(1009, modulus="primitive") sage: Hom(k1, k2).list() [ Ring morphism: @@ -248,8 +249,8 @@ def list(self): Defn: 11 |--> 11 ] - sage: k1. = GF(1009^2, modulus="first_lexicographic") # optional - sage.rings.finite_rings - sage: k2. = GF(1009^2, modulus="conway") # optional - sage.rings.finite_rings + sage: k1. = GF(1009^2, modulus="first_lexicographic") + sage: k2. = GF(1009^2, modulus="conway") sage: Hom(k1, k2).list() [ Ring morphism: @@ -266,7 +267,7 @@ def list(self): Check that :trac:`11390` is fixed:: - sage: K = GF(1<<16,'a'); L = GF(1<<32,'b') # optional - sage.rings.finite_rings + sage: K = GF(1<<16,'a'); L = GF(1<<32,'b') sage: K.Hom(L)[0] Ring morphism: From: Finite Field in a of size 2^16 @@ -294,7 +295,7 @@ def __getitem__(self, n): """ EXAMPLES:: - sage: H = Hom(GF(32, 'a'), GF(1024, 'b')) # optional - sage.rings.finite_rings + sage: H = Hom(GF(32, 'a'), GF(1024, 'b')) sage: H[1] Ring morphism: From: Finite Field in a of size 2^5 @@ -320,7 +321,7 @@ def index(self, item): EXAMPLES:: - sage: K. = GF(1024) # optional - sage.rings.finite_rings + sage: K. = GF(1024) sage: g = End(K)[3] sage: End(K).index(g) == 3 True @@ -333,13 +334,13 @@ def _an_element_(self): TESTS:: - sage: Hom(GF(3^3, 'a'), GF(3^6, 'b')).an_element() # optional - sage.rings.finite_rings + sage: Hom(GF(3^3, 'a'), GF(3^6, 'b')).an_element() Ring morphism: From: Finite Field in a of size 3^3 To: Finite Field in b of size 3^6 Defn: a |--> 2*b^5 + 2*b^4 - sage: Hom(GF(3^3, 'a'), GF(3^2, 'c')).an_element() # optional - sage.rings.finite_rings + sage: Hom(GF(3^3, 'a'), GF(3^2, 'c')).an_element() Traceback (most recent call last): ... EmptySetError: no homomorphisms from Finite Field in a of size 3^3 to Finite Field in c of size 3^2 From a44af4d595cfc02983166b66ba45bcd3dafdd59a Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Thu, 29 Jun 2023 19:55:48 -0700 Subject: [PATCH 06/23] sage.schemes: Update # needs --- .../finite_rings/hom_prime_finite_field.pyx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx index 691a6bffb7c..fb5c88d54e7 100644 --- a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx @@ -53,16 +53,16 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime sage: k = GF(3) - sage: K. = GF(3^4) # optional - sage.rings.finite_rings - sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f # optional - sage.rings.finite_rings + sage: K. = GF(3^4) # needs sage.rings.finite_rings + sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f # needs sage.rings.finite_rings Ring morphism: From: Finite Field of size 3 To: Finite Field in T of size 3^4 Defn: 1 |--> 1 - sage: k. = GF(3^2) # optional - sage.rings.finite_rings - sage: K. = GF(3^4) # optional - sage.rings.finite_rings - sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f # optional - sage.rings.finite_rings + sage: k. = GF(3^2) # needs sage.rings.finite_rings + sage: K. = GF(3^4) # needs sage.rings.finite_rings + sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)); f # needs sage.rings.finite_rings Traceback (most recent call last): ... TypeError: The domain is not a finite prime field @@ -81,11 +81,11 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime sage: k = GF(3) - sage: K. = GF(3^5) # optional - sage.rings.finite_rings - sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)) # optional - sage.rings.finite_rings - sage: a = f(4); a + sage: K. = GF(3^5) # needs sage.rings.finite_rings + sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)) # needs sage.rings.finite_rings + sage: a = f(4); a # needs sage.rings.finite_rings 1 - sage: a.parent() + sage: a.parent() # needs sage.rings.finite_rings Finite Field in t of size 3^5 """ return self._codomain._element_constructor(x) From 1f7e48a3f0cb6360444bbd2f96a833c7133b5597 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Fri, 30 Jun 2023 17:46:06 -0700 Subject: [PATCH 07/23] Update # optional/needs --- .../finite_rings/finite_field_prime_modn.py | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/sage/rings/finite_rings/finite_field_prime_modn.py b/src/sage/rings/finite_rings/finite_field_prime_modn.py index 75ce63db376..6919e87f4d2 100644 --- a/src/sage/rings/finite_rings/finite_field_prime_modn.py +++ b/src/sage/rings/finite_rings/finite_field_prime_modn.py @@ -47,7 +47,7 @@ class FiniteField_prime_modn(FiniteField_generic, integer_mod_ring.IntegerModRin sage: FiniteField(3) Finite Field of size 3 - sage: FiniteField(next_prime(1000)) # optional - sage.rings.finite_rings + sage: FiniteField(next_prime(1000)) # needs sage.rings.finite_rings Finite Field of size 1009 """ def __init__(self, p, check=True, modulus=None): @@ -104,12 +104,15 @@ def _coerce_map_from_(self, S): 5 sage: 12 % 7 5 - sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 11319 # optional - sage.rings.finite_rings + + sage: ZZ.residue_field(7).hom(GF(7))(1) # See trac 11319 # needs sage.rings.finite_rings 1 - sage: K. = QuadraticField(337) # See trac 11319 - sage: pp = K.ideal(13).factor()[0][0] - sage: RF13 = K.residue_field(pp) - sage: RF13.hom([GF(13)(1)]) + + sage: # needs sage.rings.finite_rings sage.rings.number_field + sage: K. = QuadraticField(337) # See trac 11319 # needs sage.rings.number_field + sage: pp = K.ideal(13).factor()[0][0] # needs sage.rings.number_field + sage: RF13 = K.residue_field(pp) # needs sage.rings.number_field + sage: RF13.hom([GF(13)(1)]) # needs sage.rings.number_field Ring morphism: From: Residue field of Fractional ideal (-w - 18) To: Finite Field of size 13 @@ -117,19 +120,19 @@ def _coerce_map_from_(self, S): Check that :trac:`19573` is resolved:: - sage: Integers(9).hom(GF(3)) # optional - sage.rings.finite_rings + sage: Integers(9).hom(GF(3)) # needs sage.rings.finite_rings Natural morphism: From: Ring of integers modulo 9 To: Finite Field of size 3 - sage: Integers(9).hom(GF(5)) # optional - sage.rings.finite_rings + sage: Integers(9).hom(GF(5)) # needs sage.rings.finite_rings Traceback (most recent call last): ... TypeError: natural coercion morphism from Ring of integers modulo 9 to Finite Field of size 5 not defined There is no coercion from a `p`-adic ring to its residue field:: - sage: GF(3).has_coerce_map_from(Zp(3)) + sage: GF(3).has_coerce_map_from(Zp(3)) # needs sage.rings.padics False """ if S is int: @@ -155,6 +158,7 @@ def _convert_map_from_(self, R): EXAMPLES:: + sage: # needs sage.rings.padics sage: GF(3).convert_map_from(Qp(3)) Reduction morphism: From: 3-adic Field with capped relative precision 20 @@ -201,7 +205,8 @@ def is_prime_field(self): sage: k.is_prime_field() True - sage: k. = GF(3^2) # optional - sage.rings.finite_rings + sage: # needs sage.rings.finite_rings + sage: k. = GF(3^2) sage: k.is_prime_field() False """ @@ -271,7 +276,9 @@ def gen(self, n=0): sage: k = GF(13) sage: k.gen() 1 - sage: k = GF(1009, modulus="primitive") # optional - sage.rings.finite_rings + + sage: # needs sage.rings.finite_rings + sage: k = GF(1009, modulus="primitive") sage: k.gen() # this gives a primitive element 11 sage: k.gen(1) @@ -304,7 +311,8 @@ def __iter__(self): We can even start iterating over something that would be too big to actually enumerate:: - sage: K = GF(next_prime(2^256)) # optional - sage.rings.finite_rings + sage: # needs sage.rings.finite_rings + sage: K = GF(next_prime(2^256)) sage: all = iter(K) sage: next(all) 0 From 173d3c363661b8e64b58fe94b4bb0c1f312d7795 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sun, 2 Jul 2023 00:58:02 -0700 Subject: [PATCH 08/23] sage.rings: Update # optional / # needs --- src/sage/rings/finite_rings/integer_mod.pyx | 300 +++++++++--------- .../rings/finite_rings/integer_mod_ring.py | 222 ++++++------- 2 files changed, 261 insertions(+), 261 deletions(-) diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index 1dcfcb2b285..65745f4aff4 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -345,11 +345,11 @@ cdef class IntegerMod_abstract(FiniteRingElement): sage: TestSuite(Zmod(2^10 * 3^5)).run() sage: TestSuite(Zmod(2^30 * 3^50 * 5^20)).run() - sage: GF(29)(SR(1/3)) # optional - sage.rings.finite_rings sage.symbolic + sage: GF(29)(SR(1/3)) # needs sage.rings.finite_rings sage.symbolic 10 sage: Integers(30)(QQ['x'](1/7)) 13 - sage: Integers(30)(SR(1/4)) # optional - sage.symbolic + sage: Integers(30)(SR(1/4)) # needs sage.symbolic Traceback (most recent call last): ... ZeroDivisionError: inverse of Mod(4, 30) does not exist @@ -501,7 +501,7 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: sage: a = Integers(90384098234^3) - sage: factor(a.order()) # optional - sage.libs.pari + sage: factor(a.order()) # needs sage.libs.pari 2^3 * 191^3 * 236607587^3 sage: b = a(2*191) sage: b.is_nilpotent() @@ -542,13 +542,13 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: sage: a = Mod(2,19) - sage: gap(a) # optional - sage.libs.gap + sage: gap(a) # needs sage.libs.gap Z(19) - sage: gap(Mod(3, next_prime(10000))) # optional - sage.libs.gap + sage: gap(Mod(3, next_prime(10000))) # needs sage.libs.gap Z(10007)^6190 - sage: gap(Mod(3, next_prime(100000))) # optional - sage.libs.gap + sage: gap(Mod(3, next_prime(100000))) # needs sage.libs.gap ZmodpZObj( 3, 100003 ) - sage: gap(Mod(4, 48)) # optional - sage.libs.gap + sage: gap(Mod(4, 48)) # needs sage.libs.gap ZmodnZObj( 4, 48 ) """ return '%s*One(ZmodnZ(%s))' % (self, self.__modulus.sageInteger) @@ -601,18 +601,18 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: K = GF(7) # optional - sage.rings.finite_rings - sage: sage_input(K(5), verify=True) # optional - sage.rings.finite_rings + sage: K = GF(7) + sage: sage_input(K(5), verify=True) # Verified GF(7)(5) - sage: sage_input(K(5) * polygen(K), verify=True) # optional - sage.rings.finite_rings + sage: sage_input(K(5) * polygen(K), verify=True) # Verified R. = GF(7)[] 5*x sage: from sage.misc.sage_input import SageInputBuilder - sage: K(5)._sage_input_(SageInputBuilder(), False) # optional - sage.rings.finite_rings + sage: K(5)._sage_input_(SageInputBuilder(), False) {call: {call: {atomic:GF}({atomic:7})}({atomic:5})} - sage: K(5)._sage_input_(SageInputBuilder(), True) # optional - sage.rings.finite_rings + sage: K(5)._sage_input_(SageInputBuilder(), True) {atomic:5} """ v = sib.int(self.lift()) @@ -649,39 +649,39 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: sage: r = Integers(125) - sage: b = r.multiplicative_generator()^3 # optional - sage.libs.pari - sage: a = b^17 # optional - sage.libs.pari - sage: a.log(b) # optional - sage.libs.pari + sage: b = r.multiplicative_generator()^3 # needs sage.libs.pari + sage: a = b^17 # needs sage.libs.pari + sage: a.log(b) # needs sage.libs.pari 17 - sage: a.log() # optional - sage.libs.pari + sage: a.log() # needs sage.libs.pari 51 A bigger example:: - sage: FF = FiniteField(2^32 + 61) # optional - sage.rings.finite_rings - sage: c = FF(4294967356) # optional - sage.rings.finite_rings - sage: x = FF(2) # optional - sage.rings.finite_rings - sage: a = c.log(x) # optional - sage.rings.finite_rings - sage: a # optional - sage.rings.finite_rings + sage: FF = FiniteField(2^32 + 61) # needs sage.rings.finite_rings + sage: c = FF(4294967356) # needs sage.rings.finite_rings + sage: x = FF(2) # needs sage.rings.finite_rings + sage: a = c.log(x) # needs sage.rings.finite_rings + sage: a # needs sage.rings.finite_rings 2147483678 - sage: x^a # optional - sage.rings.finite_rings + sage: x^a # needs sage.rings.finite_rings 4294967356 An example with a highly composite modulus:: sage: m = 2^99 * 77^7 * 123456789 * 13712923537615486607^2 - sage: (Mod(5,m)^5735816763073854953388147237921).log(5) # optional - sage.libs.pari + sage: (Mod(5,m)^5735816763073854953388147237921).log(5) # needs sage.libs.pari 5735816763073854953388147237921 Errors are generated if the logarithm doesn't exist or the inputs are not units:: - sage: Mod(3, 7).log(Mod(2, 7)) # optional - sage.libs.pari + sage: Mod(3, 7).log(Mod(2, 7)) # needs sage.libs.pari Traceback (most recent call last): ... ValueError: no logarithm of 3 found to base 2 modulo 7 - sage: a = Mod(16, 100); b = Mod(4, 100) # optional - sage.libs.pari - sage: a.log(b) # optional - sage.libs.pari + sage: a = Mod(16, 100); b = Mod(4, 100) + sage: a.log(b) Traceback (most recent call last): ... ValueError: logarithm of 16 is not defined since it is not a unit modulo 100 @@ -690,51 +690,51 @@ cdef class IntegerMod_abstract(FiniteRingElement): We check that :trac:`9205` is fixed:: - sage: Mod(5, 9).log(Mod(2, 9)) # optional - sage.libs.pari + sage: Mod(5, 9).log(Mod(2, 9)) # needs sage.libs.pari 5 We test against a bug (side effect on PARI) fixed in :trac:`9438`:: sage: R. = QQ[] - sage: pari(b) # optional - sage.libs.pari + sage: pari(b) # needs sage.libs.pari b - sage: GF(7)(5).log() # optional - sage.rings.finite_rings + sage: GF(7)(5).log() # needs sage.rings.finite_rings 5 - sage: pari(b) # optional - sage.libs.pari + sage: pari(b) # needs sage.libs.pari b We test that :trac:`23927` is fixed:: sage: x = mod(48475563673907791151, 10^20 + 763)^2 sage: e = 25248843418589594761 - sage: (x^e).log(x) == e # optional - sage.libs.pari + sage: (x^e).log(x) == e # needs sage.libs.pari True Examples like this took extremely long before :trac:`32375`:: - sage: (Mod(5, 123337052926643**4) ^ (10^50-1)).log(5) # optional - sage.libs.pari + sage: (Mod(5, 123337052926643**4) ^ (10^50-1)).log(5) # needs sage.libs.pari 99999999999999999999999999999999999999999999999999 We check that non-existence of solutions is detected: No local solutions:: - sage: Mod(1111, 1234567).log(1111**3) # optional - sage.libs.pari + sage: Mod(1111, 1234567).log(1111**3) # needs sage.libs.pari Traceback (most recent call last): ... ValueError: no logarithm of 1111 found to base 961261 modulo 1234567 (no solution modulo 9721) Incompatible local solutions:: - sage: Mod(230, 323).log(173) # optional - sage.libs.pari + sage: Mod(230, 323).log(173) # needs sage.libs.pari Traceback (most recent call last): ... ValueError: no logarithm of 230 found to base 173 modulo 323 (incompatible local solutions) We test that :trac:`12419` is fixed:: - sage: R. = GF(2)[] # optional - sage.rings.finite_rings - sage: R(1).factor() # optional - sage.rings.finite_rings + sage: R. = GF(2)[] + sage: R(1).factor() 1 AUTHORS: @@ -815,9 +815,9 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: sage: m = Mod(3, 1568) - sage: v = m.generalised_log(); v # optional - sage.libs.pari + sage: v = m.generalised_log(); v # needs sage.libs.pari [1, 3, 1] - sage: prod([Zmod(1568).unit_gens()[i] ** v[i] for i in [0..2]]) # optional - sage.libs.pari + sage: prod([Zmod(1568).unit_gens()[i] ** v[i] for i in [0..2]]) # needs sage.libs.pari 3 .. SEEALSO:: @@ -866,11 +866,11 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: k = GF(3) # optional - sage.rings.finite_rings - sage: a = k.gen() # optional - sage.rings.finite_rings - sage: a.charpoly('x') # optional - sage.rings.finite_rings + sage: k = GF(3) + sage: a = k.gen() + sage: a.charpoly('x') x + 2 - sage: a + 2 # optional - sage.rings.finite_rings + sage: a + 2 0 AUTHORS: @@ -886,7 +886,7 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: GF(241, 'a')(1).minpoly() # optional - sage.rings.finite_rings + sage: GF(241, 'a')(1).minpoly() x + 240 """ return self.charpoly(var) @@ -897,7 +897,7 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: GF(241, 'a')(1).minimal_polynomial(var = 'z') # optional - sage.rings.finite_rings + sage: GF(241, 'a')(1).minimal_polynomial(var = 'z') z + 240 """ return self.minpoly(var) @@ -908,12 +908,12 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: k = GF(7) # optional - sage.rings.finite_rings - sage: a = k.gen(); a # optional - sage.rings.finite_rings + sage: k = GF(7) + sage: a = k.gen(); a 1 - sage: a.polynomial() # optional - sage.rings.finite_rings + sage: a.polynomial() 1 - sage: type(a.polynomial()) # optional - sage.rings.finite_rings + sage: type(a.polynomial()) # needs sage.rings.finite_rings """ R = self.parent()[var] @@ -926,9 +926,9 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: k = GF(691) # optional - sage.rings.finite_rings - sage: a = k(389) # optional - sage.rings.finite_rings - sage: a.norm() # optional - sage.rings.finite_rings + sage: k = GF(691) + sage: a = k(389) + sage: a.norm() 389 AUTHORS: @@ -944,9 +944,9 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: k = GF(691) # optional - sage.rings.finite_rings - sage: a = k(389) # optional - sage.rings.finite_rings - sage: a.trace() # optional - sage.rings.finite_rings + sage: k = GF(691) + sage: a = k(389) + sage: a.trace() 389 AUTHORS: @@ -1027,25 +1027,25 @@ cdef class IntegerMod_abstract(FiniteRingElement): sage: Mod(3, 17).is_square() False - sage: Mod(9, 17).is_square() # optional - sage.libs.pari + sage: Mod(9, 17).is_square() # needs sage.libs.pari True - sage: Mod(9, 17*19^2).is_square() # optional - sage.libs.pari + sage: Mod(9, 17*19^2).is_square() # needs sage.libs.pari True - sage: Mod(-1, 17^30).is_square() # optional - sage.libs.pari + sage: Mod(-1, 17^30).is_square() # needs sage.libs.pari True - sage: Mod(1/9, next_prime(2^40)).is_square() # optional - sage.libs.pari + sage: Mod(1/9, next_prime(2^40)).is_square() # needs sage.libs.pari True - sage: Mod(1/25, next_prime(2^90)).is_square() # optional - sage.libs.pari + sage: Mod(1/25, next_prime(2^90)).is_square() # needs sage.libs.pari True TESTS:: - sage: Mod(1/25, 2^8).is_square() # optional - sage.libs.pari + sage: Mod(1/25, 2^8).is_square() # needs sage.libs.pari True - sage: Mod(1/25, 2^40).is_square() # optional - sage.libs.pari + sage: Mod(1/25, 2^40).is_square() # needs sage.libs.pari True - sage: for p,q,r in cartesian_product_iterator([[3,5],[11,13],[17,19]]): # long time # optional - sage.libs.pari + sage: for p,q,r in cartesian_product_iterator([[3,5],[11,13],[17,19]]): # long time, needs sage.libs.pari ....: for ep,eq,er in cartesian_product_iterator([[0,1,2,3],[0,1,2,3],[0,1,2,3]]): ....: for e2 in [0, 1, 2, 3, 4]: ....: n = p^ep * q^eq * r^er * 2^e2 @@ -1123,16 +1123,16 @@ cdef class IntegerMod_abstract(FiniteRingElement): 86 sage: mod(7, 18).sqrt() 5 - sage: a = mod(14, 5^60).sqrt() # optional - sage.libs.pari - sage: a*a # optional - sage.libs.pari + sage: a = mod(14, 5^60).sqrt() # needs sage.libs.pari + sage: a*a # needs sage.libs.pari 14 - sage: mod(15, 389).sqrt(extend=False) # optional - sage.libs.pari + sage: mod(15, 389).sqrt(extend=False) Traceback (most recent call last): ... ValueError: self must be a square - sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) # optional - sage.libs.pari + sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) # needs sage.libs.pari 9 - sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) # optional - sage.libs.pari + sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) # needs sage.libs.pari 25 :: @@ -1168,22 +1168,22 @@ cdef class IntegerMod_abstract(FiniteRingElement): sage: R = Integers(5*13^3*37); R Ring of integers modulo 406445 - sage: v = R(-1).sqrt(all=True); v # optional - sage.libs.pari + sage: v = R(-1).sqrt(all=True); v # needs sage.libs.pari [78853, 111808, 160142, 193097, 213348, 246303, 294637, 327592] - sage: [x^2 for x in v] # optional - sage.libs.pari + sage: [x^2 for x in v] # needs sage.libs.pari [406444, 406444, 406444, 406444, 406444, 406444, 406444, 406444] - sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) # optional - sage.libs.pari + sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) # needs sage.libs.pari (13, 13, 104) - sage: all(x^2 == 169 for x in v) # optional - sage.libs.pari + sage: all(x^2 == 169 for x in v) # needs sage.libs.pari True :: - sage: t = FiniteField(next_prime(2^100))(4) # optional - sage.rings.finite_rings - sage: t.sqrt(extend=False, all=True) # optional - sage.rings.finite_rings + sage: t = FiniteField(next_prime(2^100))(4) # needs sage.rings.finite_rings + sage: t.sqrt(extend=False, all=True) # needs sage.rings.finite_rings [2, 1267650600228229401496703205651] - sage: t = FiniteField(next_prime(2^100))(2) # optional - sage.rings.finite_rings - sage: t.sqrt(extend=False, all=True) # optional - sage.rings.finite_rings + sage: t = FiniteField(next_prime(2^100))(2) # needs sage.rings.finite_rings + sage: t.sqrt(extend=False, all=True) # needs sage.rings.finite_rings [] Modulo a power of 2:: @@ -1375,39 +1375,39 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: K = GF(31) # optional - sage.rings.finite_rings - sage: a = K(22) # optional - sage.rings.finite_rings - sage: K(22).nth_root(7) # optional - sage.rings.finite_rings + sage: K = GF(31) + sage: a = K(22) + sage: K(22).nth_root(7) 13 - sage: K(25).nth_root(5) # optional - sage.rings.finite_rings + sage: K(25).nth_root(5) 5 - sage: K(23).nth_root(3) # optional - sage.rings.finite_rings + sage: K(23).nth_root(3) 29 - sage: mod(225, 2^5*3^2).nth_root(4, all=True) # optional - sage.rings.padics + sage: mod(225, 2^5*3^2).nth_root(4, all=True) # needs sage.rings.padics [225, 129, 33, 63, 255, 159, 9, 201, 105, 279, 183, 87, 81, 273, 177, 207, 111, 15, 153, 57, 249, 135, 39, 231] - sage: mod(275, 2^5*7^4).nth_root(7, all=True) # optional - sage.rings.padics + sage: mod(275, 2^5*7^4).nth_root(7, all=True) # needs sage.rings.padics [58235, 25307, 69211, 36283, 3355, 47259, 14331] - sage: mod(1,8).nth_root(2, all=True) # optional - sage.rings.padics + sage: mod(1,8).nth_root(2, all=True) # needs sage.rings.padics [1, 7, 5, 3] - sage: mod(4,8).nth_root(2, all=True) # optional - sage.rings.padics + sage: mod(4,8).nth_root(2, all=True) [2, 6] - sage: mod(1,16).nth_root(4, all=True) # optional - sage.rings.padics + sage: mod(1,16).nth_root(4, all=True) # needs sage.rings.padics [1, 15, 13, 3, 9, 7, 5, 11] - sage: (mod(22,31)^200).nth_root(200) # optional - sage.groups + sage: (mod(22,31)^200).nth_root(200) 5 - sage: mod(3,6).nth_root(0, all=True) # optional - sage.rings.padics + sage: mod(3,6).nth_root(0, all=True) [] sage: mod(3,6).nth_root(0) Traceback (most recent call last): ... ValueError - sage: mod(1,6).nth_root(0, all=True) # optional - sage.rings.padics + sage: mod(1,6).nth_root(0, all=True) [1, 2, 3, 4, 5] TESTS:: - sage: for p in [1009,2003,10007,100003]: # optional - sage.rings.finite_rings + sage: for p in [1009,2003,10007,100003]: # needs sage.rings.finite_rings ....: K = GF(p) ....: for r in (p-1).divisors(): ....: if r == 1: continue @@ -1417,7 +1417,7 @@ cdef class IntegerMod_abstract(FiniteRingElement): ....: if (y^41).nth_root(41*r)**(41*r) != y^41: raise RuntimeError ....: if (y^307).nth_root(307*r)**(307*r) != y^307: raise RuntimeError - sage: for t in range(200): # optional - sage.libs.pari + sage: for t in range(200): # needs sage.libs.pari ....: n = randint(1,2^63) ....: K = Integers(n) ....: b = K.random_element() @@ -1432,12 +1432,12 @@ cdef class IntegerMod_abstract(FiniteRingElement): We check that :trac:`13172` is resolved:: - sage: mod(-1, 4489).nth_root(2, all=True) # optional - sage.rings.padics + sage: mod(-1, 4489).nth_root(2, all=True) # needs sage.rings.padics [] We check that :trac:`32084` is fixed:: - sage: mod(24, 25).nth_root(50)^50 # optional - sage.rings.padics + sage: mod(24, 25).nth_root(50)^50 # needs sage.rings.padics 24 Check that the code path cunningham might be used:: @@ -1623,11 +1623,11 @@ cdef class IntegerMod_abstract(FiniteRingElement): This method is also inherited by prime finite fields elements:: - sage: k = GF(97) # optional - sage.rings.finite_rings - sage: a = k(RationalField()('2/3')) # optional - sage.rings.finite_rings - sage: a # optional - sage.rings.finite_rings + sage: k = GF(97) + sage: a = k(RationalField()('2/3')) + sage: a 33 - sage: a.rational_reconstruction() # optional - sage.rings.finite_rings + sage: a.rational_reconstruction() 2/3 """ return self.lift().rational_reconstruction(self.modulus()) @@ -1737,16 +1737,16 @@ cdef class IntegerMod_abstract(FiniteRingElement): True sage: mod(3, 4).is_primitive_root() True - sage: mod(2, 7).is_primitive_root() # optional - sage.libs.pari + sage: mod(2, 7).is_primitive_root() False - sage: mod(3, 98).is_primitive_root() # optional - sage.libs.pari + sage: mod(3, 98).is_primitive_root() # needs sage.libs.pari True - sage: mod(11, 1009^2).is_primitive_root() # optional - sage.libs.pari + sage: mod(11, 1009^2).is_primitive_root() # needs sage.libs.pari True TESTS:: - sage: for p in prime_range(3,12): # optional - sage.libs.pari + sage: for p in prime_range(3,12): # needs sage.libs.pari ....: for k in range(1,4): ....: for even in [1,2]: ....: n = even*p^k @@ -1759,14 +1759,14 @@ cdef class IntegerMod_abstract(FiniteRingElement): `0` is not a primitive root mod `n` (:trac:`23624`) except for `n=0`:: - sage: mod(0, 17).is_primitive_root() # optional - sage.libs.pari + sage: mod(0, 17).is_primitive_root() False - sage: all(not mod(0, n).is_primitive_root() for n in srange(2, 20)) # optional - sage.libs.pari + sage: all(not mod(0, n).is_primitive_root() for n in srange(2, 20)) # needs sage.libs.pari True sage: mod(0, 1).is_primitive_root() True - sage: all(not mod(p^j, p^k).is_primitive_root() # optional - sage.libs.pari + sage: all(not mod(p^j, p^k).is_primitive_root() # needs sage.libs.pari ....: for p in prime_range(3, 12) ....: for k in srange(1, 4) ....: for j in srange(0, k)) @@ -1821,11 +1821,11 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: Mod(-1, 5).multiplicative_order() # optional - sage.libs.pari + sage: Mod(-1, 5).multiplicative_order() # needs sage.libs.pari 2 - sage: Mod(1, 5).multiplicative_order() # optional - sage.libs.pari + sage: Mod(1, 5).multiplicative_order() # needs sage.libs.pari 1 - sage: Mod(0, 5).multiplicative_order() # optional - sage.libs.pari + sage: Mod(0, 5).multiplicative_order() # needs sage.libs.pari Traceback (most recent call last): ... ArithmeticError: multiplicative order of 0 not defined @@ -1903,7 +1903,7 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: GF(7)(3) // 5 # optional - sage.rings.finite_rings + sage: GF(7)(3) // 5 2 """ return self._mul_(~right) @@ -1930,9 +1930,9 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: - sage: F. = GF(13) # optional - sage.rings.finite_rings - sage: V = F.vector_space(map=False) # optional - sage.rings.finite_rings - sage: V(a) # optional - sage.rings.finite_rings + sage: F. = GF(13) + sage: V = F.vector_space(map=False) + sage: V(a) (1) """ return self.parent().vector_space(map=False)([self]) @@ -1975,8 +1975,8 @@ cdef class IntegerMod_gmp(IntegerMod_abstract): r""" EXAMPLES:: - sage: p = next_prime(2^32) # optional - sage.libs.pari - sage: GF(p)(int(p + 1)) # optional - sage.rings.finite_rings + sage: p = next_prime(2^32) # needs sage.libs.pari + sage: GF(p)(int(p + 1)) # needs sage.libs.pari sage.rings.finite_rings 1 """ mpz_set_si(self.value, value) @@ -2248,9 +2248,9 @@ cdef class IntegerMod_gmp(IntegerMod_abstract): sage: R = Integers(10^10) sage: R(2)^1000 5668069376 - sage: p = next_prime(11^10) # optional - sage.libs.pari - sage: R = Integers(p) # optional - sage.libs.pari - sage: R(9876)^(p-1) # optional - sage.libs.pari + sage: p = next_prime(11^10) # needs sage.libs.pari + sage: R = Integers(p) # needs sage.libs.pari + sage: R(9876)^(p-1) # needs sage.libs.pari 1 sage: mod(3, 10^100)^-2 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888889 @@ -2263,14 +2263,14 @@ cdef class IntegerMod_gmp(IntegerMod_abstract): We define ``0^0`` to be unity, :trac:`13894`:: - sage: p = next_prime(11^10) # optional - sage.libs.pari - sage: R = Integers(p) # optional - sage.libs.pari - sage: R(0)^0 # optional - sage.libs.pari + sage: p = next_prime(11^10) # needs sage.libs.pari + sage: R = Integers(p) # needs sage.libs.pari + sage: R(0)^0 1 The value returned from ``0^0`` should belong to our ring:: - sage: type(R(0)^0) == type(R(0)) # optional - sage.libs.pari + sage: type(R(0)^0) == type(R(0)) True When the modulus is ``1``, the only element in the ring is @@ -2906,16 +2906,16 @@ cdef class IntegerMod_int(IntegerMod_abstract): 86 sage: mod(7, 18).sqrt() 5 - sage: a = mod(14, 5^60).sqrt() # optional - sage.libs.pari - sage: a*a # optional - sage.libs.pari + sage: a = mod(14, 5^60).sqrt() # needs sage.libs.pari + sage: a*a # needs sage.libs.pari 14 sage: mod(15, 389).sqrt(extend=False) Traceback (most recent call last): ... ValueError: self must be a square - sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) # optional - sage.libs.pari + sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) # needs sage.libs.pari 9 - sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) # optional - sage.libs.pari + sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) # needs sage.libs.pari 25 :: @@ -2947,20 +2947,20 @@ cdef class IntegerMod_int(IntegerMod_abstract): [1, 19, 71, 89, 91, 109, 161, 179, 181, 199, 251, 269, 271, 289, 341, 359] sage: R(0).sqrt(all=True) [0, 60, 120, 180, 240, 300] - sage: GF(107)(0).sqrt(all=True) # optional - sage.rings.finite_rings + sage: GF(107)(0).sqrt(all=True) [0] :: sage: R = Integers(5*13^3*37); R Ring of integers modulo 406445 - sage: v = R(-1).sqrt(all=True); v # optional - sage.libs.pari + sage: v = R(-1).sqrt(all=True); v # needs sage.libs.pari [78853, 111808, 160142, 193097, 213348, 246303, 294637, 327592] - sage: [x^2 for x in v] # optional - sage.libs.pari + sage: [x^2 for x in v] # needs sage.libs.pari [406444, 406444, 406444, 406444, 406444, 406444, 406444, 406444] - sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) # optional - sage.libs.pari + sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) # needs sage.libs.pari (13, 13, 104) - sage: all(x^2 == 169 for x in v) # optional - sage.libs.pari + sage: all(x^2 == 169 for x in v) # needs sage.libs.pari True Modulo a power of 2:: @@ -2979,7 +2979,7 @@ cdef class IntegerMod_int(IntegerMod_abstract): Check for :trac:`30797`:: - sage: GF(103)(-1).sqrt(extend=False, all=True) # optional - sage.rings.finite_rings + sage: GF(103)(-1).sqrt(extend=False, all=True) [] """ cdef int_fast32_t i, n = self.__modulus.int32 @@ -3546,9 +3546,9 @@ cdef class IntegerMod_int64(IntegerMod_abstract): sage: R = Integers(10) sage: R(2)^10 4 - sage: p = next_prime(10^5) # optional - sage.libs.pari - sage: R = Integers(p) # optional - sage.libs.pari - sage: R(1234)^(p - 1) # optional - sage.libs.pari + sage: p = next_prime(10^5) # needs sage.libs.pari + sage: R = Integers(p) # needs sage.libs.pari + sage: R(1234)^(p - 1) # needs sage.libs.pari 1 sage: R = Integers(17^5) sage: R(17)^5 @@ -3574,14 +3574,14 @@ cdef class IntegerMod_int64(IntegerMod_abstract): We define ``0^0`` to be unity, :trac:`13894`:: - sage: p = next_prime(10^5) # optional - sage.libs.pari - sage: R = Integers(p) # optional - sage.libs.pari - sage: R(0)^0 # optional - sage.libs.pari + sage: p = next_prime(10^5) # needs sage.libs.pari + sage: R = Integers(p) # needs sage.libs.pari + sage: R(0)^0 1 The value returned from ``0^0`` should belong to our ring:: - sage: type(R(0)^0) == type(R(0)) # optional - sage.libs.pari + sage: type(R(0)^0) == type(R(0)) True When the modulus is ``1``, the only element in the ring is @@ -3902,10 +3902,10 @@ def square_root_mod_prime_power(IntegerMod_abstract a, p, e): :: sage: a = Mod(72, 97^10) - sage: b = square_root_mod_prime_power(a, 97, 10) # optional - sage.libs.pari - sage: b^2 == a # optional - sage.libs.pari + sage: b = square_root_mod_prime_power(a, 97, 10) # needs sage.libs.pari + sage: b^2 == a # needs sage.libs.pari True - sage: mod(100, 5^7).sqrt()^2 # optional - sage.libs.pari + sage: mod(100, 5^7).sqrt()^2 # needs sage.libs.pari 100 TESTS: @@ -3913,15 +3913,15 @@ def square_root_mod_prime_power(IntegerMod_abstract a, p, e): A big example for the binary case (:trac:`33961`):: sage: y = Mod(-7, 2^777) - sage: hex(y.sqrt()^2 - y) # optional - sage.libs.pari + sage: hex(y.sqrt()^2 - y) # needs sage.libs.pari '0x0' Testing with random squares in random rings:: - sage: p = random_prime(999) # optional - sage.libs.pari - sage: e = randrange(1, 999) # optional - sage.libs.pari - sage: x = Zmod(p^e).random_element() # optional - sage.libs.pari - sage: (x^2).sqrt()^2 == x^2 # optional - sage.libs.pari + sage: p = random_prime(999) + sage: e = randrange(1, 999) + sage: x = Zmod(p^e).random_element() + sage: (x^2).sqrt()^2 == x^2 # needs sage.libs.pari True """ if a.is_zero() or a.is_one(): @@ -4016,7 +4016,7 @@ cpdef square_root_mod_prime(IntegerMod_abstract a, p=None): :: sage: from sage.rings.finite_rings.integer_mod import square_root_mod_prime # sqrt() uses brute force for small p - sage: all(square_root_mod_prime(a*a)^2 == a*a # optional - sage.libs.pari + sage: all(square_root_mod_prime(a*a)^2 == a*a # needs sage.libs.pari ....: for p in prime_range(100) ....: for a in Integers(p)) True @@ -4099,7 +4099,7 @@ def lucas_q1(mm, IntegerMod_abstract P): TESTS:: sage: from sage.rings.finite_rings.integer_mod import lucas_q1 - sage: all(lucas_q1(k, a) == BinaryRecurrenceSequence(a, -1, 2, a)(k) # optional - sage.combinat sage.modules + sage: all(lucas_q1(k, a) == BinaryRecurrenceSequence(a, -1, 2, a)(k) # needs sage.combinat sage.modules ....: for a in Integers(23) ....: for k in range(13)) True @@ -4167,7 +4167,7 @@ def lucas(k, P, Q=1, n=None): sage: p = randint(0,100000) sage: q = randint(0,100000) sage: n = randint(1,100) - sage: all(lucas(k, p, q, n)[0] == Mod(lucas_number2(k, p, q), n) # optional - sage.combinat sage.libs.gap + sage: all(lucas(k, p, q, n)[0] == Mod(lucas_number2(k, p, q), n) # needs sage.combinat sage.libs.gap ....: for k in Integers(20)) True sage: from sage.rings.finite_rings.integer_mod import lucas @@ -4175,7 +4175,7 @@ def lucas(k, P, Q=1, n=None): sage: q = randint(0,100000) sage: n = randint(1,100) sage: k = randint(0,100) - sage: lucas(k, p, q, n) == [Mod(lucas_number2(k, p, q), n), # optional - sage.combinat sage.libs.gap + sage: lucas(k, p, q, n) == [Mod(lucas_number2(k, p, q), n), # needs sage.combinat sage.libs.gap ....: Mod(q^(int(k/2)), n)] True @@ -4454,7 +4454,7 @@ cdef class IntegerMod_to_Integer(Map): EXAMPLES:: - sage: ZZ.convert_map_from(GF(2)) # optional - sage.rings.finite_rings + sage: ZZ.convert_map_from(GF(2)) Lifting map: From: Finite Field of size 2 To: Integer Ring @@ -4466,7 +4466,7 @@ cdef class IntegerMod_to_Integer(Map): Lifting maps are morphisms in the category of sets (see :trac:`15618`):: - sage: ZZ.convert_map_from(GF(2)).parent() # optional - sage.rings.finite_rings + sage: ZZ.convert_map_from(GF(2)).parent() Set of Morphisms from Finite Field of size 2 to Integer Ring in Category of sets """ import sage.categories.homset diff --git a/src/sage/rings/finite_rings/integer_mod_ring.py b/src/sage/rings/finite_rings/integer_mod_ring.py index f34faa4e9a9..75bc213230e 100644 --- a/src/sage/rings/finite_rings/integer_mod_ring.py +++ b/src/sage/rings/finite_rings/integer_mod_ring.py @@ -16,16 +16,16 @@ :: sage: r = Integers(7) - sage: s = GF(7) # optional - sage.rings.finite_rings - sage: r.has_coerce_map_from(s) # optional - sage.rings.finite_rings + sage: s = GF(7) + sage: r.has_coerce_map_from(s) False - sage: s.has_coerce_map_from(r) # optional - sage.rings.finite_rings + sage: s.has_coerce_map_from(r) # needs sage.rings.finite_rings True - sage: s(1) + r(1) # optional - sage.rings.finite_rings + sage: s(1) + r(1) # needs sage.rings.finite_rings 2 - sage: parent(s(1) + r(1)) # optional - sage.rings.finite_rings + sage: parent(s(1) + r(1)) # needs sage.rings.finite_rings Finite Field of size 7 - sage: parent(r(1) + s(1)) # optional - sage.rings.finite_rings + sage: parent(r(1) + s(1)) # needs sage.rings.finite_rings Finite Field of size 7 We list the elements of `\ZZ/3\ZZ`:: @@ -259,9 +259,9 @@ def is_IntegerModRing(x): Use isinstance(..., sage.rings.abc.IntegerModRing) instead. See https://github.com/sagemath/sage/issues/32606 for details. True - sage: is_IntegerModRing(GF(13)) # optional - sage.rings.finite_rings + sage: is_IntegerModRing(GF(13)) True - sage: is_IntegerModRing(GF(4, 'a')) # optional - sage.rings.finite_rings + sage: is_IntegerModRing(GF(4, 'a')) # needs sage.rings.finite_rings False sage: is_IntegerModRing(10) False @@ -290,9 +290,9 @@ def _unit_gens_primepowercase(p, r): sage: from sage.rings.finite_rings.integer_mod_ring import _unit_gens_primepowercase sage: _unit_gens_primepowercase(2, 3) [(7, 2), (5, 2)] - sage: _unit_gens_primepowercase(17, 1) # optional - sage.libs.pari + sage: _unit_gens_primepowercase(17, 1) # needs sage.libs.pari [(3, 16)] - sage: _unit_gens_primepowercase(3, 3) # optional - sage.libs.pari + sage: _unit_gens_primepowercase(3, 3) # needs sage.libs.pari [(2, 18)] """ pr = p**r @@ -344,14 +344,14 @@ class IntegerModRing_generic(quotient_ring.QuotientRing_generic, sage.rings.abc. 29 sage: FF.order() 29 - sage: gens = FF.unit_gens() # optional - sage.groups - sage: a = gens[0] # optional - sage.groups - sage: a # optional - sage.groups + sage: gens = FF.unit_gens() # needs sage.groups + sage: a = gens[0] # needs sage.groups + sage: a # needs sage.groups 2 - sage: a.is_square() # optional - sage.groups + sage: a.is_square() # needs sage.groups False - sage: def pow(i): return a**i # optional - sage.groups - sage: [pow(i) for i in range(16)] # optional - sage.groups + sage: def pow(i): return a**i + sage: [pow(i) for i in range(16)] # needs sage.groups [1, 2, 4, 8, 16, 3, 6, 12, 24, 19, 9, 18, 7, 14, 28, 27] sage: TestSuite(FF).run() @@ -404,23 +404,23 @@ class IntegerModRing_generic(quotient_ring.QuotientRing_generic, sage.rings.abc. 16 sage: Z16.characteristic() 16 - sage: gens = Z16.unit_gens() # optional - sage.groups - sage: gens # optional - sage.groups + sage: gens = Z16.unit_gens() # needs sage.groups + sage: gens # needs sage.groups (15, 5) - sage: a = gens[0] # optional - sage.groups - sage: b = gens[1] # optional - sage.groups - sage: def powa(i): return a**i # optional - sage.groups - sage: def powb(i): return b**i # optional - sage.groups - sage: gp_exp = FF.unit_group_exponent() # optional - sage.groups - sage: gp_exp # optional - sage.groups + sage: a = gens[0] # needs sage.groups + sage: b = gens[1] # needs sage.groups + sage: def powa(i): return a**i + sage: def powb(i): return b**i + sage: gp_exp = FF.unit_group_exponent() # needs sage.groups + sage: gp_exp # needs sage.groups 28 - sage: [powa(i) for i in range(15)] # optional - sage.groups + sage: [powa(i) for i in range(15)] # needs sage.groups [1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1] - sage: [powb(i) for i in range(15)] # optional - sage.groups + sage: [powb(i) for i in range(15)] # needs sage.groups [1, 5, 9, 13, 1, 5, 9, 13, 1, 5, 9, 13, 1, 5, 9] - sage: a.multiplicative_order() # optional - sage.groups + sage: a.multiplicative_order() # needs sage.groups 2 - sage: b.multiplicative_order() # optional - sage.groups + sage: b.multiplicative_order() # needs sage.groups 4 sage: TestSuite(Z16).run() @@ -639,22 +639,22 @@ def multiplicative_subgroups(self): EXAMPLES:: - sage: Integers(5).multiplicative_subgroups() # optional - sage.groups + sage: Integers(5).multiplicative_subgroups() # needs sage.groups ((2,), (4,), ()) - sage: Integers(15).multiplicative_subgroups() # optional - sage.groups + sage: Integers(15).multiplicative_subgroups() # needs sage.groups ((11, 7), (11, 4), (2,), (11,), (14,), (7,), (4,), ()) - sage: Integers(2).multiplicative_subgroups() # optional - sage.groups + sage: Integers(2).multiplicative_subgroups() # needs sage.groups ((),) - sage: len(Integers(341).multiplicative_subgroups()) # optional - sage.groups + sage: len(Integers(341).multiplicative_subgroups()) # needs sage.groups 80 TESTS:: - sage: IntegerModRing(1).multiplicative_subgroups() # optional - sage.groups + sage: IntegerModRing(1).multiplicative_subgroups() # needs sage.groups ((),) - sage: IntegerModRing(2).multiplicative_subgroups() # optional - sage.groups + sage: IntegerModRing(2).multiplicative_subgroups() # needs sage.groups ((),) - sage: IntegerModRing(3).multiplicative_subgroups() # optional - sage.groups + sage: IntegerModRing(3).multiplicative_subgroups() # needs sage.groups ((2,), ()) """ return tuple(tuple(g.value() for g in H.gens()) @@ -668,7 +668,7 @@ def is_integral_domain(self, proof=None): sage: Integers(389).is_integral_domain() True - sage: Integers(389^2).is_integral_domain() # optional - sage.libs.pari + sage: Integers(389^2).is_integral_domain() # needs sage.libs.pari False TESTS: @@ -689,7 +689,7 @@ def is_unique_factorization_domain(self, proof=None): sage: Integers(389).is_unique_factorization_domain() True - sage: Integers(389^2).is_unique_factorization_domain() # optional - sage.libs.pari + sage: Integers(389^2).is_unique_factorization_domain() # needs sage.libs.pari False """ return self.is_field(proof) @@ -791,10 +791,10 @@ def field(self): sage: R = Integers(7); R Ring of integers modulo 7 - sage: R.field() # optional - sage.rings.finite_rings + sage: R.field() Finite Field of size 7 sage: R = Integers(9) - sage: R.field() # optional - sage.rings.finite_rings + sage: R.field() Traceback (most recent call last): ... ValueError: self must be a field @@ -828,8 +828,8 @@ def _pseudo_fraction_field(self): This should be very fast:: - sage: R. = Integers(next_prime(10^101)*next_prime(10^100))[] # optional - sage.libs.pari - sage: x / R.base_ring()(2) # optional - sage.libs.pari + sage: R. = Integers(next_prime(10^101)*next_prime(10^100))[] # needs sage.libs.pari + sage: x / R.base_ring()(2) # needs sage.libs.pari 500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013365000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000401*x """ return self @@ -848,18 +848,18 @@ def multiplicative_group_is_cyclic(self): sage: R.multiplicative_group_is_cyclic() True sage: R = Integers(9) - sage: R.multiplicative_group_is_cyclic() # optional - sage.libs.pari + sage: R.multiplicative_group_is_cyclic() # needs sage.libs.pari True - sage: Integers(8).multiplicative_group_is_cyclic() # optional - sage.libs.pari + sage: Integers(8).multiplicative_group_is_cyclic() False - sage: Integers(4).multiplicative_group_is_cyclic() # optional - sage.libs.pari + sage: Integers(4).multiplicative_group_is_cyclic() True - sage: Integers(25*3).multiplicative_group_is_cyclic() # optional - sage.libs.pari + sage: Integers(25*3).multiplicative_group_is_cyclic() # needs sage.libs.pari False We test that :trac:`5250` is fixed:: - sage: Integers(162).multiplicative_group_is_cyclic() # optional - sage.libs.pari + sage: Integers(162).multiplicative_group_is_cyclic() # needs sage.libs.pari True """ n = self.order() @@ -886,24 +886,24 @@ def multiplicative_generator(self): sage: R = Integers(7); R Ring of integers modulo 7 - sage: R.multiplicative_generator() # optional - sage.libs.pari + sage: R.multiplicative_generator() # needs sage.libs.pari 3 sage: R = Integers(9) - sage: R.multiplicative_generator() # optional - sage.libs.pari + sage: R.multiplicative_generator() # needs sage.libs.pari 2 - sage: Integers(8).multiplicative_generator() # optional - sage.libs.pari + sage: Integers(8).multiplicative_generator() Traceback (most recent call last): ... ValueError: multiplicative group of this ring is not cyclic - sage: Integers(4).multiplicative_generator() # optional - sage.libs.pari + sage: Integers(4).multiplicative_generator() # needs sage.libs.pari 3 - sage: Integers(25*3).multiplicative_generator() # optional - sage.libs.pari + sage: Integers(25*3).multiplicative_generator() # needs sage.libs.pari Traceback (most recent call last): ... ValueError: multiplicative group of this ring is not cyclic - sage: Integers(25*3).unit_gens() # optional - sage.libs.pari + sage: Integers(25*3).unit_gens() # needs sage.libs.pari (26, 52) - sage: Integers(162).unit_gens() # optional - sage.libs.pari + sage: Integers(162).unit_gens() # needs sage.libs.pari (83,) """ try: @@ -928,9 +928,9 @@ def quadratic_nonresidue(self): EXAMPLES:: sage: R = Integers(17) - sage: R.quadratic_nonresidue() # optional - sage.libs.pari + sage: R.quadratic_nonresidue() # needs sage.libs.pari 3 - sage: R(3).is_square() # optional - sage.libs.pari + sage: R(3).is_square() False """ try: @@ -955,18 +955,18 @@ def square_roots_of_one(self): sage: R = Integers(2^10) sage: [x for x in R if x^2 == 1] [1, 511, 513, 1023] - sage: R.square_roots_of_one() # optional - sage.libs.pari + sage: R.square_roots_of_one() (1, 511, 513, 1023) :: - sage: v = Integers(9*5).square_roots_of_one(); v # optional - sage.libs.pari + sage: v = Integers(9*5).square_roots_of_one(); v # needs sage.libs.pari (1, 19, 26, 44) - sage: [x^2 for x in v] # optional - sage.libs.pari + sage: [x^2 for x in v] # needs sage.libs.pari [1, 1, 1, 1] - sage: v = Integers(9*5*8).square_roots_of_one(); v # optional - sage.libs.pari + sage: v = Integers(9*5*8).square_roots_of_one(); v # needs sage.libs.pari (1, 19, 71, 89, 91, 109, 161, 179, 181, 199, 251, 269, 271, 289, 341, 359) - sage: [x^2 for x in v] # optional - sage.libs.pari + sage: [x^2 for x in v] # needs sage.libs.pari [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] """ try: @@ -1133,7 +1133,7 @@ def _pari_order(self): EXAMPLES:: - sage: Zmod(87)._pari_order() # optional - sage.libs.pari + sage: Zmod(87)._pari_order() # needs sage.libs.pari 87 """ try: @@ -1146,14 +1146,14 @@ def _element_constructor_(self, x): """ TESTS:: - sage: K2 = GF(2) # optional - sage.rings.finite_rings - sage: K3 = GF(3) # optional - sage.rings.finite_rings - sage: K8 = GF(8, 'a') # optional - sage.rings.finite_rings - sage: K8(5) # indirect doctest # optional - sage.rings.finite_rings + sage: K2 = GF(2) + sage: K3 = GF(3) + sage: K8 = GF(8, 'a') # needs sage.rings.finite_rings + sage: K8(5) # indirect doctest # needs sage.rings.finite_rings 1 - sage: K8('a+1') # optional - sage.rings.finite_rings + sage: K8('a+1') # needs sage.rings.finite_rings a + 1 - sage: K8(K2(1)) # optional - sage.rings.finite_rings + sage: K8(K2(1)) # needs sage.rings.finite_rings 1 The following test refers to :trac:`6468`:: @@ -1165,7 +1165,7 @@ def _element_constructor_(self, x): ....: raise PariError sage: P = foo_parent() sage: F = foo(P) - sage: GF(2)(F) # optional - sage.rings.finite_rings + sage: GF(2)(F) Traceback (most recent call last): ... TypeError: error coercing to finite field @@ -1173,21 +1173,21 @@ def _element_constructor_(self, x): The following test refers to :trac:`8970`:: sage: R = Zmod(13); a = R(2) - sage: a == R(gap(a)) # optional - sage.libs.gap + sage: a == R(gap(a)) # needs sage.libs.gap True libgap interface (:trac:`23714`):: - sage: a = libgap.eval("Z(13)^2") # optional - sage.libs.gap - sage: a.sage() # optional - sage.libs.gap + sage: a = libgap.eval("Z(13)^2") # needs sage.libs.gap + sage: a.sage() # needs sage.libs.gap 4 - sage: libgap(a.sage()) == a # optional - sage.libs.gap + sage: libgap(a.sage()) == a # needs sage.libs.gap True better syntax for libgap interface:: - sage: a = libgap.Z(13)^2 # optional - sage.libs.gap - sage: libgap(a.sage()) == a # optional - sage.libs.gap + sage: a = libgap.Z(13)^2 # needs sage.libs.gap + sage: libgap(a.sage()) == a # needs sage.libs.gap True """ try: @@ -1296,7 +1296,7 @@ def _convert_map_from_(self, other): EXAMPLES:: - sage: Zmod(81).convert_map_from(Qp(3)) # optional - sage.rings.padics + sage: Zmod(81).convert_map_from(Qp(3)) # needs sage.rings.padics Reduction morphism: From: 3-adic Field with capped relative precision 20 To: Ring of integers modulo 81 @@ -1321,9 +1321,9 @@ def __richcmp__(self, other, op): Ring of integers modulo 13 sage: Z11 == Z11, Z11 == Z12, Z11 == Z13 (True, False, False) - sage: F = GF(11); F # optional - sage.rings.finite_rings + sage: F = GF(11); F Finite Field of size 11 - sage: Z11 == F # optional - sage.rings.finite_rings + sage: Z11 == F False In :trac:`15229`, the following was implemented:: @@ -1332,7 +1332,7 @@ def __richcmp__(self, other, op): sage: R2 = IntegerModRing(5, is_field=True) sage: R1 is R2 # used to return False True - sage: R2 == GF(5) # optional - sage.rings.finite_rings + sage: R2 == GF(5) False """ @@ -1366,12 +1366,12 @@ def unit_gens(self, **kwds): EXAMPLES:: sage: R = IntegerModRing(18) - sage: R.unit_gens() # optional - sage.groups + sage: R.unit_gens() # needs sage.groups (11,) sage: R = IntegerModRing(17) - sage: R.unit_gens() # optional - sage.groups + sage: R.unit_gens() # needs sage.groups (3,) - sage: IntegerModRing(next_prime(10^30)).unit_gens() # optional - sage.groups + sage: IntegerModRing(next_prime(10^30)).unit_gens() # needs sage.groups (5,) The choice of generators is affected by the optional keyword @@ -1379,18 +1379,18 @@ def unit_gens(self, **kwds): See :meth:`unit_group` for details. :: sage: A = Zmod(55) - sage: A.unit_gens(algorithm='sage') # optional - sage.groups + sage: A.unit_gens(algorithm='sage') # needs sage.groups (12, 46) - sage: A.unit_gens(algorithm='pari') # optional - sage.groups sage.libs.pari + sage: A.unit_gens(algorithm='pari') # needs sage.groups sage.libs.pari (2, 21) TESTS:: - sage: IntegerModRing(2).unit_gens() # optional - sage.groups + sage: IntegerModRing(2).unit_gens() # needs sage.groups () - sage: IntegerModRing(4).unit_gens() # optional - sage.groups + sage: IntegerModRing(4).unit_gens() # needs sage.groups (3,) - sage: IntegerModRing(8).unit_gens() # optional - sage.groups + sage: IntegerModRing(8).unit_gens() # needs sage.groups (7, 5) """ @@ -1401,10 +1401,10 @@ def unit_group_exponent(self): EXAMPLES:: sage: R = IntegerModRing(17) - sage: R.unit_group_exponent() # optional - sage.groups + sage: R.unit_group_exponent() # needs sage.groups 16 sage: R = IntegerModRing(18) - sage: R.unit_group_exponent() # optional - sage.groups + sage: R.unit_group_exponent() # needs sage.groups 6 """ return self.unit_group().exponent() @@ -1416,7 +1416,7 @@ def unit_group_order(self): EXAMPLES:: sage: R = Integers(500) - sage: R.unit_group_order() # optional - sage.groups + sage: R.unit_group_order() # needs sage.groups 200 """ return self.unit_group().order() @@ -1455,52 +1455,52 @@ def unit_group(self, algorithm='sage'): cyclic factors are computed, but in a different order:: sage: A = Zmod(15) - sage: G = A.unit_group(); G # optional - sage.groups + sage: G = A.unit_group(); G # needs sage.groups Multiplicative Abelian group isomorphic to C2 x C4 - sage: G.gens_values() # optional - sage.groups + sage: G.gens_values() # needs sage.groups (11, 7) - sage: H = A.unit_group(algorithm='pari'); H # optional - sage.groups sage.libs.pari + sage: H = A.unit_group(algorithm='pari'); H # needs sage.groups sage.libs.pari Multiplicative Abelian group isomorphic to C4 x C2 - sage: H.gens_values() # optional - sage.groups sage.libs.pari + sage: H.gens_values() # needs sage.groups sage.libs.pari (7, 11) Here are two examples where the cyclic factors are isomorphic, but are ordered differently and have different generators:: sage: A = Zmod(40) - sage: G = A.unit_group(); G # optional - sage.groups + sage: G = A.unit_group(); G # needs sage.groups Multiplicative Abelian group isomorphic to C2 x C2 x C4 - sage: G.gens_values() # optional - sage.groups + sage: G.gens_values() # needs sage.groups (31, 21, 17) - sage: H = A.unit_group(algorithm='pari'); H # optional - sage.groups sage.libs.pari + sage: H = A.unit_group(algorithm='pari'); H # needs sage.groups sage.libs.pari Multiplicative Abelian group isomorphic to C4 x C2 x C2 - sage: H.gens_values() # optional - sage.groups sage.libs.pari + sage: H.gens_values() # needs sage.groups sage.libs.pari (17, 31, 21) sage: A = Zmod(192) - sage: G = A.unit_group(); G # optional - sage.groups + sage: G = A.unit_group(); G # needs sage.groups Multiplicative Abelian group isomorphic to C2 x C16 x C2 - sage: G.gens_values() # optional - sage.groups + sage: G.gens_values() # needs sage.groups (127, 133, 65) - sage: H = A.unit_group(algorithm='pari'); H # optional - sage.groups sage.libs.pari + sage: H = A.unit_group(algorithm='pari'); H # needs sage.groups sage.libs.pari Multiplicative Abelian group isomorphic to C16 x C2 x C2 - sage: H.gens_values() # optional - sage.groups sage.libs.pari + sage: H.gens_values() # needs sage.groups sage.libs.pari (133, 127, 65) In the following examples, the cyclic factors are not even isomorphic:: sage: A = Zmod(319) - sage: A.unit_group() # optional - sage.groups + sage: A.unit_group() # needs sage.groups Multiplicative Abelian group isomorphic to C10 x C28 - sage: A.unit_group(algorithm='pari') # optional - sage.groups sage.libs.pari + sage: A.unit_group(algorithm='pari') # needs sage.groups sage.libs.pari Multiplicative Abelian group isomorphic to C140 x C2 sage: A = Zmod(30.factorial()) - sage: A.unit_group() # optional - sage.groups + sage: A.unit_group() # needs sage.groups Multiplicative Abelian group isomorphic to C2 x C16777216 x C3188646 x C62500 x C2058 x C110 x C156 x C16 x C18 x C22 x C28 - sage: A.unit_group(algorithm='pari') # optional - sage.groups sage.libs.pari + sage: A.unit_group(algorithm='pari') # needs sage.groups sage.libs.pari Multiplicative Abelian group isomorphic to C20499647385305088000000 x C55440 x C12 x C12 x C4 x C2 x C2 x C2 x C2 x C2 x C2 @@ -1509,17 +1509,17 @@ def unit_group(self, algorithm='sage'): We test the cases where the unit group is trivial:: sage: A = Zmod(1) - sage: A.unit_group() # optional - sage.groups + sage: A.unit_group() # needs sage.groups Trivial Abelian group - sage: A.unit_group(algorithm='pari') # optional - sage.groups sage.libs.pari + sage: A.unit_group(algorithm='pari') # needs sage.groups sage.libs.pari Trivial Abelian group sage: A = Zmod(2) - sage: A.unit_group() # optional - sage.groups + sage: A.unit_group() # needs sage.groups Trivial Abelian group - sage: A.unit_group(algorithm='pari') # optional - sage.groups sage.libs.pari + sage: A.unit_group(algorithm='pari') # needs sage.groups sage.libs.pari Trivial Abelian group - sage: Zmod(3).unit_group(algorithm='bogus') # optional - sage.groups + sage: Zmod(3).unit_group(algorithm='bogus') # needs sage.groups Traceback (most recent call last): ... ValueError: unknown algorithm 'bogus' for computing the unit group @@ -1583,7 +1583,7 @@ def _gap_init_(self): sage: R = Integers(12345678900) sage: R Ring of integers modulo 12345678900 - sage: gap(R) # indirect doctest # optional - sage.libs.gap + sage: gap(R) # indirect doctest # needs sage.libs.gap (Integers mod 12345678900) """ return 'ZmodnZ({})'.format(self.order()) From c0118bade442df9bfa3bb44d1379aa77a51ec05a Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 8 Jul 2023 11:43:43 -0700 Subject: [PATCH 09/23] src/sage/rings/polynomial/polynomial_ring.py: Use '# needs sage.libs.ntl' when GF2X is used --- src/sage/rings/finite_rings/residue_field.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 5c1941894e0..ee85d8db572 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -906,7 +906,7 @@ cdef class ReductionMap(Map): sage: R. = GF(2)[]; P = R.ideal(t^7 + t^6 + t^5 + t^4 + 1) sage: k = P.residue_field() - sage: k.reduction_map() + sage: k.reduction_map() # optional - sage.libs.ntl Partially defined reduction map: From: Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X) @@ -1133,7 +1133,7 @@ cdef class ReductionMap(Map): sage: k. = R.residue_field(h) sage: K = R.fraction_field() sage: f = k.convert_map_from(K) - sage: f.section() + sage: f.section() # needs sage.libs.ntl Lifting map: From: Residue field in a of Principal ideal (t^5 + t^2 + 1) of Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X) @@ -1466,7 +1466,7 @@ cdef class LiftingMap(Section): sage: R. = GF(2)[]; h = t^5 + t^2 + 1 sage: k. = R.residue_field(h) sage: K = R.fraction_field() - sage: L = k.lift_map(); L.codomain() + sage: L = k.lift_map(); L.codomain() # needs sage.libs.ntl Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X) """ self._K = reduction._K From 19222fbb7437a4f946a7697e499b523e7f1ddd56 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Wed, 12 Jul 2023 18:07:06 -0700 Subject: [PATCH 10/23] ./sage -fixdoctests --distribution sagemath-categories --probe sage.rings.finite_rings --only-tags src/sage/rings/finite_rings --- .../rings/finite_rings/finite_field_base.pyx | 9 +- .../finite_rings/finite_field_prime_modn.py | 8 +- src/sage/rings/finite_rings/integer_mod.pyx | 26 +- .../rings/finite_rings/integer_mod_ring.py | 18 +- src/sage/rings/finite_rings/residue_field.pyx | 647 +++++++++--------- .../finite_rings/residue_field_givaro.pyx | 38 +- .../finite_rings/residue_field_ntl_gf2e.pyx | 38 +- .../finite_rings/residue_field_pari_ffelt.pyx | 40 +- 8 files changed, 421 insertions(+), 403 deletions(-) diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index 4f4d7f64c72..b3e70d45067 100644 --- a/src/sage/rings/finite_rings/finite_field_base.pyx +++ b/src/sage/rings/finite_rings/finite_field_base.pyx @@ -226,13 +226,14 @@ cdef class FiniteField(Field): EXAMPLES:: - sage: GF(97,'a')._magma_init_(magma) # optional - magma + sage: # optional - magma + sage: GF(97,'a')._magma_init_(magma) 'GF(97)' - sage: GF(9,'a')._magma_init_(magma) # optional - magma + sage: GF(9,'a')._magma_init_(magma) 'SageCreateWithNames(ext,["a"])' - sage: magma(GF(9,'a')) # optional - magma + sage: magma(GF(9,'a')) Finite field of size 3^2 - sage: magma(GF(9,'a')).1 # optional - magma + sage: magma(GF(9,'a')).1 a """ if self.degree() == 1: diff --git a/src/sage/rings/finite_rings/finite_field_prime_modn.py b/src/sage/rings/finite_rings/finite_field_prime_modn.py index 6919e87f4d2..8bb35604697 100644 --- a/src/sage/rings/finite_rings/finite_field_prime_modn.py +++ b/src/sage/rings/finite_rings/finite_field_prime_modn.py @@ -109,10 +109,10 @@ def _coerce_map_from_(self, S): 1 sage: # needs sage.rings.finite_rings sage.rings.number_field - sage: K. = QuadraticField(337) # See trac 11319 # needs sage.rings.number_field - sage: pp = K.ideal(13).factor()[0][0] # needs sage.rings.number_field - sage: RF13 = K.residue_field(pp) # needs sage.rings.number_field - sage: RF13.hom([GF(13)(1)]) # needs sage.rings.number_field + sage: K. = QuadraticField(337) # See trac 11319 + sage: pp = K.ideal(13).factor()[0][0] + sage: RF13 = K.residue_field(pp) + sage: RF13.hom([GF(13)(1)]) Ring morphism: From: Residue field of Fractional ideal (-w - 18) To: Finite Field of size 13 diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index 65745f4aff4..5863b0ffd75 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -658,13 +658,14 @@ cdef class IntegerMod_abstract(FiniteRingElement): A bigger example:: - sage: FF = FiniteField(2^32 + 61) # needs sage.rings.finite_rings - sage: c = FF(4294967356) # needs sage.rings.finite_rings - sage: x = FF(2) # needs sage.rings.finite_rings - sage: a = c.log(x) # needs sage.rings.finite_rings - sage: a # needs sage.rings.finite_rings + sage: # needs sage.rings.finite_rings + sage: FF = FiniteField(2^32 + 61) + sage: c = FF(4294967356) + sage: x = FF(2) + sage: a = c.log(x) + sage: a 2147483678 - sage: x^a # needs sage.rings.finite_rings + sage: x^a 4294967356 An example with a highly composite modulus:: @@ -1179,11 +1180,12 @@ cdef class IntegerMod_abstract(FiniteRingElement): :: - sage: t = FiniteField(next_prime(2^100))(4) # needs sage.rings.finite_rings - sage: t.sqrt(extend=False, all=True) # needs sage.rings.finite_rings + sage: # needs sage.rings.finite_rings + sage: t = FiniteField(next_prime(2^100))(4) + sage: t.sqrt(extend=False, all=True) [2, 1267650600228229401496703205651] - sage: t = FiniteField(next_prime(2^100))(2) # needs sage.rings.finite_rings - sage: t.sqrt(extend=False, all=True) # needs sage.rings.finite_rings + sage: t = FiniteField(next_prime(2^100))(2) + sage: t.sqrt(extend=False, all=True) [] Modulo a power of 2:: @@ -1931,8 +1933,8 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: sage: F. = GF(13) - sage: V = F.vector_space(map=False) - sage: V(a) + sage: V = F.vector_space(map=False) # needs sage.modules + sage: V(a) # needs sage.modules (1) """ return self.parent().vector_space(map=False)([self]) diff --git a/src/sage/rings/finite_rings/integer_mod_ring.py b/src/sage/rings/finite_rings/integer_mod_ring.py index 75bc213230e..e6940b6f4c7 100644 --- a/src/sage/rings/finite_rings/integer_mod_ring.py +++ b/src/sage/rings/finite_rings/integer_mod_ring.py @@ -639,13 +639,14 @@ def multiplicative_subgroups(self): EXAMPLES:: - sage: Integers(5).multiplicative_subgroups() # needs sage.groups + sage: # needs sage.groups + sage: Integers(5).multiplicative_subgroups() ((2,), (4,), ()) - sage: Integers(15).multiplicative_subgroups() # needs sage.groups + sage: Integers(15).multiplicative_subgroups() ((11, 7), (11, 4), (2,), (11,), (14,), (7,), (4,), ()) - sage: Integers(2).multiplicative_subgroups() # needs sage.groups + sage: Integers(2).multiplicative_subgroups() ((),) - sage: len(Integers(341).multiplicative_subgroups()) # needs sage.groups + sage: len(Integers(341).multiplicative_subgroups()) 80 TESTS:: @@ -960,13 +961,14 @@ def square_roots_of_one(self): :: - sage: v = Integers(9*5).square_roots_of_one(); v # needs sage.libs.pari + sage: # needs sage.libs.pari + sage: v = Integers(9*5).square_roots_of_one(); v (1, 19, 26, 44) - sage: [x^2 for x in v] # needs sage.libs.pari + sage: [x^2 for x in v] [1, 1, 1, 1] - sage: v = Integers(9*5*8).square_roots_of_one(); v # needs sage.libs.pari + sage: v = Integers(9*5*8).square_roots_of_one(); v (1, 19, 71, 89, 91, 109, 161, 179, 181, 199, 251, 269, 271, 289, 341, 359) - sage: [x^2 for x in v] # needs sage.libs.pari + sage: [x^2 for x in v] [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] """ try: diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index ee85d8db572..598ca88d122 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -8,31 +8,31 @@ polynomials over `GF(p)`. EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: k # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P); k # needs sage.rings.number_field Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) - sage: k.order() # optional - sage.rings.number_field + sage: k.order() # needs sage.rings.number_field 841 We reduce mod a prime for which the ring of integers is not monogenic (i.e., 2 is an essential discriminant divisor):: - sage: K. = NumberField(x^3 + x^2 - 2*x + 8) # optional - sage.rings.number_field - sage: F = K.factor(2); F # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = NumberField(x^3 + x^2 - 2*x + 8) + sage: F = K.factor(2); F (Fractional ideal (-1/2*a^2 + 1/2*a - 1)) * (Fractional ideal (-a^2 + 2*a - 3)) * (Fractional ideal (3/2*a^2 - 5/2*a + 4)) - sage: F[0][0].residue_field() # optional - sage.rings.number_field + sage: F[0][0].residue_field() Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1) - sage: F[1][0].residue_field() # optional - sage.rings.number_field + sage: F[1][0].residue_field() Residue field of Fractional ideal (-a^2 + 2*a - 3) - sage: F[2][0].residue_field() # optional - sage.rings.number_field + sage: F[2][0].residue_field() Residue field of Fractional ideal (3/2*a^2 - 5/2*a + 4) We can also form residue fields from `\ZZ`:: - sage: ZZ.residue_field(17) # optional - sage.rings.number_field + sage: ZZ.residue_field(17) # needs sage.rings.number_field Residue field of Integers modulo 17 And for polynomial rings over finite fields:: @@ -54,19 +54,20 @@ AUTHORS: TESTS:: - sage: K. = CyclotomicField(7) # optional - sage.rings.number_field - sage: P = K.factor(17)[0][0] # optional - sage.rings.number_field - sage: ff = K.residue_field(P) # optional - sage.rings.number_field - sage: loads(dumps(ff)) is ff # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(7) + sage: P = K.factor(17)[0][0] + sage: ff = K.residue_field(P) + sage: loads(dumps(ff)) is ff True - sage: a = ff(z) # optional - sage.rings.number_field - sage: parent(a*a) # optional - sage.rings.number_field + sage: a = ff(z) + sage: parent(a*a) Residue field in zbar of Fractional ideal (17) sage: TestSuite(ff).run() Verify that :trac:`15192` has been resolved:: - sage: a.is_unit() # optional - sage.rings.number_field + sage: a.is_unit() # needs sage.rings.number_field True sage: R. = GF(11)[]; P = R.ideal(t^3 + t + 4) @@ -85,12 +86,13 @@ Verify that :trac:`7475` is fixed:: Reducing a curve modulo a prime:: - sage: K. = NumberField(x^2 + 23) # optional - sage.rings.number_field - sage: OK = K.ring_of_integers() # optional - sage.rings.number_field - sage: E = EllipticCurve([0,0,0,K(1),K(5)]) # optional - sage.rings.number_field - sage: pp = K.factor(13)[0][0] # optional - sage.rings.number_field - sage: Fpp = OK.residue_field(pp) # optional - sage.rings.number_field - sage: E.base_extend(Fpp) # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = NumberField(x^2 + 23) + sage: OK = K.ring_of_integers() + sage: E = EllipticCurve([0,0,0,K(1),K(5)]) + sage: pp = K.factor(13)[0][0] + sage: Fpp = OK.residue_field(pp) + sage: E.base_extend(Fpp) Elliptic Curve defined by y^2 = x^3 + x + 5 over Residue field of Fractional ideal (13, 1/2*s + 9/2) @@ -106,41 +108,42 @@ Reducing a curve modulo a prime:: Calculating Groebner bases over various residue fields. First over a small non-prime field:: - sage: F1. = NumberField(x^6 + 6*x^5 + 124*x^4 # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: F1. = NumberField(x^6 + 6*x^5 + 124*x^4 ....: + 452*x^3 + 4336*x^2 + 8200*x + 42316) - sage: reduct_id = F1.factor(47)[0][0] # optional - sage.rings.number_field - sage: Rf = F1.residue_field(reduct_id) # optional - sage.rings.number_field - sage: type(Rf) # optional - sage.rings.number_field + sage: reduct_id = F1.factor(47)[0][0] + sage: Rf = F1.residue_field(reduct_id) + sage: type(Rf) - sage: Rf.cardinality().factor() # optional - sage.rings.number_field + sage: Rf.cardinality().factor() 47^3 - sage: R. = PolynomialRing(Rf) # optional - sage.rings.number_field - sage: ubar = Rf(u) # optional - sage.rings.number_field - sage: I = ideal([ubar*X + Y]); I # optional - sage.rings.number_field + sage: R. = PolynomialRing(Rf) + sage: ubar = Rf(u) + sage: I = ideal([ubar*X + Y]); I Ideal (ubar*X + Y) of Multivariate Polynomial Ring in X, Y over Residue field in ubar of Fractional ideal (47, 517/55860*u^5 + 235/3724*u^4 + 9829/13965*u^3 + 54106/13965*u^2 + 64517/27930*u + 755696/13965) - sage: I.groebner_basis() # optional - sage.rings.number_field + sage: I.groebner_basis() [X + (-19*ubar^2 - 5*ubar - 17)*Y] And now over a large prime field:: sage: x = ZZ['x'].0 - sage: F1. = NumberField(x^2 + 6*x + 324) # optional - sage.rings.number_field - sage: reduct_id = F1.prime_above(next_prime(2^42)) # optional - sage.rings.number_field - sage: Rf = F1.residue_field(reduct_id) # optional - sage.rings.number_field - sage: type(Rf) # optional - sage.rings.number_field + sage: F1. = NumberField(x^2 + 6*x + 324) # needs sage.rings.number_field + sage: reduct_id = F1.prime_above(next_prime(2^42)) # needs sage.rings.number_field + sage: Rf = F1.residue_field(reduct_id) # needs sage.rings.number_field + sage: type(Rf) # needs sage.rings.number_field - sage: Rf.cardinality().factor() # optional - sage.rings.number_field + sage: Rf.cardinality().factor() # needs sage.rings.number_field 4398046511119 - sage: S. = PolynomialRing(Rf, order='lex') # optional - sage.rings.number_field - sage: I = ideal([2*X - Y^2, Y + Z]) # optional - sage.rings.number_field - sage: I.groebner_basis() # optional - sage.rings.number_field + sage: S. = PolynomialRing(Rf, order='lex') # needs sage.rings.number_field + sage: I = ideal([2*X - Y^2, Y + Z]) # needs sage.rings.number_field + sage: I.groebner_basis() # needs sage.rings.number_field [X + 2199023255559*Z^2, Y + Z] - sage: S. = PolynomialRing(Rf, order='deglex') # optional - sage.rings.number_field - sage: I = ideal([2*X - Y^2, Y + Z]) # optional - sage.rings.number_field - sage: I.groebner_basis() # optional - sage.rings.number_field + sage: S. = PolynomialRing(Rf, order='deglex') # needs sage.rings.number_field + sage: I = ideal([2*X - Y^2, Y + Z]) # needs sage.rings.number_field + sage: I.groebner_basis() # needs sage.rings.number_field [Z^2 + 4398046511117*X, Y + Z] """ @@ -215,18 +218,18 @@ class ResidueFieldFactory(UniqueFactory): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: ResidueField(P) # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: ResidueField(P) # needs sage.rings.number_field Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) The result is cached:: - sage: ResidueField(P) is ResidueField(P) # optional - sage.rings.number_field + sage: ResidueField(P) is ResidueField(P) # needs sage.rings.number_field True - sage: k = K.residue_field(P); k # optional - sage.rings.number_field + sage: k = K.residue_field(P); k # needs sage.rings.number_field Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) - sage: k.order() # optional - sage.rings.number_field + sage: k.order() # needs sage.rings.number_field 841 It also works for polynomial rings:: @@ -245,22 +248,24 @@ class ResidueFieldFactory(UniqueFactory): An example where the generator of the number field doesn't generate the residue class field:: - sage: K. = NumberField(x^3 - 875) # optional - sage.rings.number_field - sage: P = K.ideal(5).factor()[0][0]; k = K.residue_field(P); k # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 875) + sage: P = K.ideal(5).factor()[0][0]; k = K.residue_field(P); k Residue field in abar of Fractional ideal (5, 1/25*a^2 - 2/5*a - 1) - sage: k.polynomial() # optional - sage.rings.number_field + sage: k.polynomial() abar^2 + 3*abar + 4 - sage: k.0^3 - 875 # optional - sage.rings.number_field + sage: k.0^3 - 875 2 An example where the residue class field is large but of degree 1:: - sage: K. = NumberField(x^3 - 875) # optional - sage.rings.number_field - sage: P = K.ideal(2007).factor()[2][0]; k = K.residue_field(P); k # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 875) + sage: P = K.ideal(2007).factor()[2][0]; k = K.residue_field(P); k Residue field of Fractional ideal (223, 1/5*a + 11) - sage: k(a) # optional - sage.rings.number_field + sage: k(a) 168 - sage: k(a)^3 - 875 # optional - sage.rings.number_field + sage: k(a)^3 - 875 0 And for polynomial rings:: @@ -276,28 +281,29 @@ class ResidueFieldFactory(UniqueFactory): In this example, 2 is an inessential discriminant divisor, so divides the index of ``ZZ[a]`` in the maximal order for all ``a``:: - sage: K. = NumberField(x^3 + x^2 - 2*x + 8) # optional - sage.rings.number_field - sage: P = K.ideal(2).factor()[0][0]; P # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = NumberField(x^3 + x^2 - 2*x + 8) + sage: P = K.ideal(2).factor()[0][0]; P Fractional ideal (-1/2*a^2 + 1/2*a - 1) - sage: F = K.residue_field(P); F # optional - sage.rings.number_field + sage: F = K.residue_field(P); F Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1) - sage: F(a) # optional - sage.rings.number_field + sage: F(a) 0 - sage: B = K.maximal_order().basis(); B # optional - sage.rings.number_field + sage: B = K.maximal_order().basis(); B [1, 1/2*a^2 + 1/2*a, a^2] - sage: F(B[1]) # optional - sage.rings.number_field + sage: F(B[1]) 1 - sage: F(B[2]) # optional - sage.rings.number_field + sage: F(B[2]) 0 - sage: F # optional - sage.rings.number_field + sage: F Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1) - sage: F.degree() # optional - sage.rings.number_field + sage: F.degree() 1 TESTS:: - sage: K. = NumberField(polygen(QQ)) # optional - sage.rings.number_field - sage: K.residue_field(K.ideal(3)) # optional - sage.rings.number_field + sage: K. = NumberField(polygen(QQ)) # needs sage.rings.number_field + sage: K.residue_field(K.ideal(3)) # needs sage.rings.number_field Residue field of Fractional ideal (3) """ def create_key_and_extra_args(self, p, names = None, check=True, impl=None, **kwds): @@ -308,8 +314,8 @@ class ResidueFieldFactory(UniqueFactory): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: ResidueField(K.ideal(29).factor()[0][0]) # indirect doctest # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: ResidueField(K.ideal(29).factor()[0][0]) # indirect doctest # needs sage.rings.number_field Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) """ if check: @@ -356,9 +362,9 @@ class ResidueFieldFactory(UniqueFactory): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: ResidueField(P) is ResidueField(P) # indirect doctest # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: ResidueField(P) is ResidueField(P) # indirect doctest # needs sage.rings.number_field True """ p, names, impl = key @@ -457,11 +463,11 @@ class ResidueField_generic(Field): EXAMPLES:: - sage: I = QQ[i].factor(2)[0][0]; I # optional - sage.rings.number_field + sage: I = QQ[i].factor(2)[0][0]; I # needs sage.rings.number_field Fractional ideal (I + 1) - sage: k = I.residue_field(); k # optional - sage.rings.number_field + sage: k = I.residue_field(); k # needs sage.rings.number_field Residue field of Fractional ideal (I + 1) - sage: type(k) # optional - sage.rings.number_field + sage: type(k) # needs sage.rings.number_field sage: R. = GF(29)[]; P = R.ideal(t^2 + 2); k. = ResidueField(P); k @@ -488,9 +494,9 @@ class ResidueField_generic(Field): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 17) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # indirect doctest # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 17) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # indirect doctest # needs sage.rings.number_field sage: F = ZZ.residue_field(17) # indirect doctest sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -527,21 +533,21 @@ class ResidueField_generic(Field): EXAMPLES:: - sage: K. = CyclotomicField(7) # optional - sage.rings.number_field - sage: P = K.factor(17)[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: k # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(7) + sage: P = K.factor(17)[0][0] + sage: k = K.residue_field(P); k Residue field in zbar of Fractional ideal (17) - sage: F, R = k.construction() # optional - sage.rings.number_field - sage: F # optional - sage.rings.number_field + sage: F, R = k.construction() + sage: F AlgebraicExtensionFunctor - sage: R # optional - sage.rings.number_field + sage: R Cyclotomic Field of order 7 and degree 6 - sage: F(R) is k # optional - sage.rings.number_field + sage: F(R) is k True - sage: F(ZZ) # optional - sage.rings.number_field + sage: F(ZZ) Residue field of Integers modulo 17 - sage: F(CyclotomicField(49)) # optional - sage.rings.number_field + sage: F(CyclotomicField(49)) Residue field in zbar of Fractional ideal (17) """ @@ -554,15 +560,15 @@ class ResidueField_generic(Field): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x + 1) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # indirect doctest # optional - sage.rings.number_field - sage: k.ideal() is P # optional - sage.rings.number_field + sage: K. = NumberField(x^3 + x + 1) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # indirect doctest # needs sage.rings.number_field + sage: k.ideal() is P # needs sage.rings.number_field True - sage: p = next_prime(2^40); p # optional - sage.rings.number_field + sage: p = next_prime(2^40); p # needs sage.rings.number_field 1099511627791 - sage: k = K.residue_field(K.prime_above(p)) # optional - sage.rings.number_field - sage: k.ideal().norm() == p # optional - sage.rings.number_field + sage: k = K.residue_field(K.prime_above(p)) # needs sage.rings.number_field + sage: k.ideal().norm() == p # needs sage.rings.number_field True sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -593,16 +599,16 @@ class ResidueField_generic(Field): sage: from sage.rings.finite_rings.residue_field import ResidueField_generic sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # optional - sage.rings.number_field - sage: P = K.ideal(-3*i - 2) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: F = OK.residue_field(P) # optional - sage.rings.number_field - sage: ResidueField_generic._element_constructor_(F, i) # optional - sage.rings.number_field + sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field + sage: P = K.ideal(-3*i - 2) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: F = OK.residue_field(P) # needs sage.rings.number_field + sage: ResidueField_generic._element_constructor_(F, i) # needs sage.rings.number_field 8 With :trac:`8800`, we also have:: - sage: ResidueField_generic._element_constructor_(F, GF(13)(8)) # optional - sage.rings.number_field + sage: ResidueField_generic._element_constructor_(F, GF(13)(8)) # needs sage.rings.number_field 8 Here is a test that was temporarily removed, but newly introduced @@ -639,23 +645,23 @@ class ResidueField_generic(Field): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # optional - sage.rings.number_field - sage: P = K.ideal(-3*i - 2) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: F = OK.residue_field(P) # optional - sage.rings.number_field - sage: F.has_coerce_map_from(GF(13)) # indirect doctest # optional - sage.rings.number_field + sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field + sage: P = K.ideal(-3*i - 2) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: F = OK.residue_field(P) # needs sage.rings.number_field + sage: F.has_coerce_map_from(GF(13)) # indirect doctest # needs sage.rings.number_field True TESTS: Check that :trac:`11319` is fixed:: - sage: GF(13).has_coerce_map_from(F) + sage: GF(13).has_coerce_map_from(F) # needs sage.rings.number_field True sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field() - sage: k.has_coerce_map_from(Qp(17)) # indirect doctest + sage: k.has_coerce_map_from(Qp(17)) # indirect doctest # needs sage.rings.padics False """ OK = self.p.ring() @@ -670,9 +676,9 @@ class ResidueField_generic(Field): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P); k # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P); k # needs sage.rings.number_field Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) sage: F = ZZ.residue_field(17); F @@ -695,15 +701,15 @@ class ResidueField_generic(Field): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: c = OK(a) # optional - sage.rings.number_field - sage: b = k(a) # optional - sage.rings.number_field - sage: k.lift(13*b + 5) # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: c = OK(a) # needs sage.rings.number_field + sage: b = k(a) # needs sage.rings.number_field + sage: k.lift(13*b + 5) # needs sage.rings.number_field 13*a + 5 - sage: k.lift(12821*b + 918) # optional - sage.rings.number_field + sage: k.lift(12821*b + 918) # needs sage.rings.number_field 3*a + 19 sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -726,28 +732,29 @@ class ResidueField_generic(Field): EXAMPLES:: - sage: I = QQ[2^(1/3)].factor(2)[0][0]; I # optional - sage.rings.number_field sage.symbolic + sage: # needs sage.rings.number_field sage.symbolic + sage: I = QQ[2^(1/3)].factor(2)[0][0]; I Fractional ideal (a) - sage: k = I.residue_field(); k # optional - sage.rings.number_field sage.symbolic + sage: k = I.residue_field(); k Residue field of Fractional ideal (a) - sage: pi = k.reduction_map(); pi # optional - sage.rings.number_field sage.symbolic + sage: pi = k.reduction_map(); pi Partially defined reduction map: From: Number Field in a with defining polynomial x^3 - 2 with a = 1.259921049894873? To: Residue field of Fractional ideal (a) - sage: pi.domain() # optional - sage.rings.number_field sage.symbolic + sage: pi.domain() Number Field in a with defining polynomial x^3 - 2 with a = 1.259921049894873? - sage: pi.codomain() # optional - sage.rings.number_field sage.symbolic + sage: pi.codomain() Residue field of Fractional ideal (a) sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x^2 - 2*x + 32) # optional - sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # optional - sage.rings.number_field - sage: F.reduction_map().domain() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 + x^2 - 2*x + 32) # needs sage.rings.number_field + sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field + sage: F.reduction_map().domain() # needs sage.rings.number_field Number Field in a with defining polynomial x^3 + x^2 - 2*x + 32 - sage: K. = NumberField(x^3 + 128) # optional - sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # optional - sage.rings.number_field - sage: F.reduction_map().codomain() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 + 128) # needs sage.rings.number_field + sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field + sage: F.reduction_map().codomain() # needs sage.rings.number_field Residue field of Fractional ideal (1/4*a) sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -769,21 +776,22 @@ class ResidueField_generic(Field): EXAMPLES:: - sage: I = QQ[3^(1/3)].factor(5)[1][0]; I # optional - sage.rings.number_field sage.symbolic + sage: # needs sage.rings.number_field sage.symbolic + sage: I = QQ[3^(1/3)].factor(5)[1][0]; I Fractional ideal (a - 2) - sage: k = I.residue_field(); k # optional - sage.rings.number_field sage.symbolic + sage: k = I.residue_field(); k Residue field of Fractional ideal (a - 2) - sage: f = k.lift_map(); f # optional - sage.rings.number_field sage.symbolic + sage: f = k.lift_map(); f Lifting map: From: Residue field of Fractional ideal (a - 2) To: Maximal Order in Number Field in a with defining polynomial x^3 - 3 with a = 1.442249570307409? - sage: f.domain() # optional - sage.rings.number_field sage.symbolic + sage: f.domain() Residue field of Fractional ideal (a - 2) - sage: f.codomain() # optional - sage.rings.number_field sage.symbolic + sage: f.codomain() Maximal Order in Number Field in a with defining polynomial x^3 - 3 with a = 1.442249570307409? - sage: f(k.0) # optional - sage.rings.number_field sage.symbolic + sage: f(k.0) 1 sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -810,12 +818,12 @@ class ResidueField_generic(Field): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 11) # optional - sage.rings.number_field - sage: F = K.ideal(37).factor(); F # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 11) # needs sage.rings.number_field + sage: F = K.ideal(37).factor(); F # needs sage.rings.number_field (Fractional ideal (37, a + 9)) * (Fractional ideal (37, a + 12)) * (Fractional ideal (-2*a + 5)) - sage: k = K.residue_field(F[0][0]) # optional - sage.rings.number_field - sage: l = K.residue_field(F[1][0]) # optional - sage.rings.number_field - sage: k == l # optional - sage.rings.number_field + sage: k = K.residue_field(F[0][0]) # needs sage.rings.number_field + sage: l = K.residue_field(F[1][0]) # needs sage.rings.number_field + sage: k == l # needs sage.rings.number_field False sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -843,10 +851,10 @@ class ResidueField_generic(Field): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x + 1) # optional - sage.rings.number_field - sage: hash(K.residue_field(K.prime_above(17))) # random # optional - sage.rings.number_field + sage: K. = NumberField(x^3 + x + 1) # needs sage.rings.number_field + sage: hash(K.residue_field(K.prime_above(17))) # random # needs sage.rings.number_field -6463132282686559142 - sage: hash(K.residue_field(K.prime_above(2^60))) # random # optional - sage.rings.number_field + sage: hash(K.residue_field(K.prime_above(2^60))) # random # needs sage.rings.number_field -6939519969600666586 sage: R. = GF(13)[] sage: hash(R.residue_field(t + 2)) # random @@ -864,11 +872,11 @@ cdef class ReductionMap(Map): EXAMPLES:: - sage: I = QQ[sqrt(17)].factor(5)[0][0]; I # optional - sage.rings.number_field sage.symbolic + sage: I = QQ[sqrt(17)].factor(5)[0][0]; I # needs sage.rings.number_field sage.symbolic Fractional ideal (5) - sage: k = I.residue_field(); k # optional - sage.rings.number_field sage.symbolic + sage: k = I.residue_field(); k # needs sage.rings.number_field sage.symbolic Residue field in sqrt17bar of Fractional ideal (5) - sage: R = k.reduction_map(); R # optional - sage.rings.number_field sage.symbolic + sage: R = k.reduction_map(); R # needs sage.rings.number_field sage.symbolic Partially defined reduction map: From: Number Field in sqrt17 with defining polynomial x^2 - 17 with sqrt17 = 4.123105625617660? @@ -890,23 +898,23 @@ cdef class ReductionMap(Map): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x^2 - 2*x + 8) # optional - sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # optional - sage.rings.number_field - sage: F.reduction_map() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 + x^2 - 2*x + 8) # needs sage.rings.number_field + sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field + sage: F.reduction_map() # needs sage.rings.number_field Partially defined reduction map: From: Number Field in a with defining polynomial x^3 + x^2 - 2*x + 8 To: Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1) - sage: K. = CyclotomicField(5) # optional - sage.rings.number_field - sage: F = K.factor(7)[0][0].residue_field() # optional - sage.rings.number_field - sage: F.reduction_map() # optional - sage.rings.number_field + sage: K. = CyclotomicField(5) # needs sage.rings.number_field + sage: F = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field + sage: F.reduction_map() # needs sage.rings.number_field Partially defined reduction map: From: Cyclotomic Field of order 5 and degree 4 To: Residue field in theta_5bar of Fractional ideal (7) sage: R. = GF(2)[]; P = R.ideal(t^7 + t^6 + t^5 + t^4 + 1) sage: k = P.residue_field() - sage: k.reduction_map() # optional - sage.libs.ntl + sage: k.reduction_map() # needs sage.libs.ntl Partially defined reduction map: From: Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X) @@ -932,17 +940,17 @@ cdef class ReductionMap(Map): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # optional - sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # optional - sage.rings.number_field - sage: r = F.reduction_map() # optional - sage.rings.number_field - sage: cr = copy(r) # indirect doctest # optional - sage.rings.number_field - sage: cr # optional - sage.rings.number_field + sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field + sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field + sage: r = F.reduction_map() # needs sage.rings.number_field + sage: cr = copy(r) # indirect doctest # needs sage.rings.number_field + sage: cr # needs sage.rings.number_field Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 To: Residue field of Fractional ideal (a + 1) - sage: cr == r # todo: comparison not implemented # optional - sage.rings.number_field + sage: cr == r # not implemented # needs sage.rings.number_field True - sage: r(2 + a) == cr(2 + a) # optional - sage.rings.number_field + sage: r(2 + a) == cr(2 + a) # needs sage.rings.number_field True """ slots = Map._extra_slots(self) @@ -962,17 +970,17 @@ cdef class ReductionMap(Map): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # optional - sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # optional - sage.rings.number_field - sage: r = F.reduction_map() # optional - sage.rings.number_field - sage: cr = copy(r) # indirect doctest # optional - sage.rings.number_field - sage: cr # optional - sage.rings.number_field + sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field + sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field + sage: r = F.reduction_map() # needs sage.rings.number_field + sage: cr = copy(r) # indirect doctest # needs sage.rings.number_field + sage: cr # needs sage.rings.number_field Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 To: Residue field of Fractional ideal (a + 1) - sage: cr == r # todo: comparison not implemented # optional - sage.rings.number_field + sage: cr == r # not implemented # needs sage.rings.number_field True - sage: r(2 + a) == cr(2 + a) # optional - sage.rings.number_field + sage: r(2 + a) == cr(2 + a) # needs sage.rings.number_field True """ Map._update_slots(self, _slots) @@ -995,19 +1003,19 @@ cdef class ReductionMap(Map): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # optional - sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # optional - sage.rings.number_field - sage: r = F.reduction_map(); r # optional - sage.rings.number_field + sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field + sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field + sage: r = F.reduction_map(); r # needs sage.rings.number_field Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 To: Residue field of Fractional ideal (a + 1) We test that calling the function also works after copying:: - sage: r = copy(r) # optional - sage.rings.number_field - sage: r(2 + a) # indirect doctest # optional - sage.rings.number_field + sage: r = copy(r) # needs sage.rings.number_field + sage: r(2 + a) # indirect doctest # needs sage.rings.number_field 1 - sage: r(a/2) # optional - sage.rings.number_field + sage: r(a/2) # needs sage.rings.number_field Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element 1/2*a @@ -1029,22 +1037,23 @@ cdef class ReductionMap(Map): An example to show that the issue raised in :trac:`1951` has been fixed:: - sage: K. = NumberField(x^2 + 1) # optional - sage.rings.number_field - sage: P1, P2 = [g[0] for g in K.factor(5)]; P1, P2 # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = NumberField(x^2 + 1) + sage: P1, P2 = [g[0] for g in K.factor(5)]; P1, P2 (Fractional ideal (-i - 2), Fractional ideal (2*i + 1)) - sage: a = 1/(1+2*i) # optional - sage.rings.number_field - sage: F1, F2 = [g.residue_field() for g in [P1,P2]]; F1, F2 # optional - sage.rings.number_field + sage: a = 1/(1+2*i) + sage: F1, F2 = [g.residue_field() for g in [P1,P2]]; F1, F2 (Residue field of Fractional ideal (-i - 2), Residue field of Fractional ideal (2*i + 1)) - sage: a.valuation(P1) # optional - sage.rings.number_field + sage: a.valuation(P1) 0 - sage: F1(i/7) # optional - sage.rings.number_field + sage: F1(i/7) 4 - sage: F1(a) # optional - sage.rings.number_field + sage: F1(a) 3 - sage: a.valuation(P2) # optional - sage.rings.number_field + sage: a.valuation(P2) -1 - sage: F2(a) # optional - sage.rings.number_field + sage: F2(a) Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element -2/5*i + 1/5 @@ -1107,26 +1116,26 @@ cdef class ReductionMap(Map): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^5 - 5*x + 2) # optional - sage.rings.number_field - sage: P = K.ideal(47).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: f = k.convert_map_from(K) # optional - sage.rings.number_field - sage: s = f.section(); s # optional - sage.rings.number_field + sage: K. = NumberField(x^5 - 5*x + 2) # needs sage.rings.number_field + sage: P = K.ideal(47).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: f = k.convert_map_from(K) # needs sage.rings.number_field + sage: s = f.section(); s # needs sage.rings.number_field Lifting map: From: Residue field in abar of Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) To: Number Field in a with defining polynomial x^5 - 5*x + 2 - sage: s(k.gen()) # optional - sage.rings.number_field + sage: s(k.gen()) # needs sage.rings.number_field a - sage: L. = NumberField(x^5 + 17*x + 1) # optional - sage.rings.number_field - sage: P = L.factor(53)[0][0] # optional - sage.rings.number_field - sage: l = L.residue_field(P) # optional - sage.rings.number_field - sage: g = l.convert_map_from(L) # optional - sage.rings.number_field - sage: s = g.section(); s # optional - sage.rings.number_field + sage: L. = NumberField(x^5 + 17*x + 1) # needs sage.rings.number_field + sage: P = L.factor(53)[0][0] # needs sage.rings.number_field + sage: l = L.residue_field(P) # needs sage.rings.number_field + sage: g = l.convert_map_from(L) # needs sage.rings.number_field + sage: s = g.section(); s # needs sage.rings.number_field Lifting map: From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8) To: Number Field in b with defining polynomial x^5 + 17*x + 1 - sage: s(l.gen()).parent() # optional - sage.rings.number_field + sage: s(l.gen()).parent() # needs sage.rings.number_field Number Field in b with defining polynomial x^5 + 17*x + 1 sage: R. = GF(2)[]; h = t^5 + t^2 + 1 @@ -1153,22 +1162,22 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: abar = k(OK.1); abar # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: abar = k(OK.1); abar # needs sage.rings.number_field abar - sage: (1+abar)^179 # optional - sage.rings.number_field + sage: (1+abar)^179 # needs sage.rings.number_field 24*abar + 12 - sage: phi = k.coerce_map_from(OK); phi # optional - sage.rings.number_field + sage: phi = k.coerce_map_from(OK); phi # needs sage.rings.number_field Ring morphism: From: Maximal Order in Number Field in a with defining polynomial x^3 - 7 To: Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) - sage: phi in Hom(OK,k) # optional - sage.rings.number_field + sage: phi in Hom(OK,k) # needs sage.rings.number_field True - sage: phi(OK.1) # optional - sage.rings.number_field + sage: phi(OK.1) # needs sage.rings.number_field abar sage: R. = GF(19)[]; P = R.ideal(t^2 + 5) @@ -1195,17 +1204,18 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): We create a residue field homomorphism:: - sage: K. = CyclotomicField(5) # optional - sage.rings.number_field - sage: P = K.factor(7)[0][0] # optional - sage.rings.number_field - sage: P.residue_class_degree() # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(5) + sage: P = K.factor(7)[0][0] + sage: P.residue_class_degree() 4 - sage: kk. = P.residue_field(); kk # optional - sage.rings.number_field + sage: kk. = P.residue_field(); kk Residue field in a of Fractional ideal (7) - sage: phi = kk.coerce_map_from(K.maximal_order()); phi # optional - sage.rings.number_field + sage: phi = kk.coerce_map_from(K.maximal_order()); phi Ring morphism: From: Maximal Order in Cyclotomic Field of order 5 and degree 4 To: Residue field in a of Fractional ideal (7) - sage: type(phi) # optional - sage.rings.number_field + sage: type(phi) sage: R. = GF(2)[]; P = R.ideal(t^7 + t^6 + t^5 + t^4 + 1) @@ -1229,18 +1239,18 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - x + 8) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: phi = k.coerce_map_from(OK) # optional - sage.rings.number_field - sage: psi = copy(phi); psi # indirect doctest # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - x + 8) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: phi = k.coerce_map_from(OK) # needs sage.rings.number_field + sage: psi = copy(phi); psi # indirect doctest # needs sage.rings.number_field Ring morphism: From: Maximal Order in Number Field in a with defining polynomial x^3 - x + 8 To: Residue field in abar of Fractional ideal (29) - sage: psi == phi # todo: comparison not implemented # optional - sage.rings.number_field + sage: psi == phi # not implemented # needs sage.rings.number_field True - sage: psi(OK.an_element()) == phi(OK.an_element()) # optional - sage.rings.number_field + sage: psi(OK.an_element()) == phi(OK.an_element()) # needs sage.rings.number_field True """ slots = RingHomomorphism._extra_slots(self) @@ -1260,18 +1270,18 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - x + 8) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: phi = k.coerce_map_from(OK) # optional - sage.rings.number_field - sage: psi = copy(phi); psi # indirect doctest # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - x + 8) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: phi = k.coerce_map_from(OK) # needs sage.rings.number_field + sage: psi = copy(phi); psi # indirect doctest # needs sage.rings.number_field Ring morphism: From: Maximal Order in Number Field in a with defining polynomial x^3 - x + 8 To: Residue field in abar of Fractional ideal (29) - sage: psi == phi # todo: comparison not implemented # optional - sage.rings.number_field + sage: psi == phi # not implemented # needs sage.rings.number_field True - sage: psi(OK.an_element()) == phi(OK.an_element()) # optional - sage.rings.number_field + sage: psi(OK.an_element()) == phi(OK.an_element()) # needs sage.rings.number_field True """ RingHomomorphism._update_slots(self, _slots) @@ -1290,11 +1300,11 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - x + 8) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: k.coerce_map_from(OK)(OK(a)^7) # indirect doctest # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - x + 8) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: k.coerce_map_from(OK)(OK(a)^7) # indirect doctest # needs sage.rings.number_field 13*abar^2 + 7*abar + 21 sage: R. = GF(next_prime(2^18))[]; P = R.ideal(t - 71) @@ -1330,27 +1340,27 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^5 - 5*x + 2) # optional - sage.rings.number_field - sage: P = K.ideal(47).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: f = k.coerce_map_from(K.ring_of_integers()) # optional - sage.rings.number_field - sage: s = f.section(); s # optional - sage.rings.number_field + sage: K. = NumberField(x^5 - 5*x + 2) # needs sage.rings.number_field + sage: P = K.ideal(47).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: f = k.coerce_map_from(K.ring_of_integers()) # needs sage.rings.number_field + sage: s = f.section(); s # needs sage.rings.number_field Lifting map: From: Residue field in abar of Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) To: Maximal Order in Number Field in a with defining polynomial x^5 - 5*x + 2 - sage: s(k.gen()) + sage: s(k.gen()) # needs sage.rings.number_field a - sage: L. = NumberField(x^5 + 17*x + 1) # optional - sage.rings.number_field - sage: P = L.factor(53)[0][0] # optional - sage.rings.number_field - sage: l = L.residue_field(P) # optional - sage.rings.number_field - sage: g = l.coerce_map_from(L.ring_of_integers()) # optional - sage.rings.number_field - sage: s = g.section(); s # optional - sage.rings.number_field + sage: L. = NumberField(x^5 + 17*x + 1) # needs sage.rings.number_field + sage: P = L.factor(53)[0][0] # needs sage.rings.number_field + sage: l = L.residue_field(P) # needs sage.rings.number_field + sage: g = l.coerce_map_from(L.ring_of_integers()) # needs sage.rings.number_field + sage: s = g.section(); s # needs sage.rings.number_field Lifting map: From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8) To: Maximal Order in Number Field in b with defining polynomial x^5 + 17*x + 1 - sage: s(l.gen()).parent() # optional - sage.rings.number_field + sage: s(l.gen()).parent() # needs sage.rings.number_field Maximal Order in Number Field in b with defining polynomial x^5 + 17*x + 1 sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -1375,16 +1385,16 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: f = k.coerce_map_from(OK) # optional - sage.rings.number_field - sage: c = OK(a) # optional - sage.rings.number_field - sage: b = k(a) # optional - sage.rings.number_field - sage: f.lift(13*b + 5) # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: f = k.coerce_map_from(OK) # needs sage.rings.number_field + sage: c = OK(a) # needs sage.rings.number_field + sage: b = k(a) # needs sage.rings.number_field + sage: f.lift(13*b + 5) # needs sage.rings.number_field 13*a + 5 - sage: f.lift(12821*b + 918) # optional - sage.rings.number_field + sage: f.lift(12821*b + 918) # needs sage.rings.number_field 3*a + 19 sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -1406,17 +1416,17 @@ cdef class LiftingMap(Section): EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + 2) # optional - sage.rings.number_field - sage: F = K.factor(5)[0][0].residue_field() # optional - sage.rings.number_field - sage: F.degree() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 + 2) # needs sage.rings.number_field + sage: F = K.factor(5)[0][0].residue_field() # needs sage.rings.number_field + sage: F.degree() # needs sage.rings.number_field 2 - sage: L = F.lift_map(); L # optional - sage.rings.number_field + sage: L = F.lift_map(); L # needs sage.rings.number_field Lifting map: From: Residue field in abar of Fractional ideal (a^2 + 2*a - 1) To: Maximal Order in Number Field in a with defining polynomial x^3 + 2 - sage: L(F.0^2) # optional - sage.rings.number_field + sage: L(F.0^2) # needs sage.rings.number_field 3*a + 1 - sage: L(3*a + 1) == F.0^2 # optional - sage.rings.number_field + sage: L(3*a + 1) == F.0^2 # needs sage.rings.number_field True sage: R. = GF(13)[] @@ -1436,31 +1446,32 @@ cdef class LiftingMap(Section): EXAMPLES:: - sage: K. = CyclotomicField(5) # optional - sage.rings.number_field - sage: F = K.factor(7)[0][0].residue_field() # optional - sage.rings.number_field - sage: F.lift_map() # optional - sage.rings.number_field + sage: K. = CyclotomicField(5) # needs sage.rings.number_field + sage: F = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field + sage: F.lift_map() # needs sage.rings.number_field Lifting map: From: Residue field in theta_5bar of Fractional ideal (7) To: Maximal Order in Cyclotomic Field of order 5 and degree 4 sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^5 + 2) # optional - sage.rings.number_field - sage: F = K.factor(7)[0][0].residue_field() # optional - sage.rings.number_field - sage: L = F.lift_map(); L # optional - sage.rings.number_field + sage: K. = NumberField(x^5 + 2) # needs sage.rings.number_field + sage: F = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field + sage: L = F.lift_map(); L # needs sage.rings.number_field Lifting map: From: Residue field in abar of Fractional ideal (2*a^4 - a^3 + 4*a^2 - 2*a + 1) To: Maximal Order in Number Field in a with defining polynomial x^5 + 2 - sage: L.domain() # optional - sage.rings.number_field + sage: L.domain() # needs sage.rings.number_field Residue field in abar of Fractional ideal (2*a^4 - a^3 + 4*a^2 - 2*a + 1) - sage: K. = CyclotomicField(7) # optional - sage.rings.number_field - sage: F = K.factor(5)[0][0].residue_field() # optional - sage.rings.number_field - sage: L = F.lift_map(); L # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(7) + sage: F = K.factor(5)[0][0].residue_field() + sage: L = F.lift_map(); L Lifting map: From: Residue field in abar of Fractional ideal (5) To: Maximal Order in Cyclotomic Field of order 7 and degree 6 - sage: L.codomain() # optional - sage.rings.number_field + sage: L.codomain() Maximal Order in Cyclotomic Field of order 7 and degree 6 sage: R. = GF(2)[]; h = t^5 + t^2 + 1 @@ -1481,16 +1492,17 @@ cdef class LiftingMap(Section): EXAMPLES:: - sage: K. = CyclotomicField(7) # optional - sage.rings.number_field - sage: F = K.factor(5)[0][0].residue_field() # optional - sage.rings.number_field - sage: phi = F.lift_map() # optional - sage.rings.number_field - sage: psi = copy(phi); psi # indirect doctest # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(7) + sage: F = K.factor(5)[0][0].residue_field() + sage: phi = F.lift_map() + sage: psi = copy(phi); psi # indirect doctest Lifting map: From: Residue field in abar of Fractional ideal (5) To: Maximal Order in Cyclotomic Field of order 7 and degree 6 - sage: psi == phi # todo: comparison not implemented # optional - sage.rings.number_field + sage: psi == phi # not implemented False - sage: phi(F.0) == psi(F.0) # optional - sage.rings.number_field + sage: phi(F.0) == psi(F.0) True """ slots = Section._extra_slots(self) @@ -1506,16 +1518,17 @@ cdef class LiftingMap(Section): EXAMPLES:: - sage: K. = CyclotomicField(7) # optional - sage.rings.number_field - sage: F = K.factor(5)[0][0].residue_field() # optional - sage.rings.number_field - sage: phi = F.lift_map() # optional - sage.rings.number_field - sage: psi = copy(phi); psi # indirect doctest # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(7) + sage: F = K.factor(5)[0][0].residue_field() + sage: phi = F.lift_map() + sage: psi = copy(phi); psi # indirect doctest Lifting map: From: Residue field in abar of Fractional ideal (5) To: Maximal Order in Cyclotomic Field of order 7 and degree 6 - sage: psi == phi # todo: comparison not implemented # optional - sage.rings.number_field + sage: psi == phi # not implemented False - sage: phi(F.0) == psi(F.0) # optional - sage.rings.number_field + sage: phi(F.0) == psi(F.0) True """ Section._update_slots(self, _slots) @@ -1530,15 +1543,16 @@ cdef class LiftingMap(Section): EXAMPLES:: - sage: K. = CyclotomicField(7) # optional - sage.rings.number_field - sage: F = K.factor(5)[0][0].residue_field() # optional - sage.rings.number_field - sage: L = F.lift_map(); L # optional - sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(7) + sage: F = K.factor(5)[0][0].residue_field() + sage: L = F.lift_map(); L Lifting map: From: Residue field in abar of Fractional ideal (5) To: Maximal Order in Cyclotomic Field of order 7 and degree 6 - sage: L(F.0) # indirect doctest # optional - sage.rings.number_field + sage: L(F.0) # indirect doctest a - sage: F(a) # optional - sage.rings.number_field + sage: F(a) abar sage: R. = GF(2)[]; h = t^5 + t^2 + 1 @@ -1572,9 +1586,9 @@ cdef class LiftingMap(Section): """ EXAMPLES:: - sage: K. = CyclotomicField(12) # optional - sage.rings.number_field - sage: F. = K.factor(7)[0][0].residue_field() # optional - sage.rings.number_field - sage: F.lift_map() #indirect doctest # optional - sage.rings.number_field + sage: K. = CyclotomicField(12) # needs sage.rings.number_field + sage: F. = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field + sage: F.lift_map() #indirect doctest # needs sage.rings.number_field Lifting map: From: Residue field in tmod of Fractional ideal (theta_12^2 + 2) To: Maximal Order in Cyclotomic Field of order 12 and degree 4 @@ -1589,23 +1603,22 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[1][0] # optional - sage.rings.number_field - sage: k = ResidueField(P) # optional - sage.rings.number_field - sage: k # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[1][0] # needs sage.rings.number_field + sage: k = ResidueField(P); k # needs sage.rings.number_field Residue field of Fractional ideal (-a^2 - 2*a - 2) - sage: k.order() # optional - sage.rings.number_field + sage: k.order() # needs sage.rings.number_field 29 - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: c = OK(a) # optional - sage.rings.number_field - sage: b = k(a) # optional - sage.rings.number_field - sage: k.coerce_map_from(OK)(c) # optional - sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: c = OK(a) # needs sage.rings.number_field + sage: b = k(a) # needs sage.rings.number_field + sage: k.coerce_map_from(OK)(c) # needs sage.rings.number_field 16 - sage: k(4) # optional - sage.rings.number_field + sage: k(4) # needs sage.rings.number_field 4 - sage: k(c + 5) # optional - sage.rings.number_field + sage: k(c + 5) # needs sage.rings.number_field 21 - sage: b + c # optional - sage.rings.number_field + sage: b + c # needs sage.rings.number_field 3 sage: R. = GF(7)[]; P = R.ideal(2*t + 3) @@ -1631,9 +1644,9 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn EXAMPLES:: - sage: K. = QuadraticField(-1) # optional - sage.rings.number_field - sage: kk = ResidueField(K.factor(5)[0][0]) # optional - sage.rings.number_field - sage: type(kk) # optional - sage.rings.number_field + sage: K. = QuadraticField(-1) # needs sage.rings.number_field + sage: kk = ResidueField(K.factor(5)[0][0]) # needs sage.rings.number_field + sage: type(kk) # needs sage.rings.number_field sage: R. = GF(7)[]; P = R.ideal(2*t + 3) @@ -1676,21 +1689,21 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[1][0] # optional - sage.rings.number_field - sage: k = ResidueField(P) # optional - sage.rings.number_field - sage: k # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[1][0] # needs sage.rings.number_field + sage: k = ResidueField(P) # needs sage.rings.number_field + sage: k # needs sage.rings.number_field Residue field of Fractional ideal (-a^2 - 2*a - 2) - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: c = OK(a) # optional - sage.rings.number_field - sage: b = k(a); b # optional - sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: c = OK(a) # needs sage.rings.number_field + sage: b = k(a); b # needs sage.rings.number_field 16 - sage: k(2r) # optional - sage.rings.number_field + sage: k(2r) # needs sage.rings.number_field 2 - sage: V = k.vector_space(map=False); v = V([3]) # optional - sage.rings.number_field - sage: type(k.convert_map_from(V)) # optional - sage.rings.number_field + sage: V = k.vector_space(map=False); v = V([3]) # needs sage.rings.number_field + sage: type(k.convert_map_from(V)) # needs sage.rings.number_field - sage: k(v) # indirect doctest # optional - sage.rings.number_field + sage: k(v) # indirect doctest # needs sage.rings.number_field 3 sage: R. = GF(2)[]; P = R.ideal(t + 1); k. = P.residue_field() diff --git a/src/sage/rings/finite_rings/residue_field_givaro.pyx b/src/sage/rings/finite_rings/residue_field_givaro.pyx index 32a133a9f0b..7b9510a1dbe 100644 --- a/src/sage/rings/finite_rings/residue_field_givaro.pyx +++ b/src/sage/rings/finite_rings/residue_field_givaro.pyx @@ -34,17 +34,17 @@ class ResidueFiniteField_givaro(ResidueField_generic, FiniteField_givaro): EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: k.degree() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: k.degree() # needs sage.rings.number_field 2 - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: c = OK(a) # optional - sage.rings.number_field - sage: b = k(c) # optional - sage.rings.number_field - sage: b*c^2 # optional - sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: c = OK(a) # needs sage.rings.number_field + sage: b = k(c) # needs sage.rings.number_field + sage: b*c^2 # needs sage.rings.number_field 7 - sage: b*c # optional - sage.rings.number_field + sage: b*c # needs sage.rings.number_field 13*abar + 5 sage: R. = GF(7)[]; P = R.ideal(t^2 + 4) @@ -75,9 +75,9 @@ class ResidueFiniteField_givaro(ResidueField_generic, FiniteField_givaro): EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^4 + 3*x^2 - 17) # optional - sage.rings.number_field - sage: P = K.ideal(61).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field + sage: K. = NumberField(x^4 + 3*x^2 - 17) # needs sage.rings.number_field + sage: P = K.ideal(61).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field sage: R. = GF(3)[]; P = R.ideal(t^4 - t^3 + t + 1); k. = P.residue_field(); type(k) @@ -108,15 +108,15 @@ class ResidueFiniteField_givaro(ResidueField_generic, FiniteField_givaro): EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^4 + 3*x^2 - 17) # optional - sage.rings.number_field - sage: P = K.ideal(61).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: k(77*a^7 + 4) # optional - sage.rings.number_field + sage: K. = NumberField(x^4 + 3*x^2 - 17) # needs sage.rings.number_field + sage: P = K.ideal(61).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: k(77*a^7 + 4) # needs sage.rings.number_field 2*abar + 4 - sage: V = k.vector_space(map=False); v = V([3,-2]) # optional - sage.rings.number_field - sage: type(k.convert_map_from(V)) + sage: V = k.vector_space(map=False); v = V([3,-2]) # needs sage.rings.number_field + sage: type(k.convert_map_from(V)) # needs sage.rings.number_field - sage: k(v) # indirect doctest + sage: k(v) # indirect doctest # needs sage.rings.number_field 59*abar + 3 sage: R. = GF(3)[]; P = R.ideal(t^4 - t^3 + t + 1); k. = P.residue_field() diff --git a/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx b/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx index c9fcfa50f07..57ec926e332 100644 --- a/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx +++ b/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx @@ -35,17 +35,17 @@ class ResidueFiniteField_ntl_gf2e(ResidueField_generic, FiniteField_ntl_gf2e): EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: k.degree() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: k.degree() # needs sage.rings.number_field 2 - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: c = OK(a) # optional - sage.rings.number_field - sage: b = k(c) # optional - sage.rings.number_field - sage: b*c^2 # optional - sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: c = OK(a) # needs sage.rings.number_field + sage: b = k(c) # needs sage.rings.number_field + sage: b*c^2 # needs sage.rings.number_field 7 - sage: b*c # optional - sage.rings.number_field + sage: b*c # needs sage.rings.number_field 13*abar + 5 sage: R. = GF(2)[]; P = R.ideal(t^19 + t^5 + t^2 + t + 1) @@ -80,9 +80,9 @@ class ResidueFiniteField_ntl_gf2e(ResidueField_generic, FiniteField_ntl_gf2e): EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^4 + 3*x^2 - 17) # optional - sage.rings.number_field - sage: P = K.ideal(61).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field + sage: K. = NumberField(x^4 + 3*x^2 - 17) # needs sage.rings.number_field + sage: P = K.ideal(61).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field sage: R. = GF(3)[]; P = R.ideal(t^4 - t^3 + t + 1); k. = P.residue_field(); type(k) @@ -113,15 +113,15 @@ class ResidueFiniteField_ntl_gf2e(ResidueField_generic, FiniteField_ntl_gf2e): EXAMPLES:: sage: R. = QQ[] - sage: K. = NumberField(x^4 + 3*x^2 - 17) # optional - sage.rings.number_field - sage: P = K.ideal(61).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: k(77*a^7 + 4) # optional - sage.rings.number_field + sage: K. = NumberField(x^4 + 3*x^2 - 17) # needs sage.rings.number_field + sage: P = K.ideal(61).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: k(77*a^7 + 4) # needs sage.rings.number_field 2*abar + 4 - sage: V = k.vector_space(map=False); v = V([3,-2]) # optional - sage.rings.number_field - sage: type(k.convert_map_from(V)) # optional - sage.rings.number_field + sage: V = k.vector_space(map=False); v = V([3,-2]) # needs sage.rings.number_field + sage: type(k.convert_map_from(V)) # needs sage.rings.number_field - sage: k(v) # indirect doctest # optional - sage.rings.number_field + sage: k(v) # indirect doctest # needs sage.rings.number_field 59*abar + 3 sage: R. = GF(3)[]; P = R.ideal(t^4 - t^3 + t + 1); k. = P.residue_field() diff --git a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx index f4e6ee10b1c..8a19efd0d2a 100644 --- a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx +++ b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx @@ -34,19 +34,19 @@ class ResidueFiniteField_pari_ffelt(ResidueField_generic, FiniteField_pari_ffelt EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # optional - sage.rings.number_field - sage: P = K.ideal(923478923).factor()[0][0] # optional - sage.rings.number_field - sage: k = K.residue_field(P) # optional - sage.rings.number_field - sage: k.degree() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field + sage: P = K.ideal(923478923).factor()[0][0] # needs sage.rings.number_field + sage: k = K.residue_field(P) # needs sage.rings.number_field + sage: k.degree() # needs sage.rings.number_field 2 - sage: OK = K.maximal_order() # optional - sage.rings.number_field - sage: c = OK(a) # optional - sage.rings.number_field - sage: b = k(c) # optional - sage.rings.number_field - sage: b + c # optional - sage.rings.number_field + sage: OK = K.maximal_order() # needs sage.rings.number_field + sage: c = OK(a) # needs sage.rings.number_field + sage: b = k(c) # needs sage.rings.number_field + sage: b + c # needs sage.rings.number_field 2*abar - sage: b*c # optional - sage.rings.number_field + sage: b*c # needs sage.rings.number_field 664346875*abar + 535606347 - sage: k.base_ring() # optional - sage.rings.number_field + sage: k.base_ring() # needs sage.rings.number_field Finite Field of size 923478923 sage: R. = GF(5)[] @@ -95,22 +95,22 @@ class ResidueFiniteField_pari_ffelt(ResidueField_generic, FiniteField_pari_ffelt EXAMPLES:: sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 2) # optional - sage.rings.number_field - sage: P = K.factor(10007)[0][0] # optional - sage.rings.number_field - sage: P.residue_class_degree() # optional - sage.rings.number_field + sage: K. = NumberField(x^3 - 2) # needs sage.rings.number_field + sage: P = K.factor(10007)[0][0] # needs sage.rings.number_field + sage: P.residue_class_degree() # needs sage.rings.number_field 2 - sage: ff. = P.residue_field(); ff # optional - sage.rings.number_field + sage: ff. = P.residue_field(); ff # needs sage.rings.number_field Residue field in alpha of Fractional ideal (-12*aa^2 + 189*aa - 475) - sage: type(ff) # optional - sage.rings.number_field + sage: type(ff) # needs sage.rings.number_field - sage: ff(alpha^2 + 1) # optional - sage.rings.number_field + sage: ff(alpha^2 + 1) # needs sage.rings.number_field 7521*alpha + 4131 - sage: ff(17/3) # optional - sage.rings.number_field + sage: ff(17/3) # needs sage.rings.number_field 6677 - sage: V = ff.vector_space(map=False); v = V([3,-2]) # optional - sage.rings.number_field - sage: type(ff.convert_map_from(V)) # optional - sage.rings.number_field + sage: V = ff.vector_space(map=False); v = V([3,-2]) # needs sage.rings.number_field + sage: type(ff.convert_map_from(V)) # needs sage.rings.number_field - sage: ff(v) # indirect doctest # optional - sage.rings.number_field + sage: ff(v) # indirect doctest # needs sage.rings.number_field 10005*alpha + 3 sage: R. = GF(5)[]; P = R.ideal(4*t^12 + 3*t^11 + 4*t^10 + t^9 + t^8 + 3*t^7 + 2*t^6 + 3*t^4 + t^3 + 3*t^2 + 2) From a04dbbc4efafca835e22fde4a868cae573ad8d51 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 15 Jul 2023 16:09:28 -0700 Subject: [PATCH 11/23] src/sage/rings/finite_rings/conway_polynomials.py: Use lazy_import for sage.databases.conway --- src/sage/rings/finite_rings/conway_polynomials.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/finite_rings/conway_polynomials.py b/src/sage/rings/finite_rings/conway_polynomials.py index d947fa25cc8..80aae30f334 100644 --- a/src/sage/rings/finite_rings/conway_polynomials.py +++ b/src/sage/rings/finite_rings/conway_polynomials.py @@ -11,10 +11,13 @@ """ from sage.misc.fast_methods import WithEqualityById +from sage.misc.lazy_import import lazy_import from sage.structure.sage_object import SageObject from sage.rings.finite_rings.finite_field_constructor import FiniteField from sage.rings.integer import Integer -import sage.databases.conway + +lazy_import('sage.databases.conway', 'ConwayPolynomials') + def conway_polynomial(p, n): """ @@ -57,7 +60,7 @@ def conway_polynomial(p, n): (p, n) = (int(p), int(n)) R = FiniteField(p)['x'] try: - return R(sage.databases.conway.ConwayPolynomials()[p][n]) + return R(ConwayPolynomials()[p][n]) except KeyError: raise RuntimeError("requested Conway polynomial not in database.") @@ -91,7 +94,7 @@ def exists_conway_polynomial(p, n): sage: exists_conway_polynomial(6,6) False """ - return sage.databases.conway.ConwayPolynomials().has_polynomial(p,n) + return ConwayPolynomials().has_polynomial(p,n) class PseudoConwayLattice(WithEqualityById, SageObject): r""" @@ -171,7 +174,7 @@ def __init__(self, p, use_database=True): from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing self.ring = PolynomialRing(FiniteField(p), 'x') if use_database: - C = sage.databases.conway.ConwayPolynomials() + C = ConwayPolynomials() self.nodes = {n: self.ring(C.polynomial(p, n)) for n in C.degrees(p)} else: From e78d4ea20b0fa012c8e6f45f42e1b67961e8cc7b Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 15 Jul 2023 23:55:19 -0700 Subject: [PATCH 12/23] sage.rings: Update # needs --- .../finite_rings/finite_field_constructor.py | 4 +- src/sage/rings/finite_rings/residue_field.pyx | 266 ++++++++++-------- .../finite_rings/residue_field_pari_ffelt.pyx | 42 +-- 3 files changed, 166 insertions(+), 146 deletions(-) diff --git a/src/sage/rings/finite_rings/finite_field_constructor.py b/src/sage/rings/finite_rings/finite_field_constructor.py index 0ea8a3b0805..e65fae97f4c 100644 --- a/src/sage/rings/finite_rings/finite_field_constructor.py +++ b/src/sage/rings/finite_rings/finite_field_constructor.py @@ -437,8 +437,8 @@ class FiniteFieldFactory(UniqueFactory): Using pseudo-Conway polynomials is slow for highly composite extension degrees:: - sage: k = GF(3^120) # long time -- about 3 seconds - sage: GF(3^40).gen().minimal_polynomial()(k.gen()^((3^120-1)/(3^40-1))) # long time because of previous line + sage: k = GF(3^120) # long time (about 3 seconds) + sage: GF(3^40).gen().minimal_polynomial()(k.gen()^((3^120-1)/(3^40-1))) # long time (because of previous line) 0 Before :trac:`17569`, the boolean keyword argument ``conway`` diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 598ca88d122..d2d0cfeac8f 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -7,12 +7,13 @@ polynomials over `GF(p)`. EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P); k # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P); k Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) - sage: k.order() # needs sage.rings.number_field + sage: k.order() 841 We reduce mod a prime for which the ring of integers is not @@ -559,16 +560,17 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x + 1) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # indirect doctest # needs sage.rings.number_field - sage: k.ideal() is P # needs sage.rings.number_field + sage: K. = NumberField(x^3 + x + 1) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) # indirect doctest + sage: k.ideal() is P True - sage: p = next_prime(2^40); p # needs sage.rings.number_field + sage: p = next_prime(2^40); p 1099511627791 - sage: k = K.residue_field(K.prime_above(p)) # needs sage.rings.number_field - sage: k.ideal().norm() == p # needs sage.rings.number_field + sage: k = K.residue_field(K.prime_above(p)) + sage: k.ideal().norm() == p True sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -597,13 +599,14 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: from sage.rings.finite_rings.residue_field import ResidueField_generic sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field - sage: P = K.ideal(-3*i - 2) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: F = OK.residue_field(P) # needs sage.rings.number_field - sage: ResidueField_generic._element_constructor_(F, i) # needs sage.rings.number_field + sage: K. = NumberField(x^2 + 1) + sage: P = K.ideal(-3*i - 2) + sage: OK = K.maximal_order() + sage: F = OK.residue_field(P) + sage: ResidueField_generic._element_constructor_(F, i) 8 With :trac:`8800`, we also have:: @@ -644,12 +647,13 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field - sage: P = K.ideal(-3*i - 2) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: F = OK.residue_field(P) # needs sage.rings.number_field - sage: F.has_coerce_map_from(GF(13)) # indirect doctest # needs sage.rings.number_field + sage: K. = NumberField(x^2 + 1) + sage: P = K.ideal(-3*i - 2) + sage: OK = K.maximal_order() + sage: F = OK.residue_field(P) + sage: F.has_coerce_map_from(GF(13)) # indirect doctest True TESTS: @@ -700,16 +704,17 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: c = OK(a) # needs sage.rings.number_field - sage: b = k(a) # needs sage.rings.number_field - sage: k.lift(13*b + 5) # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: OK = K.maximal_order() + sage: c = OK(a) + sage: b = k(a) + sage: k.lift(13*b + 5) 13*a + 5 - sage: k.lift(12821*b + 918) # needs sage.rings.number_field + sage: k.lift(12821*b + 918) 3*a + 19 sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -747,14 +752,15 @@ class ResidueField_generic(Field): sage: pi.codomain() Residue field of Fractional ideal (a) + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x^2 - 2*x + 32) # needs sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field - sage: F.reduction_map().domain() # needs sage.rings.number_field + sage: K. = NumberField(x^3 + x^2 - 2*x + 32) + sage: F = K.factor(2)[0][0].residue_field() + sage: F.reduction_map().domain() Number Field in a with defining polynomial x^3 + x^2 - 2*x + 32 - sage: K. = NumberField(x^3 + 128) # needs sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field - sage: F.reduction_map().codomain() # needs sage.rings.number_field + sage: K. = NumberField(x^3 + 128) + sage: F = K.factor(2)[0][0].residue_field() + sage: F.reduction_map().codomain() Residue field of Fractional ideal (1/4*a) sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -817,13 +823,14 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 11) # needs sage.rings.number_field - sage: F = K.ideal(37).factor(); F # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 11) + sage: F = K.ideal(37).factor(); F (Fractional ideal (37, a + 9)) * (Fractional ideal (37, a + 12)) * (Fractional ideal (-2*a + 5)) - sage: k = K.residue_field(F[0][0]) # needs sage.rings.number_field - sage: l = K.residue_field(F[1][0]) # needs sage.rings.number_field - sage: k == l # needs sage.rings.number_field + sage: k = K.residue_field(F[0][0]) + sage: l = K.residue_field(F[1][0]) + sage: k == l False sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -939,18 +946,19 @@ cdef class ReductionMap(Map): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field - sage: r = F.reduction_map() # needs sage.rings.number_field - sage: cr = copy(r) # indirect doctest # needs sage.rings.number_field - sage: cr # needs sage.rings.number_field + sage: K. = NumberField(x^2 + 1) + sage: F = K.factor(2)[0][0].residue_field() + sage: r = F.reduction_map() + sage: cr = copy(r) # indirect doctest + sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 To: Residue field of Fractional ideal (a + 1) - sage: cr == r # not implemented # needs sage.rings.number_field + sage: cr == r # not implemented True - sage: r(2 + a) == cr(2 + a) # needs sage.rings.number_field + sage: r(2 + a) == cr(2 + a) True """ slots = Map._extra_slots(self) @@ -969,18 +977,19 @@ cdef class ReductionMap(Map): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field - sage: r = F.reduction_map() # needs sage.rings.number_field - sage: cr = copy(r) # indirect doctest # needs sage.rings.number_field - sage: cr # needs sage.rings.number_field + sage: K. = NumberField(x^2 + 1) + sage: F = K.factor(2)[0][0].residue_field() + sage: r = F.reduction_map() + sage: cr = copy(r) # indirect doctest + sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 To: Residue field of Fractional ideal (a + 1) - sage: cr == r # not implemented # needs sage.rings.number_field + sage: cr == r # not implemented True - sage: r(2 + a) == cr(2 + a) # needs sage.rings.number_field + sage: r(2 + a) == cr(2 + a) True """ Map._update_slots(self, _slots) @@ -1115,27 +1124,28 @@ cdef class ReductionMap(Map): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^5 - 5*x + 2) # needs sage.rings.number_field - sage: P = K.ideal(47).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: f = k.convert_map_from(K) # needs sage.rings.number_field - sage: s = f.section(); s # needs sage.rings.number_field + sage: K. = NumberField(x^5 - 5*x + 2) + sage: P = K.ideal(47).factor()[0][0] + sage: k = K.residue_field(P) + sage: f = k.convert_map_from(K) + sage: s = f.section(); s Lifting map: From: Residue field in abar of Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) To: Number Field in a with defining polynomial x^5 - 5*x + 2 - sage: s(k.gen()) # needs sage.rings.number_field + sage: s(k.gen()) a - sage: L. = NumberField(x^5 + 17*x + 1) # needs sage.rings.number_field - sage: P = L.factor(53)[0][0] # needs sage.rings.number_field - sage: l = L.residue_field(P) # needs sage.rings.number_field - sage: g = l.convert_map_from(L) # needs sage.rings.number_field - sage: s = g.section(); s # needs sage.rings.number_field + sage: L. = NumberField(x^5 + 17*x + 1) + sage: P = L.factor(53)[0][0] + sage: l = L.residue_field(P) + sage: g = l.convert_map_from(L) + sage: s = g.section(); s Lifting map: From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8) To: Number Field in b with defining polynomial x^5 + 17*x + 1 - sage: s(l.gen()).parent() # needs sage.rings.number_field + sage: s(l.gen()).parent() Number Field in b with defining polynomial x^5 + 17*x + 1 sage: R. = GF(2)[]; h = t^5 + t^2 + 1 @@ -1161,14 +1171,15 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: abar = k(OK.1); abar # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: OK = K.maximal_order() + sage: abar = k(OK.1); abar abar - sage: (1+abar)^179 # needs sage.rings.number_field + sage: (1+abar)^179 24*abar + 12 sage: phi = k.coerce_map_from(OK); phi # needs sage.rings.number_field @@ -1238,19 +1249,20 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - x + 8) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: phi = k.coerce_map_from(OK) # needs sage.rings.number_field - sage: psi = copy(phi); psi # indirect doctest # needs sage.rings.number_field + sage: K. = NumberField(x^3 - x + 8) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: OK = K.maximal_order() + sage: phi = k.coerce_map_from(OK) + sage: psi = copy(phi); psi # indirect doctest Ring morphism: From: Maximal Order in Number Field in a with defining polynomial x^3 - x + 8 To: Residue field in abar of Fractional ideal (29) - sage: psi == phi # not implemented # needs sage.rings.number_field + sage: psi == phi # not implemented True - sage: psi(OK.an_element()) == phi(OK.an_element()) # needs sage.rings.number_field + sage: psi(OK.an_element()) == phi(OK.an_element()) True """ slots = RingHomomorphism._extra_slots(self) @@ -1269,19 +1281,20 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - x + 8) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: phi = k.coerce_map_from(OK) # needs sage.rings.number_field - sage: psi = copy(phi); psi # indirect doctest # needs sage.rings.number_field + sage: K. = NumberField(x^3 - x + 8) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: OK = K.maximal_order() + sage: phi = k.coerce_map_from(OK) + sage: psi = copy(phi); psi # indirect doctest Ring morphism: From: Maximal Order in Number Field in a with defining polynomial x^3 - x + 8 To: Residue field in abar of Fractional ideal (29) - sage: psi == phi # not implemented # needs sage.rings.number_field + sage: psi == phi # not implemented True - sage: psi(OK.an_element()) == phi(OK.an_element()) # needs sage.rings.number_field + sage: psi(OK.an_element()) == phi(OK.an_element()) True """ RingHomomorphism._update_slots(self, _slots) @@ -1299,12 +1312,13 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - x + 8) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: k.coerce_map_from(OK)(OK(a)^7) # indirect doctest # needs sage.rings.number_field + sage: K. = NumberField(x^3 - x + 8) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: OK = K.maximal_order() + sage: k.coerce_map_from(OK)(OK(a)^7) # indirect doctest 13*abar^2 + 7*abar + 21 sage: R. = GF(next_prime(2^18))[]; P = R.ideal(t - 71) @@ -1339,28 +1353,29 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^5 - 5*x + 2) # needs sage.rings.number_field - sage: P = K.ideal(47).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: f = k.coerce_map_from(K.ring_of_integers()) # needs sage.rings.number_field - sage: s = f.section(); s # needs sage.rings.number_field + sage: K. = NumberField(x^5 - 5*x + 2) + sage: P = K.ideal(47).factor()[0][0] + sage: k = K.residue_field(P) + sage: f = k.coerce_map_from(K.ring_of_integers()) + sage: s = f.section(); s Lifting map: From: Residue field in abar of Fractional ideal (-14*a^4 + 24*a^3 + 26*a^2 - 58*a + 15) To: Maximal Order in Number Field in a with defining polynomial x^5 - 5*x + 2 - sage: s(k.gen()) # needs sage.rings.number_field + sage: s(k.gen()) a - sage: L. = NumberField(x^5 + 17*x + 1) # needs sage.rings.number_field - sage: P = L.factor(53)[0][0] # needs sage.rings.number_field - sage: l = L.residue_field(P) # needs sage.rings.number_field - sage: g = l.coerce_map_from(L.ring_of_integers()) # needs sage.rings.number_field - sage: s = g.section(); s # needs sage.rings.number_field + sage: L. = NumberField(x^5 + 17*x + 1) + sage: P = L.factor(53)[0][0] + sage: l = L.residue_field(P) + sage: g = l.coerce_map_from(L.ring_of_integers()) + sage: s = g.section(); s Lifting map: From: Residue field in bbar of Fractional ideal (53, b^2 + 23*b + 8) To: Maximal Order in Number Field in b with defining polynomial x^5 + 17*x + 1 - sage: s(l.gen()).parent() # needs sage.rings.number_field + sage: s(l.gen()).parent() Maximal Order in Number Field in b with defining polynomial x^5 + 17*x + 1 sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -1384,17 +1399,18 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: f = k.coerce_map_from(OK) # needs sage.rings.number_field - sage: c = OK(a) # needs sage.rings.number_field - sage: b = k(a) # needs sage.rings.number_field - sage: f.lift(13*b + 5) # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: OK = K.maximal_order() + sage: f = k.coerce_map_from(OK) + sage: c = OK(a) + sage: b = k(a) + sage: f.lift(13*b + 5) 13*a + 5 - sage: f.lift(12821*b + 918) # needs sage.rings.number_field + sage: f.lift(12821*b + 918) 3*a + 19 sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) @@ -1415,18 +1431,19 @@ cdef class LiftingMap(Section): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + 2) # needs sage.rings.number_field - sage: F = K.factor(5)[0][0].residue_field() # needs sage.rings.number_field - sage: F.degree() # needs sage.rings.number_field + sage: K. = NumberField(x^3 + 2) + sage: F = K.factor(5)[0][0].residue_field() + sage: F.degree() 2 - sage: L = F.lift_map(); L # needs sage.rings.number_field + sage: L = F.lift_map(); L Lifting map: From: Residue field in abar of Fractional ideal (a^2 + 2*a - 1) To: Maximal Order in Number Field in a with defining polynomial x^3 + 2 - sage: L(F.0^2) # needs sage.rings.number_field + sage: L(F.0^2) 3*a + 1 - sage: L(3*a + 1) == F.0^2 # needs sage.rings.number_field + sage: L(3*a + 1) == F.0^2 True sage: R. = GF(13)[] @@ -1453,15 +1470,16 @@ cdef class LiftingMap(Section): From: Residue field in theta_5bar of Fractional ideal (7) To: Maximal Order in Cyclotomic Field of order 5 and degree 4 + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^5 + 2) # needs sage.rings.number_field - sage: F = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field - sage: L = F.lift_map(); L # needs sage.rings.number_field + sage: K. = NumberField(x^5 + 2) + sage: F = K.factor(7)[0][0].residue_field() + sage: L = F.lift_map(); L Lifting map: From: Residue field in abar of Fractional ideal (2*a^4 - a^3 + 4*a^2 - 2*a + 1) To: Maximal Order in Number Field in a with defining polynomial x^5 + 2 - sage: L.domain() # needs sage.rings.number_field + sage: L.domain() Residue field in abar of Fractional ideal (2*a^4 - a^3 + 4*a^2 - 2*a + 1) sage: # needs sage.rings.number_field diff --git a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx index 8a19efd0d2a..95a518d30b2 100644 --- a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx +++ b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx @@ -33,20 +33,21 @@ class ResidueFiniteField_pari_ffelt(ResidueField_generic, FiniteField_pari_ffelt EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(923478923).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: k.degree() # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(923478923).factor()[0][0] + sage: k = K.residue_field(P) + sage: k.degree() 2 - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: c = OK(a) # needs sage.rings.number_field - sage: b = k(c) # needs sage.rings.number_field - sage: b + c # needs sage.rings.number_field + sage: OK = K.maximal_order() + sage: c = OK(a) + sage: b = k(c) + sage: b + c 2*abar - sage: b*c # needs sage.rings.number_field + sage: b*c 664346875*abar + 535606347 - sage: k.base_ring() # needs sage.rings.number_field + sage: k.base_ring() Finite Field of size 923478923 sage: R. = GF(5)[] @@ -94,23 +95,24 @@ class ResidueFiniteField_pari_ffelt(ResidueField_generic, FiniteField_pari_ffelt EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 2) # needs sage.rings.number_field - sage: P = K.factor(10007)[0][0] # needs sage.rings.number_field - sage: P.residue_class_degree() # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 2) + sage: P = K.factor(10007)[0][0] + sage: P.residue_class_degree() 2 - sage: ff. = P.residue_field(); ff # needs sage.rings.number_field + sage: ff. = P.residue_field(); ff Residue field in alpha of Fractional ideal (-12*aa^2 + 189*aa - 475) - sage: type(ff) # needs sage.rings.number_field + sage: type(ff) - sage: ff(alpha^2 + 1) # needs sage.rings.number_field + sage: ff(alpha^2 + 1) 7521*alpha + 4131 - sage: ff(17/3) # needs sage.rings.number_field + sage: ff(17/3) 6677 - sage: V = ff.vector_space(map=False); v = V([3,-2]) # needs sage.rings.number_field - sage: type(ff.convert_map_from(V)) # needs sage.rings.number_field + sage: V = ff.vector_space(map=False); v = V([3,-2]) + sage: type(ff.convert_map_from(V)) - sage: ff(v) # indirect doctest # needs sage.rings.number_field + sage: ff(v) # indirect doctest 10005*alpha + 3 sage: R. = GF(5)[]; P = R.ideal(4*t^12 + 3*t^11 + 4*t^10 + t^9 + t^8 + 3*t^7 + 2*t^6 + 3*t^4 + t^3 + 3*t^2 + 2) From 6042ff73a3ff5b9bb6b7270782d77dbd07590b69 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sun, 16 Jul 2023 20:06:59 -0700 Subject: [PATCH 13/23] sage.rings.{finite_rings,polynomial}: Modularization fixes for imports --- src/sage/rings/finite_rings/conway_polynomials.py | 15 +++++++++++---- .../rings/finite_rings/element_pari_ffelt.pyx | 5 ++++- .../finite_rings/finite_field_constructor.py | 11 ++++++++--- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/sage/rings/finite_rings/conway_polynomials.py b/src/sage/rings/finite_rings/conway_polynomials.py index 80aae30f334..9bc1c04967a 100644 --- a/src/sage/rings/finite_rings/conway_polynomials.py +++ b/src/sage/rings/finite_rings/conway_polynomials.py @@ -94,7 +94,10 @@ def exists_conway_polynomial(p, n): sage: exists_conway_polynomial(6,6) False """ - return ConwayPolynomials().has_polynomial(p,n) + try: + return ConwayPolynomials().has_polynomial(p,n) + except ImportError: + return False class PseudoConwayLattice(WithEqualityById, SageObject): r""" @@ -174,9 +177,13 @@ def __init__(self, p, use_database=True): from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing self.ring = PolynomialRing(FiniteField(p), 'x') if use_database: - C = ConwayPolynomials() - self.nodes = {n: self.ring(C.polynomial(p, n)) - for n in C.degrees(p)} + try: + C = ConwayPolynomials() + except ImportError: + self.nodes = {} + else: + self.nodes = {n: self.ring(C.polynomial(p, n)) + for n in C.degrees(p)} else: self.nodes = {} diff --git a/src/sage/rings/finite_rings/element_pari_ffelt.pyx b/src/sage/rings/finite_rings/element_pari_ffelt.pyx index 57c48ac2858..4284fde24e3 100644 --- a/src/sage/rings/finite_rings/element_pari_ffelt.pyx +++ b/src/sage/rings/finite_rings/element_pari_ffelt.pyx @@ -28,13 +28,16 @@ from .element_base cimport FinitePolyExtElement from .integer_mod import IntegerMod_abstract import sage.rings.integer -from sage.modules.free_module_element import FreeModuleElement from sage.rings.integer cimport Integer from sage.rings.polynomial.polynomial_element import Polynomial from sage.rings.polynomial.multi_polynomial_element import MPolynomial from sage.rings.rational import Rational from sage.structure.richcmp cimport rich_to_bool +try: + from sage.modules.free_module_element import FreeModuleElement +except ImportError: + FreeModuleElement = () from sage.interfaces.abc import GapElement diff --git a/src/sage/rings/finite_rings/finite_field_constructor.py b/src/sage/rings/finite_rings/finite_field_constructor.py index e65fae97f4c..0b7ac18be6a 100644 --- a/src/sage/rings/finite_rings/finite_field_constructor.py +++ b/src/sage/rings/finite_rings/finite_field_constructor.py @@ -189,6 +189,12 @@ except ImportError: FiniteField_givaro = None +try: + from .finite_field_ntl_gf2e import FiniteField_ntl_gf2e +except ImportError: + FiniteField_ntl_gf2e = None + + from sage.structure.factory import UniqueFactory @@ -619,9 +625,9 @@ def create_key_and_extra_args(self, order, name=None, modulus=None, names=None, name = normalize_names(1, name) if impl is None: - if order < zech_log_bound: + if order < zech_log_bound and FiniteField_givaro is not None: impl = 'givaro' - elif p == 2: + elif p == 2 and FiniteField_ntl_gf2e is not None: impl = 'ntl' else: impl = 'pari_ffelt' @@ -772,7 +778,6 @@ def create_object(self, version, key, **kwds): if impl == 'givaro': K = FiniteField_givaro(order, name, modulus, repr, elem_cache) elif impl == 'ntl': - from .finite_field_ntl_gf2e import FiniteField_ntl_gf2e K = FiniteField_ntl_gf2e(order, name, modulus) elif impl == 'pari_ffelt' or impl == 'pari': from .finite_field_pari_ffelt import FiniteField_pari_ffelt From 1bc26c26a534b3719e36de3f896868e7349a4dd8 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sun, 16 Jul 2023 20:10:18 -0700 Subject: [PATCH 14/23] sage.rings.finite_rings: Update # needs --- .../rings/finite_rings/element_pari_ffelt.pyx | 5 ++- .../rings/finite_rings/finite_field_base.pyx | 6 +-- .../finite_rings/finite_field_constructor.py | 38 +++++++++---------- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/sage/rings/finite_rings/element_pari_ffelt.pyx b/src/sage/rings/finite_rings/element_pari_ffelt.pyx index 4284fde24e3..b83f259abcc 100644 --- a/src/sage/rings/finite_rings/element_pari_ffelt.pyx +++ b/src/sage/rings/finite_rings/element_pari_ffelt.pyx @@ -1333,9 +1333,10 @@ cdef class FiniteFieldElement_pari_ffelt(FinitePolyExtElement): EXAMPLES:: + sage: # needs sage.libs.gap sage: F = FiniteField(2^3, 'aa', impl='pari_ffelt') sage: aa = F.multiplicative_generator() - sage: gap(aa) # indirect doctest + sage: gap(aa) # indirect doctest Z(2^3) sage: b = F.multiplicative_generator() sage: a = b^3 @@ -1350,6 +1351,7 @@ cdef class FiniteFieldElement_pari_ffelt(FinitePolyExtElement): You can specify the instance of the Gap interpreter that is used:: + sage: # needs sage.libs.gap sage: F = FiniteField(next_prime(200)^2, 'a', impl='pari_ffelt') sage: a = F.multiplicative_generator() sage: a._gap_ (gap) @@ -1359,6 +1361,7 @@ cdef class FiniteFieldElement_pari_ffelt(FinitePolyExtElement): Gap only supports relatively small finite fields:: + sage: # needs sage.libs.gap sage: F = FiniteField(next_prime(1000)^2, 'a', impl='pari_ffelt') sage: a = F.multiplicative_generator() sage: a._gap_init_() diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index b3e70d45067..4d2bd4257ce 100644 --- a/src/sage/rings/finite_rings/finite_field_base.pyx +++ b/src/sage/rings/finite_rings/finite_field_base.pyx @@ -4,9 +4,9 @@ Base class for finite fields TESTS:: - sage: K. = NumberField(x^2 + 1) - sage: F = K.factor(3)[0][0].residue_field() - sage: loads(dumps(F)) == F + sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field + sage: F = K.factor(3)[0][0].residue_field() # needs sage.rings.number_field + sage: loads(dumps(F)) == F # needs sage.rings.number_field True AUTHORS: diff --git a/src/sage/rings/finite_rings/finite_field_constructor.py b/src/sage/rings/finite_rings/finite_field_constructor.py index 0b7ac18be6a..ea60e69957c 100644 --- a/src/sage/rings/finite_rings/finite_field_constructor.py +++ b/src/sage/rings/finite_rings/finite_field_constructor.py @@ -73,7 +73,7 @@ :: - sage: k = GF(5^2,'c'); type(k) + sage: k = GF(5^2,'c'); type(k) # needs sage.libs.linbox One can also give the cardinality `q=p^n` as the tuple `(p,n)`:: @@ -83,7 +83,7 @@ :: - sage: k = GF(2^16,'c'); type(k) + sage: k = GF(2^16,'c'); type(k) # needs sage.libs.ntl :: @@ -125,9 +125,9 @@ :: - sage: k = GF(9,'alpha'); type(k) + sage: k = GF(9,'alpha'); type(k) # needs sage.libs.linbox - sage: k.base_ring() + sage: k.base_ring() # needs sage.libs.linbox Finite Field of size 3 :: @@ -508,12 +508,12 @@ def create_key_and_extra_args(self, order, name=None, modulus=None, names=None, """ EXAMPLES:: - sage: GF.create_key_and_extra_args(9, 'a') + sage: GF.create_key_and_extra_args(9, 'a') # needs sage.libs.linbox ((9, ('a',), x^2 + 2*x + 2, 'givaro', 3, 2, True, None, 'poly', True, True, True), {}) The order `q` can also be given as a pair `(p,n)`:: - sage: GF.create_key_and_extra_args((3, 2), 'a') + sage: GF.create_key_and_extra_args((3, 2), 'a') # needs sage.libs.linbox ((9, ('a',), x^2 + 2*x + 2, 'givaro', 3, 2, True, None, 'poly', True, True, True), {}) We do not take invalid keyword arguments and raise a value error @@ -527,28 +527,28 @@ def create_key_and_extra_args(self, order, name=None, modulus=None, names=None, Moreover, ``repr`` and ``elem_cache`` are ignored when not using givaro:: - sage: GF.create_key_and_extra_args(16, 'a', impl='ntl', repr='poly') + sage: GF.create_key_and_extra_args(16, 'a', impl='ntl', repr='poly') # needs sage.libs.ntl ((16, ('a',), x^4 + x + 1, 'ntl', 2, 4, True, None, None, None, True, True), {}) - sage: GF.create_key_and_extra_args(16, 'a', impl='ntl', elem_cache=False) + sage: GF.create_key_and_extra_args(16, 'a', impl='ntl', elem_cache=False) # needs sage.libs.ntl ((16, ('a',), x^4 + x + 1, 'ntl', 2, 4, True, None, None, None, True, True), {}) - sage: GF(16, impl='ntl') is GF(16, impl='ntl', repr='foo') + sage: GF(16, impl='ntl') is GF(16, impl='ntl', repr='foo') # needs sage.libs.ntl True We handle extra arguments for the givaro finite field and create unique objects for their defaults:: - sage: GF(25, impl='givaro') is GF(25, impl='givaro', repr='poly') + sage: GF(25, impl='givaro') is GF(25, impl='givaro', repr='poly') # needs sage.libs.linbox True - sage: GF(25, impl='givaro') is GF(25, impl='givaro', elem_cache=True) + sage: GF(25, impl='givaro') is GF(25, impl='givaro', elem_cache=True) # needs sage.libs.linbox True - sage: GF(625, impl='givaro') is GF(625, impl='givaro', elem_cache=False) + sage: GF(625, impl='givaro') is GF(625, impl='givaro', elem_cache=False) # needs sage.libs.linbox True We explicitly take ``structure``, ``implementation`` and ``prec`` attributes for compatibility with :class:`~sage.categories.pushout.AlgebraicExtensionFunctor` but we ignore them as they are not used, see :trac:`21433`:: - sage: GF.create_key_and_extra_args(9, 'a', structure=None) + sage: GF.create_key_and_extra_args(9, 'a', structure=None) # needs sage.libs.linbox ((9, ('a',), x^2 + 2*x + 2, 'givaro', 3, 2, True, None, 'poly', True, True, True), {}) TESTS:: @@ -684,8 +684,8 @@ def create_object(self, version, key, **kwds): We try to create finite fields with various implementations:: sage: k = GF(2, impl='modn') - sage: k = GF(2, impl='givaro') - sage: k = GF(2, impl='ntl') + sage: k = GF(2, impl='givaro') # needs sage.libs.linbox + sage: k = GF(2, impl='ntl') # needs sage.libs.ntl sage: k = GF(2, impl='pari') Traceback (most recent call last): ... @@ -698,18 +698,18 @@ def create_object(self, version, key, **kwds): Traceback (most recent call last): ... ValueError: the 'modn' implementation requires a prime order - sage: k. = GF(2^15, impl='givaro') - sage: k. = GF(2^15, impl='ntl') + sage: k. = GF(2^15, impl='givaro') # needs sage.libs.linbox + sage: k. = GF(2^15, impl='ntl') # needs sage.libs.ntl sage: k. = GF(2^15, impl='pari') sage: k. = GF(3^60, impl='modn') Traceback (most recent call last): ... ValueError: the 'modn' implementation requires a prime order - sage: k. = GF(3^60, impl='givaro') + sage: k. = GF(3^60, impl='givaro') # needs sage.libs.linbox Traceback (most recent call last): ... ValueError: q must be < 2^16 - sage: k. = GF(3^60, impl='ntl') + sage: k. = GF(3^60, impl='ntl') # needs sage.libs.ntl Traceback (most recent call last): ... ValueError: q must be a 2-power From 1b5422860fa2abdd1d50b8673a4dd260e78897ea Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Fri, 21 Jul 2023 19:40:47 -0700 Subject: [PATCH 15/23] src/sage/rings/finite_rings/conway_polynomials.py: Add # needs --- .../rings/finite_rings/conway_polynomials.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/finite_rings/conway_polynomials.py b/src/sage/rings/finite_rings/conway_polynomials.py index 9bc1c04967a..4d2eb9a952a 100644 --- a/src/sage/rings/finite_rings/conway_polynomials.py +++ b/src/sage/rings/finite_rings/conway_polynomials.py @@ -48,11 +48,11 @@ def conway_polynomial(p, n): EXAMPLES:: - sage: conway_polynomial(2,5) + sage: conway_polynomial(2,5) # needs conway_polynomials x^5 + x^2 + 1 - sage: conway_polynomial(101,5) + sage: conway_polynomial(101,5) # needs conway_polynomials x^5 + 2*x + 99 - sage: conway_polynomial(97,101) + sage: conway_polynomial(97,101) # needs conway_polynomials Traceback (most recent call last): ... RuntimeError: requested Conway polynomial not in database. @@ -85,7 +85,7 @@ def exists_conway_polynomial(p, n): EXAMPLES:: - sage: exists_conway_polynomial(2,3) + sage: exists_conway_polynomial(2,3) # needs conway_polynomials True sage: exists_conway_polynomial(2,-1) False @@ -133,6 +133,7 @@ class PseudoConwayLattice(WithEqualityById, SageObject): EXAMPLES:: + sage: # needs sage.rings.finite_rings sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice sage: PCL = PseudoConwayLattice(2, use_database=False) sage: PCL.polynomial(3) @@ -161,10 +162,13 @@ def __init__(self, p, use_database=True): TESTS:: sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice + + sage: # needs sage.rings.finite_rings sage: PCL = PseudoConwayLattice(3) sage: PCL.polynomial(3) x^3 + 2*x + 1 + sage: # needs sage.rings.finite_rings sage: PCL = PseudoConwayLattice(5, use_database=False) sage: PCL.polynomial(12) x^12 + 4*x^11 + 2*x^10 + 4*x^9 + 2*x^8 + 2*x^7 + 4*x^6 + x^5 + 2*x^4 + 2*x^2 + x + 2 @@ -209,6 +213,7 @@ def polynomial(self, n): EXAMPLES:: + sage: # needs sage.rings.finite_rings sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice sage: PCL = PseudoConwayLattice(2, use_database=False) sage: PCL.polynomial(3) @@ -277,6 +282,7 @@ def check_consistency(self, n): EXAMPLES:: + sage: # needs sage.rings.finite_rings sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice sage: PCL = PseudoConwayLattice(2, use_database=False) sage: PCL.check_consistency(6) @@ -311,6 +317,7 @@ def _find_pow_of_frobenius(p, n, x, y): EXAMPLES:: + sage: # needs sage.rings.finite_rings sage: from sage.rings.finite_rings.conway_polynomials import _find_pow_of_frobenius sage: K. = GF(3^14) sage: x = K.multiplicative_generator() @@ -390,6 +397,7 @@ def _frobenius_shift(K, generators, check_only=False): EXAMPLES:: + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[] sage: f30 = x^30 + x^28 + x^27 + x^25 + x^24 + x^20 + x^19 + x^18 + x^16 + x^15 + x^12 + x^10 + x^7 + x^2 + 1 sage: f20 = x^20 + x^19 + x^15 + x^13 + x^12 + x^11 + x^9 + x^8 + x^7 + x^4 + x^2 + x + 1 From baca60e4f6c095723d808e5999f399521bd5bc0b Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sat, 22 Jul 2023 02:54:35 -0700 Subject: [PATCH 16/23] sage.rings: Update # needs --- src/sage/rings/finite_rings/conway_polynomials.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/finite_rings/conway_polynomials.py b/src/sage/rings/finite_rings/conway_polynomials.py index 4d2eb9a952a..99bdf3fbf5e 100644 --- a/src/sage/rings/finite_rings/conway_polynomials.py +++ b/src/sage/rings/finite_rings/conway_polynomials.py @@ -48,11 +48,11 @@ def conway_polynomial(p, n): EXAMPLES:: - sage: conway_polynomial(2,5) # needs conway_polynomials + sage: conway_polynomial(2,5) # needs conway_polynomials x^5 + x^2 + 1 - sage: conway_polynomial(101,5) # needs conway_polynomials + sage: conway_polynomial(101,5) # needs conway_polynomials x^5 + 2*x + 99 - sage: conway_polynomial(97,101) # needs conway_polynomials + sage: conway_polynomial(97,101) # needs conway_polynomials Traceback (most recent call last): ... RuntimeError: requested Conway polynomial not in database. @@ -85,7 +85,7 @@ def exists_conway_polynomial(p, n): EXAMPLES:: - sage: exists_conway_polynomial(2,3) # needs conway_polynomials + sage: exists_conway_polynomial(2,3) # needs conway_polynomials True sage: exists_conway_polynomial(2,-1) False From 1810daf6b4e59f31cfb5b1926e10219bd2c39f60 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sun, 6 Aug 2023 14:47:30 -0700 Subject: [PATCH 17/23] sage.rings.finite_rings: Update # needs --- .../rings/finite_rings/conway_polynomials.py | 2 +- src/sage/rings/finite_rings/element_base.pyx | 22 +- .../rings/finite_rings/finite_field_base.pyx | 46 +-- .../finite_rings/finite_field_constructor.py | 7 +- .../rings/finite_rings/hom_finite_field.pyx | 2 +- src/sage/rings/finite_rings/homset.py | 2 +- .../rings/finite_rings/maps_finite_field.py | 1 + src/sage/rings/finite_rings/residue_field.pyx | 322 +++++++++++------- 8 files changed, 244 insertions(+), 160 deletions(-) diff --git a/src/sage/rings/finite_rings/conway_polynomials.py b/src/sage/rings/finite_rings/conway_polynomials.py index 99bdf3fbf5e..df677de6477 100644 --- a/src/sage/rings/finite_rings/conway_polynomials.py +++ b/src/sage/rings/finite_rings/conway_polynomials.py @@ -397,7 +397,7 @@ def _frobenius_shift(K, generators, check_only=False): EXAMPLES:: - sage: # needs sage.rings.finite_rings + sage: # needs sage.libs.ntl sage.rings.finite_rings sage: R. = GF(2)[] sage: f30 = x^30 + x^28 + x^27 + x^25 + x^24 + x^20 + x^19 + x^18 + x^16 + x^15 + x^12 + x^10 + x^7 + x^2 + 1 sage: f20 = x^20 + x^19 + x^15 + x^13 + x^12 + x^11 + x^9 + x^8 + x^7 + x^4 + x^2 + x + 1 diff --git a/src/sage/rings/finite_rings/element_base.pyx b/src/sage/rings/finite_rings/element_base.pyx index 5dc87c95f49..abbd60a9d3c 100755 --- a/src/sage/rings/finite_rings/element_base.pyx +++ b/src/sage/rings/finite_rings/element_base.pyx @@ -1,4 +1,4 @@ -# sage.doctest: optional - sage.rings.finite_rings +# sage.doctest: needs sage.rings.finite_rings """ Base class for finite field elements @@ -711,23 +711,23 @@ cdef class FinitePolyExtElement(FiniteRingElement): EXAMPLES:: - sage: k. = FiniteField(9, impl='givaro', modulus='primitive') - sage: a.is_square() + sage: k. = FiniteField(9, impl='givaro', modulus='primitive') # needs sage.libs.linbox + sage: a.is_square() # needs sage.libs.linbox False - sage: (a**2).is_square() + sage: (a**2).is_square() # needs sage.libs.linbox True - sage: k. = FiniteField(4, impl='ntl', modulus='primitive') - sage: (a**2).is_square() + sage: k. = FiniteField(4, impl='ntl', modulus='primitive') # needs sage.libs.ntl + sage: (a**2).is_square() # needs sage.libs.ntl True - sage: k. = FiniteField(17^5, impl='pari_ffelt', modulus='primitive') - sage: a.is_square() + sage: k. = FiniteField(17^5, impl='pari_ffelt', modulus='primitive') # needs sage.libs.pari + sage: a.is_square() # needs sage.libs.pari False - sage: (a**2).is_square() + sage: (a**2).is_square() # needs sage.libs.pari True :: - sage: k(0).is_square() + sage: k(0).is_square() # needs sage.libs.linbox True """ K = self.parent() @@ -1086,7 +1086,7 @@ cdef class Cache_base(SageObject): EXAMPLES:: sage: k. = GF(2^48) - sage: k._cache.fetch_int(2^33 + 2 + 1) + sage: k._cache.fetch_int(2^33 + 2 + 1) # needs sage.libs.ntl a^33 + a + 1 """ raise NotImplementedError("this must be implemented by subclasses") diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index 4d2bd4257ce..08ff8c83c2a 100644 --- a/src/sage/rings/finite_rings/finite_field_base.pyx +++ b/src/sage/rings/finite_rings/finite_field_base.pyx @@ -1,4 +1,4 @@ -# sage.doctest: optional - sage.rings.finite_rings +# sage.doctest: needs sage.rings.finite_rings """ Base class for finite fields @@ -1012,7 +1012,7 @@ cdef class FiniteField(Field): The given modulus is always made monic:: - sage: k. = GF(7^2, modulus=2*x^2-3, impl="pari_ffelt") + sage: k. = GF(7^2, modulus=2*x^2 - 3, impl="pari_ffelt") sage: k.modulus() x^2 + 2 @@ -1022,19 +1022,19 @@ cdef class FiniteField(Field): sage: GF(2, impl="modn").modulus() x + 1 - sage: GF(2, impl="givaro").modulus() + sage: GF(2, impl="givaro").modulus() # needs sage.libs.linbox x + 1 - sage: GF(2, impl="ntl").modulus() + sage: GF(2, impl="ntl").modulus() # needs sage.libs.ntl x + 1 sage: GF(2, impl="modn", modulus=x).modulus() x - sage: GF(2, impl="givaro", modulus=x).modulus() + sage: GF(2, impl="givaro", modulus=x).modulus() # needs sage.libs.linbox x - sage: GF(2, impl="ntl", modulus=x).modulus() + sage: GF(2, impl="ntl", modulus=x).modulus() # needs sage.libs.ntl x - sage: GF(13^2, 'a', impl="givaro", modulus=x^2+2).modulus() + sage: GF(13^2, 'a', impl="givaro", modulus=x^2 + 2).modulus() # needs sage.libs.linbox x^2 + 2 - sage: GF(13^2, 'a', impl="pari_ffelt", modulus=x^2+2).modulus() + sage: GF(13^2, 'a', impl="pari_ffelt", modulus=x^2 + 2).modulus() # needs sage.libs.pari x^2 + 2 """ # Normally, this is set by the constructor of the implementation @@ -1086,6 +1086,7 @@ cdef class FiniteField(Field): sage: f(F.gen()) 0 + sage: # needs sage.libs.ntl sage: k. = GF(2^20, impl='ntl') sage: k.polynomial() a^20 + a^10 + a^9 + a^7 + a^6 + a^5 + a^4 + a + 1 @@ -1234,7 +1235,7 @@ cdef class FiniteField(Field): (1, 0) (0, 1) - sage: F = GF(9, 't', modulus=(x^2+x-1)) + sage: F = GF(9, 't', modulus=x^2 + x - 1) sage: E = GF(81) sage: h = Hom(F,E).an_element() sage: V, from_V, to_V = E.vector_space(h, map=True) @@ -1514,13 +1515,16 @@ cdef class FiniteField(Field): To: Finite Field in b of size 5^2 Defn: 1 |--> 1 sage: f.parent() - Set of field embeddings from Finite Field of size 5 to Finite Field in b of size 5^2 + Set of field embeddings + from Finite Field of size 5 + to Finite Field in b of size 5^2 Extensions of non-prime finite fields by polynomials are not yet supported: we fall back to generic code:: sage: k.extension(x^5 + x^2 + x - 1) - Univariate Quotient Polynomial Ring in x over Finite Field in z4 of size 3^4 with modulus x^5 + x^2 + x + 2 + Univariate Quotient Polynomial Ring in x over Finite Field in z4 of size 3^4 + with modulus x^5 + x^2 + x + 2 TESTS: @@ -1799,12 +1803,14 @@ cdef class FiniteField(Field): Ring morphism: From: Finite Field in z3 of size 2^3 To: Finite Field in z21 of size 2^21 - Defn: z3 |--> z21^20 + z21^19 + z21^17 + z21^15 + z21^11 + z21^9 + z21^8 + z21^6 + z21^2), + Defn: z3 |--> z21^20 + z21^19 + z21^17 + z21^15 + z21^11 + + z21^9 + z21^8 + z21^6 + z21^2), (Finite Field in z7 of size 2^7, Ring morphism: From: Finite Field in z7 of size 2^7 To: Finite Field in z21 of size 2^21 - Defn: z7 |--> z21^20 + z21^19 + z21^17 + z21^15 + z21^14 + z21^6 + z21^4 + z21^3 + z21), + Defn: z7 |--> z21^20 + z21^19 + z21^17 + z21^15 + z21^14 + + z21^6 + z21^4 + z21^3 + z21), (Finite Field in z21 of size 2^21, Identity endomorphism of Finite Field in z21 of size 2^21)] """ @@ -2065,13 +2071,13 @@ cdef class FiniteField(Field): sage: e = [a^0, a^1, a^2, a^3, a^4, a^5, a^6, a^7] sage: d = F.dual_basis(e, check=False); d [6*a^6 + 4*a^5 + 4*a^4 + a^3 + 6*a^2 + 3, - 6*a^7 + 4*a^6 + 4*a^5 + 2*a^4 + a^2, - 4*a^6 + 5*a^5 + 5*a^4 + 4*a^3 + 5*a^2 + a + 6, - 5*a^7 + a^6 + a^4 + 4*a^3 + 4*a^2 + 1, - 2*a^7 + 5*a^6 + a^5 + a^3 + 5*a^2 + 2*a + 4, - a^7 + 2*a^6 + 5*a^5 + a^4 + 5*a^2 + 4*a + 4, - a^7 + a^6 + 2*a^5 + 5*a^4 + a^3 + 4*a^2 + 4*a + 6, - 5*a^7 + a^6 + a^5 + 2*a^4 + 5*a^3 + 6*a] + 6*a^7 + 4*a^6 + 4*a^5 + 2*a^4 + a^2, + 4*a^6 + 5*a^5 + 5*a^4 + 4*a^3 + 5*a^2 + a + 6, + 5*a^7 + a^6 + a^4 + 4*a^3 + 4*a^2 + 1, + 2*a^7 + 5*a^6 + a^5 + a^3 + 5*a^2 + 2*a + 4, + a^7 + 2*a^6 + 5*a^5 + a^4 + 5*a^2 + 4*a + 4, + a^7 + a^6 + 2*a^5 + 5*a^4 + a^3 + 4*a^2 + 4*a + 6, + 5*a^7 + a^6 + a^5 + 2*a^4 + 5*a^3 + 6*a] sage: F.dual_basis(d) [1, a, a^2, a^3, a^4, a^5, a^6, a^7] diff --git a/src/sage/rings/finite_rings/finite_field_constructor.py b/src/sage/rings/finite_rings/finite_field_constructor.py index ea60e69957c..2c5dfbc664f 100644 --- a/src/sage/rings/finite_rings/finite_field_constructor.py +++ b/src/sage/rings/finite_rings/finite_field_constructor.py @@ -1,4 +1,4 @@ -# sage.doctest: optional - sage.rings.finite_rings +# sage.doctest: needs sage.rings.finite_rings r""" Finite fields @@ -125,9 +125,10 @@ :: - sage: k = GF(9,'alpha'); type(k) # needs sage.libs.linbox + sage: # needs sage.libs.linbox + sage: k = GF(9,'alpha'); type(k) - sage: k.base_ring() # needs sage.libs.linbox + sage: k.base_ring() Finite Field of size 3 :: diff --git a/src/sage/rings/finite_rings/hom_finite_field.pyx b/src/sage/rings/finite_rings/hom_finite_field.pyx index d1f99453a17..fa38753d79f 100644 --- a/src/sage/rings/finite_rings/hom_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_finite_field.pyx @@ -1,4 +1,4 @@ -# sage.doctest: optional - sage.rings.finite_rings +# sage.doctest: needs sage.rings.finite_rings """ Finite field morphisms diff --git a/src/sage/rings/finite_rings/homset.py b/src/sage/rings/finite_rings/homset.py index dca345cc879..dfce6a12f1a 100644 --- a/src/sage/rings/finite_rings/homset.py +++ b/src/sage/rings/finite_rings/homset.py @@ -1,4 +1,4 @@ -# sage.doctest: optional - sage.rings.finite_rings +# sage.doctest: needs sage.rings.finite_rings """ Homset for finite fields diff --git a/src/sage/rings/finite_rings/maps_finite_field.py b/src/sage/rings/finite_rings/maps_finite_field.py index 07d351c165a..0ae08a3d25d 100644 --- a/src/sage/rings/finite_rings/maps_finite_field.py +++ b/src/sage/rings/finite_rings/maps_finite_field.py @@ -1,3 +1,4 @@ +# sage.doctest: needs sage.rings.finite_rings """ Structure maps for finite fields diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index d2d0cfeac8f..9fd260d5747 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -3,7 +3,7 @@ Finite residue fields We can take the residue field of maximal ideals in the ring of integers of number fields. We can also take the residue field of irreducible -polynomials over `GF(p)`. +polynomials over `\GF{p}`. EXAMPLES:: @@ -33,11 +33,12 @@ monogenic (i.e., 2 is an essential discriminant divisor):: We can also form residue fields from `\ZZ`:: - sage: ZZ.residue_field(17) # needs sage.rings.number_field + sage: ZZ.residue_field(17) Residue field of Integers modulo 17 And for polynomial rings over finite fields:: + sage: # needs sage.rings.finite_rings sage: R. = GF(5)[] sage: I = R.ideal(t^2 + 2) sage: k = ResidueField(I); k @@ -71,6 +72,7 @@ Verify that :trac:`15192` has been resolved:: sage: a.is_unit() # needs sage.rings.number_field True + sage: # needs sage.rings.finite_rings sage: R. = GF(11)[]; P = R.ideal(t^3 + t + 4) sage: ff. = ResidueField(P) sage: a == ff(t) @@ -97,11 +99,12 @@ Reducing a curve modulo a prime:: Elliptic Curve defined by y^2 = x^3 + x + 5 over Residue field of Fractional ideal (13, 1/2*s + 9/2) + sage: # needs sage.rings.finite_rings sage: R. = GF(11)[] sage: P = R.ideal(t^3 + t + 4) sage: ff. = R.residue_field(P) - sage: E = EllipticCurve([0,0,0,R(1),R(t)]) - sage: E.base_extend(ff) + sage: E = EllipticCurve([0,0,0,R(1),R(t)]) # needs sage.schemes + sage: E.base_extend(ff) # needs sage.schemes Elliptic Curve defined by y^2 = x^3 + x + a over Residue field in a of Principal ideal (t^3 + t + 4) of Univariate Polynomial Ring in t over Finite Field of size 11 @@ -130,21 +133,22 @@ First over a small non-prime field:: And now over a large prime field:: + sage: # needs sage.rings.number_field sage: x = ZZ['x'].0 - sage: F1. = NumberField(x^2 + 6*x + 324) # needs sage.rings.number_field - sage: reduct_id = F1.prime_above(next_prime(2^42)) # needs sage.rings.number_field - sage: Rf = F1.residue_field(reduct_id) # needs sage.rings.number_field - sage: type(Rf) # needs sage.rings.number_field + sage: F1. = NumberField(x^2 + 6*x + 324) + sage: reduct_id = F1.prime_above(next_prime(2^42)) + sage: Rf = F1.residue_field(reduct_id) + sage: type(Rf) - sage: Rf.cardinality().factor() # needs sage.rings.number_field + sage: Rf.cardinality().factor() 4398046511119 - sage: S. = PolynomialRing(Rf, order='lex') # needs sage.rings.number_field - sage: I = ideal([2*X - Y^2, Y + Z]) # needs sage.rings.number_field - sage: I.groebner_basis() # needs sage.rings.number_field + sage: S. = PolynomialRing(Rf, order='lex') + sage: I = ideal([2*X - Y^2, Y + Z]) + sage: I.groebner_basis() [X + 2199023255559*Z^2, Y + Z] - sage: S. = PolynomialRing(Rf, order='deglex') # needs sage.rings.number_field - sage: I = ideal([2*X - Y^2, Y + Z]) # needs sage.rings.number_field - sage: I.groebner_basis() # needs sage.rings.number_field + sage: S. = PolynomialRing(Rf, order='deglex') + sage: I = ideal([2*X - Y^2, Y + Z]) + sage: I.groebner_basis() [Z^2 + 4398046511117*X, Y + Z] """ @@ -180,19 +184,16 @@ from sage.rings.finite_rings.finite_field_constructor import zech_log_bound, Fin from sage.rings.finite_rings.finite_field_prime_modn import FiniteField_prime_modn from sage.rings.ideal import is_Ideal from sage.rings.number_field.number_field_element_base import NumberFieldElement_base -from sage.structure.element cimport Element - from sage.rings.number_field.number_field_ideal import is_NumberFieldIdeal -from sage.modules.free_module_element import FreeModuleElement from sage.rings.fraction_field import is_FractionField from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing from sage.rings.polynomial.polynomial_ring import is_PolynomialRing from sage.rings.polynomial.polynomial_element import Polynomial +from sage.structure.element cimport Element, parent, Vector from sage.structure.factory import UniqueFactory -from sage.structure.element cimport parent from sage.structure.richcmp cimport richcmp, richcmp_not_equal @@ -204,17 +205,17 @@ class ResidueFieldFactory(UniqueFactory): INPUT: - - ``p`` -- a prime ideal of an order in a number field. + - ``p`` -- a prime ideal of an order in a number field. - - ``names`` -- the variable name for the finite field created. - Defaults to the name of the number field variable but with - bar placed after it. + - ``names`` -- the variable name for the finite field created. + Defaults to the name of the number field variable but with + bar placed after it. - - ``check`` -- whether or not to check if `p` is prime. + - ``check`` -- whether or not to check if `p` is prime. OUTPUT: - - The residue field at the prime `p`. + The residue field at the prime `p`. EXAMPLES:: @@ -237,13 +238,13 @@ class ResidueFieldFactory(UniqueFactory): sage: R. = GF(31)[] sage: P = R.ideal(t^5 + 2*t + 11) - sage: ResidueField(P) + sage: ResidueField(P) # needs sage.rings.finite_rings Residue field in tbar of Principal ideal (t^5 + 2*t + 11) of Univariate Polynomial Ring in t over Finite Field of size 31 - sage: ResidueField(P) is ResidueField(P) + sage: ResidueField(P) is ResidueField(P) # needs sage.rings.finite_rings True - sage: k = ResidueField(P); k.order() + sage: k = ResidueField(P); k.order() # needs sage.rings.finite_rings 28629151 An example where the generator of the number field doesn't @@ -271,6 +272,7 @@ class ResidueFieldFactory(UniqueFactory): And for polynomial rings:: + sage: # needs sage.rings.finite_rings sage: R. = GF(next_prime(2^18))[] sage: P = R.ideal(t - 5) sage: k = ResidueField(P); k @@ -383,16 +385,30 @@ class ResidueFieldFactory(UniqueFactory): else: q = characteristic**(f.degree()) if q < zech_log_bound and (impl is None or impl == 'givaro'): - from .residue_field_givaro import ResidueFiniteField_givaro - return ResidueFiniteField_givaro(p, q, names, f, None, None, None) - elif (q % 2 == 0) and (impl is None or impl == 'ntl'): - from .residue_field_ntl_gf2e import ResidueFiniteField_ntl_gf2e - return ResidueFiniteField_ntl_gf2e(q, names, f, "poly", p, None, None, None) - elif impl is None or impl == 'pari': - from .residue_field_pari_ffelt import ResidueFiniteField_pari_ffelt - return ResidueFiniteField_pari_ffelt(p, characteristic, names, f, None, None, None) - else: - raise ValueError("unrecognized finite field type") + try: + from .residue_field_givaro import ResidueFiniteField_givaro + except ImportError: + if impl is not None: + raise + else: + return ResidueFiniteField_givaro(p, q, names, f, None, None, None) + if q % 2 == 0 and (impl is None or impl == 'ntl'): + try: + from .residue_field_ntl_gf2e import ResidueFiniteField_ntl_gf2e + except ImportError: + if impl is not None: + raise + else: + return ResidueFiniteField_ntl_gf2e(q, names, f, "poly", p, None, None, None) + if impl is None or impl == 'pari': + try: + from .residue_field_pari_ffelt import ResidueFiniteField_pari_ffelt + except ImportError: + if impl is not None: + raise + else: + return ResidueFiniteField_pari_ffelt(p, characteristic, names, f, None, None, None) + raise ValueError("unrecognized finite field type") # Should generalize to allowing residue fields of relative extensions to be extensions of finite fields. if is_NumberFieldIdeal(p): @@ -445,32 +461,50 @@ class ResidueFieldFactory(UniqueFactory): else: q = characteristic**(f.degree()) if q < zech_log_bound and (impl is None or impl == 'givaro'): - from .residue_field_givaro import ResidueFiniteField_givaro - return ResidueFiniteField_givaro(p, q, names, f, to_vs, to_order, PB) - elif (q % 2 == 0) and (impl is None or impl == 'ntl'): - from .residue_field_ntl_gf2e import ResidueFiniteField_ntl_gf2e - return ResidueFiniteField_ntl_gf2e(q, names, f, "poly", p, to_vs, to_order, PB) - elif impl is None or impl == 'pari': - from .residue_field_pari_ffelt import ResidueFiniteField_pari_ffelt - return ResidueFiniteField_pari_ffelt(p, characteristic, names, f, to_vs, to_order, PB) - else: - raise ValueError("unrecognized finite field type") + try: + from .residue_field_givaro import ResidueFiniteField_givaro + except ImportError: + if impl is not None: + raise + else: + return ResidueFiniteField_givaro(p, q, names, f, to_vs, to_order, PB) + elif q % 2 == 0 and (impl is None or impl == 'ntl'): + try: + from .residue_field_ntl_gf2e import ResidueFiniteField_ntl_gf2e + except ImportError: + if impl is not None: + raise + else: + return ResidueFiniteField_ntl_gf2e(q, names, f, "poly", p, to_vs, to_order, PB) + if impl is None or impl == 'pari': + try: + from .residue_field_pari_ffelt import ResidueFiniteField_pari_ffelt + except ImportError: + if impl is not None: + raise + else: + return ResidueFiniteField_pari_ffelt(p, characteristic, names, f, to_vs, to_order, PB) + raise ValueError("unrecognized finite field type") + ResidueField = ResidueFieldFactory("ResidueField") + class ResidueField_generic(Field): """ The class representing a generic residue field. EXAMPLES:: - sage: I = QQ[i].factor(2)[0][0]; I # needs sage.rings.number_field + sage: # needs sage.rings.number_field + sage: I = QQ[i].factor(2)[0][0]; I Fractional ideal (I + 1) - sage: k = I.residue_field(); k # needs sage.rings.number_field + sage: k = I.residue_field(); k Residue field of Fractional ideal (I + 1) - sage: type(k) # needs sage.rings.number_field + sage: type(k) + sage: # needs sage.rings.finite_rings sage: R. = GF(29)[]; P = R.ideal(t^2 + 2); k. = ResidueField(P); k Residue field in a of Principal ideal (t^2 + 2) of Univariate Polynomial Ring in t over Finite Field of size 29 @@ -494,26 +528,30 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 17) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # indirect doctest # needs sage.rings.number_field - sage: F = ZZ.residue_field(17) # indirect doctest - - sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) - sage: k. = P.residue_field() # indirect doctest + sage: K. = NumberField(x^3 - 17) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) # indirect doctest - sage: k.category() - Category of finite enumerated fields + sage: F = ZZ.residue_field(17) # indirect doctest sage: F.category() Join of Category of finite enumerated fields and Category of subquotients of monoids and Category of quotients of semigroups + sage: # needs sage.rings.finite_rings + sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) + sage: k. = P.residue_field() # indirect doctest + sage: k.category() + Category of finite enumerated fields + TESTS:: - sage: TestSuite(k).run() sage: TestSuite(F).run() + + sage: # needs sage.rings.finite_rings + sage: TestSuite(k).run() """ self.p = p # Note: we don't call Parent.__init__ since many residue fields use multiple inheritance and will be calling __init__ via their other superclass. @@ -564,7 +602,7 @@ class ResidueField_generic(Field): sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^3 + x + 1) sage: P = K.ideal(29).factor()[0][0] - sage: k = K.residue_field(P) # indirect doctest + sage: k = K.residue_field(P) # indirect doctest sage: k.ideal() is P True sage: p = next_prime(2^40); p @@ -573,6 +611,7 @@ class ResidueField_generic(Field): sage: k.ideal().norm() == p True + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = R.residue_field(P) sage: k.ideal() @@ -617,6 +656,7 @@ class ResidueField_generic(Field): Here is a test that was temporarily removed, but newly introduced in :trac:`8800`:: + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field() sage: k(t) @@ -653,7 +693,7 @@ class ResidueField_generic(Field): sage: P = K.ideal(-3*i - 2) sage: OK = K.maximal_order() sage: F = OK.residue_field(P) - sage: F.has_coerce_map_from(GF(13)) # indirect doctest + sage: F.has_coerce_map_from(GF(13)) # indirect doctest True TESTS: @@ -663,6 +703,7 @@ class ResidueField_generic(Field): sage: GF(13).has_coerce_map_from(F) # needs sage.rings.number_field True + sage: # needs sage.rings.number_field sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field() sage: k.has_coerce_map_from(Qp(17)) # indirect doctest # needs sage.rings.padics @@ -679,15 +720,17 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P); k # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P); k Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) sage: F = ZZ.residue_field(17); F Residue field of Integers modulo 17 + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field(); k # indirect doctest Residue field in a of Principal ideal (t^3 + t^2 + 7) of @@ -717,6 +760,7 @@ class ResidueField_generic(Field): sage: k.lift(12821*b + 918) 3*a + 19 + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field() sage: k.lift(a^2 + 5) @@ -763,6 +807,7 @@ class ResidueField_generic(Field): sage: F.reduction_map().codomain() Residue field of Fractional ideal (1/4*a) + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field(); f = k.reduction_map(); f Partially defined reduction map: @@ -800,6 +845,7 @@ class ResidueField_generic(Field): sage: f(k.0) 1 + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field() sage: f = k.lift_map(); f @@ -833,6 +879,7 @@ class ResidueField_generic(Field): sage: k == l False + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field() sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 11) @@ -857,12 +904,15 @@ class ResidueField_generic(Field): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x + 1) # needs sage.rings.number_field - sage: hash(K.residue_field(K.prime_above(17))) # random # needs sage.rings.number_field + sage: K. = NumberField(x^3 + x + 1) + sage: hash(K.residue_field(K.prime_above(17))) # random -6463132282686559142 - sage: hash(K.residue_field(K.prime_above(2^60))) # random # needs sage.rings.number_field + sage: hash(K.residue_field(K.prime_above(2^60))) # random -6939519969600666586 + + sage: # needs sage.rings.finite_rings sage: R. = GF(13)[] sage: hash(R.residue_field(t + 2)) # random 3521289879659800254 @@ -879,16 +929,18 @@ cdef class ReductionMap(Map): EXAMPLES:: - sage: I = QQ[sqrt(17)].factor(5)[0][0]; I # needs sage.rings.number_field sage.symbolic + sage: # needs sage.rings.number_field sage.symbolic + sage: I = QQ[sqrt(17)].factor(5)[0][0]; I Fractional ideal (5) - sage: k = I.residue_field(); k # needs sage.rings.number_field sage.symbolic + sage: k = I.residue_field(); k Residue field in sqrt17bar of Fractional ideal (5) - sage: R = k.reduction_map(); R # needs sage.rings.number_field sage.symbolic + sage: R = k.reduction_map(); R Partially defined reduction map: From: Number Field in sqrt17 with defining polynomial x^2 - 17 with sqrt17 = 4.123105625617660? To: Residue field in sqrt17bar of Fractional ideal (5) + sage: # needs sage.rings.finite_rings sage: R. = GF(next_prime(2^20))[]; P = R.ideal(t^2 + t + 1) sage: k = P.residue_field() sage: k.reduction_map() @@ -904,21 +956,24 @@ cdef class ReductionMap(Map): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^3 + x^2 - 2*x + 8) # needs sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field - sage: F.reduction_map() # needs sage.rings.number_field + sage: K. = NumberField(x^3 + x^2 - 2*x + 8) + sage: F = K.factor(2)[0][0].residue_field() + sage: F.reduction_map() Partially defined reduction map: From: Number Field in a with defining polynomial x^3 + x^2 - 2*x + 8 To: Residue field of Fractional ideal (-1/2*a^2 + 1/2*a - 1) - sage: K. = CyclotomicField(5) # needs sage.rings.number_field - sage: F = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field - sage: F.reduction_map() # needs sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(5) + sage: F = K.factor(7)[0][0].residue_field() + sage: F.reduction_map() Partially defined reduction map: From: Cyclotomic Field of order 5 and degree 4 To: Residue field in theta_5bar of Fractional ideal (7) + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; P = R.ideal(t^7 + t^6 + t^5 + t^4 + 1) sage: k = P.residue_field() sage: k.reduction_map() # needs sage.libs.ntl @@ -951,7 +1006,7 @@ cdef class ReductionMap(Map): sage: K. = NumberField(x^2 + 1) sage: F = K.factor(2)[0][0].residue_field() sage: r = F.reduction_map() - sage: cr = copy(r) # indirect doctest + sage: cr = copy(r) # indirect doctest sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 @@ -982,7 +1037,7 @@ cdef class ReductionMap(Map): sage: K. = NumberField(x^2 + 1) sage: F = K.factor(2)[0][0].residue_field() sage: r = F.reduction_map() - sage: cr = copy(r) # indirect doctest + sage: cr = copy(r) # indirect doctest sage: cr Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 @@ -1011,25 +1066,28 @@ cdef class ReductionMap(Map): EXAMPLES:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') - sage: K. = NumberField(x^2 + 1) # needs sage.rings.number_field - sage: F = K.factor(2)[0][0].residue_field() # needs sage.rings.number_field - sage: r = F.reduction_map(); r # needs sage.rings.number_field + sage: K. = NumberField(x^2 + 1) + sage: F = K.factor(2)[0][0].residue_field() + sage: r = F.reduction_map(); r Partially defined reduction map: From: Number Field in a with defining polynomial x^2 + 1 To: Residue field of Fractional ideal (a + 1) We test that calling the function also works after copying:: - sage: r = copy(r) # needs sage.rings.number_field - sage: r(2 + a) # indirect doctest # needs sage.rings.number_field + sage: # needs sage.rings.number_field + sage: r = copy(r) + sage: r(2 + a) # indirect doctest 1 - sage: r(a/2) # needs sage.rings.number_field + sage: r(a/2) Traceback (most recent call last): ... ZeroDivisionError: Cannot reduce field element 1/2*a modulo Fractional ideal (a + 1): it has negative valuation + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; h = t^5 + t^2 + 1 sage: k. = R.residue_field(h) sage: K = R.fraction_field() @@ -1148,6 +1206,7 @@ cdef class ReductionMap(Map): sage: s(l.gen()).parent() Number Field in b with defining polynomial x^5 + 17*x + 1 + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; h = t^5 + t^2 + 1 sage: k. = R.residue_field(h) sage: K = R.fraction_field() @@ -1182,15 +1241,17 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): sage: (1+abar)^179 24*abar + 12 - sage: phi = k.coerce_map_from(OK); phi # needs sage.rings.number_field + sage: # needs sage.rings.number_field + sage: phi = k.coerce_map_from(OK); phi Ring morphism: From: Maximal Order in Number Field in a with defining polynomial x^3 - 7 To: Residue field in abar of Fractional ideal (2*a^2 + 3*a - 10) - sage: phi in Hom(OK,k) # needs sage.rings.number_field + sage: phi in Hom(OK,k) True - sage: phi(OK.1) # needs sage.rings.number_field + sage: phi(OK.1) abar + sage: # needs sage.rings.finite_rings sage: R. = GF(19)[]; P = R.ideal(t^2 + 5) sage: k. = R.residue_field(P) sage: f = k.coerce_map_from(R); f @@ -1229,6 +1290,7 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): sage: type(phi) + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; P = R.ideal(t^7 + t^6 + t^5 + t^4 + 1) sage: k = P.residue_field(); f = k.coerce_map_from(R) sage: f(t^10) @@ -1318,9 +1380,10 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): sage: P = K.ideal(29).factor()[0][0] sage: k = K.residue_field(P) sage: OK = K.maximal_order() - sage: k.coerce_map_from(OK)(OK(a)^7) # indirect doctest + sage: k.coerce_map_from(OK)(OK(a)^7) # indirect doctest 13*abar^2 + 7*abar + 21 + sage: # needs sage.rings.finite_rings sage: R. = GF(next_prime(2^18))[]; P = R.ideal(t - 71) sage: k = ResidueField(P); f = k.coerce_map_from(R); f Ring morphism: @@ -1378,6 +1441,7 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): sage: s(l.gen()).parent() Maximal Order in Number Field in b with defining polynomial x^5 + 17*x + 1 + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field() sage: f = k.coerce_map_from(R) @@ -1413,6 +1477,7 @@ cdef class ResidueFieldHomomorphism_global(RingHomomorphism): sage: f.lift(12821*b + 918) 3*a + 19 + sage: # needs sage.rings.finite_rings sage: R. = GF(17)[]; P = R.ideal(t^3 + t^2 + 7) sage: k. = P.residue_field(); f = k.coerce_map_from(R) sage: f.lift(a^2 + 5*a + 1) @@ -1446,6 +1511,7 @@ cdef class LiftingMap(Section): sage: L(3*a + 1) == F.0^2 True + sage: # needs sage.rings.finite_rings sage: R. = GF(13)[] sage: P = R.ideal(8*t^12 + 9*t^11 + 11*t^10 + 2*t^9 + 11*t^8 ....: + 3*t^7 + 12*t^6 + t^4 + 7*t^3 + 5*t^2 + 12*t + 1) @@ -1463,9 +1529,10 @@ cdef class LiftingMap(Section): EXAMPLES:: - sage: K. = CyclotomicField(5) # needs sage.rings.number_field - sage: F = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field - sage: F.lift_map() # needs sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(5) + sage: F = K.factor(7)[0][0].residue_field() + sage: F.lift_map() Lifting map: From: Residue field in theta_5bar of Fractional ideal (7) To: Maximal Order in Cyclotomic Field of order 5 and degree 4 @@ -1492,6 +1559,7 @@ cdef class LiftingMap(Section): sage: L.codomain() Maximal Order in Cyclotomic Field of order 7 and degree 6 + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; h = t^5 + t^2 + 1 sage: k. = R.residue_field(h) sage: K = R.fraction_field() @@ -1568,11 +1636,12 @@ cdef class LiftingMap(Section): Lifting map: From: Residue field in abar of Fractional ideal (5) To: Maximal Order in Cyclotomic Field of order 7 and degree 6 - sage: L(F.0) # indirect doctest + sage: L(F.0) # indirect doctest a sage: F(a) abar + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; h = t^5 + t^2 + 1 sage: k. = R.residue_field(h) sage: K = R.fraction_field() @@ -1604,9 +1673,10 @@ cdef class LiftingMap(Section): """ EXAMPLES:: - sage: K. = CyclotomicField(12) # needs sage.rings.number_field - sage: F. = K.factor(7)[0][0].residue_field() # needs sage.rings.number_field - sage: F.lift_map() #indirect doctest # needs sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = CyclotomicField(12) + sage: F. = K.factor(7)[0][0].residue_field() + sage: F.lift_map() #indirect doctest Lifting map: From: Residue field in tmod of Fractional ideal (theta_12^2 + 2) To: Maximal Order in Cyclotomic Field of order 12 and degree 4 @@ -1620,25 +1690,27 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn EXAMPLES:: + sage: # needs sage.rings.number_field sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[1][0] # needs sage.rings.number_field - sage: k = ResidueField(P); k # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[1][0] + sage: k = ResidueField(P); k Residue field of Fractional ideal (-a^2 - 2*a - 2) - sage: k.order() # needs sage.rings.number_field + sage: k.order() 29 - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: c = OK(a) # needs sage.rings.number_field - sage: b = k(a) # needs sage.rings.number_field - sage: k.coerce_map_from(OK)(c) # needs sage.rings.number_field + sage: OK = K.maximal_order() + sage: c = OK(a) + sage: b = k(a) + sage: k.coerce_map_from(OK)(c) 16 - sage: k(4) # needs sage.rings.number_field + sage: k(4) 4 - sage: k(c + 5) # needs sage.rings.number_field + sage: k(c + 5) 21 - sage: b + c # needs sage.rings.number_field + sage: b + c 3 + sage: # needs sage.rings.finite_rings sage: R. = GF(7)[]; P = R.ideal(2*t + 3) sage: k = P.residue_field(); k Residue field of Principal ideal (t + 5) of @@ -1662,11 +1734,13 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn EXAMPLES:: - sage: K. = QuadraticField(-1) # needs sage.rings.number_field - sage: kk = ResidueField(K.factor(5)[0][0]) # needs sage.rings.number_field - sage: type(kk) # needs sage.rings.number_field + sage: # needs sage.rings.number_field + sage: K. = QuadraticField(-1) + sage: kk = ResidueField(K.factor(5)[0][0]) + sage: type(kk) + sage: # needs sage.rings.finite_rings sage: R. = GF(7)[]; P = R.ideal(2*t + 3) sage: k = P.residue_field(); type(k) @@ -1706,30 +1780,32 @@ class ResidueFiniteField_prime_modn(ResidueField_generic, FiniteField_prime_modn EXAMPLES:: + sage: # needs sage.rings.number_field sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[1][0] # needs sage.rings.number_field - sage: k = ResidueField(P) # needs sage.rings.number_field - sage: k # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[1][0] + sage: k = ResidueField(P) + sage: k Residue field of Fractional ideal (-a^2 - 2*a - 2) - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: c = OK(a) # needs sage.rings.number_field - sage: b = k(a); b # needs sage.rings.number_field + sage: OK = K.maximal_order() + sage: c = OK(a) + sage: b = k(a); b 16 - sage: k(2r) # needs sage.rings.number_field + sage: k(2r) 2 - sage: V = k.vector_space(map=False); v = V([3]) # needs sage.rings.number_field - sage: type(k.convert_map_from(V)) # needs sage.rings.number_field + sage: V = k.vector_space(map=False); v = V([3]) + sage: type(k.convert_map_from(V)) - sage: k(v) # indirect doctest # needs sage.rings.number_field + sage: k(v) # indirect doctest 3 + sage: # needs sage.rings.finite_rings sage: R. = GF(2)[]; P = R.ideal(t + 1); k. = P.residue_field() sage: V = k.vector_space(map=False); v = V([1]) sage: k(v) 1 """ - if isinstance(x, FreeModuleElement) and len(x) == 1: + if isinstance(x, Vector) and len(x) == 1: x = x[0] try: return FiniteField_prime_modn._element_constructor_(self, x) From a3ef387f899e18ffb826fc130ddd42f0b4bb3365 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Sun, 6 Aug 2023 18:29:26 -0700 Subject: [PATCH 18/23] sage.rings.finite_rings: Update # needs --- src/sage/rings/finite_rings/element_base.pyx | 1 + .../rings/finite_rings/finite_field_base.pyx | 41 +++++++++++-------- .../finite_rings/finite_field_pari_ffelt.py | 8 ++-- .../rings/finite_rings/integer_mod_ring.py | 13 +++--- src/sage/rings/finite_rings/residue_field.pyx | 8 ++-- .../finite_rings/residue_field_pari_ffelt.pyx | 1 + 6 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/sage/rings/finite_rings/element_base.pyx b/src/sage/rings/finite_rings/element_base.pyx index abbd60a9d3c..e9ab5b5d4ab 100755 --- a/src/sage/rings/finite_rings/element_base.pyx +++ b/src/sage/rings/finite_rings/element_base.pyx @@ -1049,6 +1049,7 @@ cdef class FinitePolyExtElement(FiniteRingElement): TESTS:: + sage: # needs sage.modules sage: p = random_prime(2^99) sage: k = randrange(2,10) sage: F. = GF((p, k)) diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index 08ff8c83c2a..7e2eed91153 100644 --- a/src/sage/rings/finite_rings/finite_field_base.pyx +++ b/src/sage/rings/finite_rings/finite_field_base.pyx @@ -338,11 +338,11 @@ cdef class FiniteField(Field): sage: L = [] sage: from sage.rings.finite_rings.finite_field_base import FiniteField - sage: for impl in ("givaro", "pari", "ntl"): - ....: k = GF(8, impl=impl, names="z") - ....: print(list(FiniteField.__iter__(k))) + sage: print(list(FiniteField.__iter__(GF(8, impl="givaro", names="z")))) # needs sage.libs.linbox [0, 1, z, z + 1, z^2, z^2 + 1, z^2 + z, z^2 + z + 1] + sage: print(list(FiniteField.__iter__(GF(8, impl="pari", names="z")))) [0, 1, z, z + 1, z^2, z^2 + 1, z^2 + z, z^2 + z + 1] + sage: print(list(FiniteField.__iter__(GF(8, impl="ntl", names="z")))) # needs sage.libs.ntl [0, 1, z, z + 1, z^2, z^2 + 1, z^2 + z, z^2 + z + 1] """ cdef Py_ssize_t n = self.degree() @@ -1123,12 +1123,12 @@ cdef class FiniteField(Field): EXAMPLES:: sage: k = GF(19^4, 'a') - sage: k.random_element().parent() is k + sage: k.random_element().parent() is k # needs sage.modules True Passes extra positional or keyword arguments through:: - sage: k.random_element(prob=0) + sage: k.random_element(prob=0) # needs sage.modules 0 """ @@ -1145,7 +1145,7 @@ cdef class FiniteField(Field): EXAMPLES:: sage: k = GF(2^8,'a') - sage: k.some_elements() # random output + sage: k.some_elements() # random output # needs sage.modules [a^4 + a^3 + 1, a^6 + a^4 + a^3, a^5 + a^4 + a, a^2 + a] """ return [self.random_element() for i in range(4)] @@ -1206,9 +1206,10 @@ cdef class FiniteField(Field): EXAMPLES:: - sage: GF(27,'a').vector_space(map=False) + sage: GF(27,'a').vector_space(map=False) # needs sage.modules Vector space of dimension 3 over Finite Field of size 3 + sage: # needs sage.modules sage: F = GF(8) sage: E = GF(64) sage: V, from_V, to_V = E.vector_space(F, map=True) @@ -1223,6 +1224,7 @@ cdef class FiniteField(Field): sage: all(to_V(c * e) == c * to_V(e) for e in E for c in F) True + sage: # needs sage.modules sage: basis = [E.gen(), E.gen() + 1] sage: W, from_W, to_W = E.vector_space(F, basis, map=True) sage: all(from_W(to_W(e)) == e for e in E) @@ -1235,6 +1237,7 @@ cdef class FiniteField(Field): (1, 0) (0, 1) + sage: # needs sage.modules sage: F = GF(9, 't', modulus=x^2 + x - 1) sage: E = GF(81) sage: h = Hom(F,E).an_element() @@ -1399,16 +1402,16 @@ cdef class FiniteField(Field): EXAMPLES:: - sage: K. = Qq(49); k = K.residue_field() - sage: k.convert_map_from(K) + sage: K. = Qq(49); k = K.residue_field() # needs sage.rings.padics + sage: k.convert_map_from(K) # needs sage.rings.padics Reduction morphism: From: 7-adic Unramified Extension Field in a defined by x^2 + 6*x + 3 To: Finite Field in a0 of size 7^2 Check that :trac:`8240 is resolved:: - sage: R. = Zq(81); k = R.residue_field() - sage: k.convert_map_from(R) + sage: R. = Zq(81); k = R.residue_field() # needs sage.rings.padics + sage: k.convert_map_from(R) # needs sage.rings.padics Reduction morphism: From: 3-adic Unramified Extension Ring in a defined by x^4 + 2*x^3 + 2 To: Finite Field in a0 of size 3^4 @@ -1953,8 +1956,8 @@ cdef class FiniteField(Field): sage: Frob = k.frobenius_endomorphism(); Frob Frobenius endomorphism t |--> t^3 on Finite Field in t of size 3^5 - sage: a = k.random_element() - sage: Frob(a) == a^3 + sage: a = k.random_element() # needs sage.modules + sage: Frob(a) == a^3 # needs sage.modules True We can specify a power:: @@ -1990,8 +1993,8 @@ cdef class FiniteField(Field): EXAMPLES:: - sage: G = GF(3^6).galois_group() - sage: G + sage: # needs sage.groups + sage: G = GF(3^6).galois_group(); G Galois group C6 of GF(3^6) sage: F = G.gen() sage: F^2 @@ -2047,13 +2050,14 @@ cdef class FiniteField(Field): EXAMPLES:: sage: F. = GF(2^4) - sage: F.dual_basis(basis=None, check=False) + sage: F.dual_basis(basis=None, check=False) # needs sage.modules [a^3 + 1, a^2, a, 1] We can test that the dual basis returned satisfies the defining property of a dual basis: `\mathrm{Tr}(e_i d_j) = \delta_{i,j}, 0 \leq i,j \leq n-1` :: + sage: # needs sage.modules sage: F. = GF(7^4) sage: e = [4*a^3, 2*a^3 + a^2 + 3*a + 5, ....: 3*a^3 + 5*a^2 + 4*a + 2, 2*a^3 + 2*a^2 + 2] @@ -2067,6 +2071,7 @@ cdef class FiniteField(Field): We can test that if `d` is the dual basis of `e`, then `e` is the dual basis of `d`:: + sage: # needs sage.modules sage: F. = GF(7^8) sage: e = [a^0, a^1, a^2, a^3, a^4, a^5, a^6, a^7] sage: d = F.dual_basis(e, check=False); d @@ -2085,12 +2090,12 @@ cdef class FiniteField(Field): :: sage: F. = GF(2^3) - sage: F.dual_basis([a], check=True) + sage: F.dual_basis([a], check=True) # needs sage.modules Traceback (most recent call last): ... ValueError: basis length should be 3, not 1 - sage: F.dual_basis([a^0, a, a^0 + a], check=True) + sage: F.dual_basis([a^0, a, a^0 + a], check=True) # needs sage.modules Traceback (most recent call last): ... ValueError: value of 'basis' keyword is not a basis diff --git a/src/sage/rings/finite_rings/finite_field_pari_ffelt.py b/src/sage/rings/finite_rings/finite_field_pari_ffelt.py index 74df0d752dc..038fb3d005e 100644 --- a/src/sage/rings/finite_rings/finite_field_pari_ffelt.py +++ b/src/sage/rings/finite_rings/finite_field_pari_ffelt.py @@ -213,12 +213,12 @@ def _pari_frobenius(self, k=1): TESTS:: sage: F = FiniteField(37^10, 'a', impl='pari_ffelt') - sage: x = F.random_element() - sage: all(x**(37**k) == F(F._pari_frobenius(k).ffmap(x)) for k in range(1, 30) if k % 10 != 0) + sage: x = F.random_element() # optional - sage.modules + sage: all(x**(37**k) == F(F._pari_frobenius(k).ffmap(x)) # optional - sage.modules + ....: for k in range(1, 30) if k % 10 != 0) True - sage: F(F._pari_frobenius(-1).ffmap(x))**37 == x + sage: F(F._pari_frobenius(-1).ffmap(x))**37 == x # optional - sage.modules True - """ k = k % self.degree() if k == 0: diff --git a/src/sage/rings/finite_rings/integer_mod_ring.py b/src/sage/rings/finite_rings/integer_mod_ring.py index e6940b6f4c7..48873370b22 100644 --- a/src/sage/rings/finite_rings/integer_mod_ring.py +++ b/src/sage/rings/finite_rings/integer_mod_ring.py @@ -885,26 +885,27 @@ def multiplicative_generator(self): EXAMPLES:: + sage: # needs sage.groups sage.libs.pari sage: R = Integers(7); R Ring of integers modulo 7 - sage: R.multiplicative_generator() # needs sage.libs.pari + sage: R.multiplicative_generator() 3 sage: R = Integers(9) - sage: R.multiplicative_generator() # needs sage.libs.pari + sage: R.multiplicative_generator() 2 sage: Integers(8).multiplicative_generator() Traceback (most recent call last): ... ValueError: multiplicative group of this ring is not cyclic - sage: Integers(4).multiplicative_generator() # needs sage.libs.pari + sage: Integers(4).multiplicative_generator() 3 - sage: Integers(25*3).multiplicative_generator() # needs sage.libs.pari + sage: Integers(25*3).multiplicative_generator() Traceback (most recent call last): ... ValueError: multiplicative group of this ring is not cyclic - sage: Integers(25*3).unit_gens() # needs sage.libs.pari + sage: Integers(25*3).unit_gens() (26, 52) - sage: Integers(162).unit_gens() # needs sage.libs.pari + sage: Integers(162).unit_gens() (83,) """ try: diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 9fd260d5747..202dc5aa421 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -508,7 +508,7 @@ class ResidueField_generic(Field): sage: R. = GF(29)[]; P = R.ideal(t^2 + 2); k. = ResidueField(P); k Residue field in a of Principal ideal (t^2 + 2) of Univariate Polynomial Ring in t over Finite Field of size 29 - sage: type(k) + sage: type(k) # needs sage.libs.linbox """ def __init__(self, p): @@ -550,7 +550,7 @@ class ResidueField_generic(Field): sage: TestSuite(F).run() - sage: # needs sage.rings.finite_rings + sage: # needs sage.modules sage.rings.finite_rings sage: TestSuite(k).run() """ self.p = p @@ -982,7 +982,7 @@ cdef class ReductionMap(Map): Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X) To: Residue field in tbar of Principal ideal (t^7 + t^6 + t^5 + t^4 + 1) of Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X) - sage: type(k) + sage: type(k) # needs sage.libs.linbox """ self._K = K @@ -1099,7 +1099,7 @@ cdef class ReductionMap(Map): sage: f(1/h) Traceback (most recent call last): ... - ZeroDivisionError: division by zero in finite field + ZeroDivisionError... An example to show that the issue raised in :trac:`1951` has been fixed:: diff --git a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx index 95a518d30b2..375b3b4cdfc 100644 --- a/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx +++ b/src/sage/rings/finite_rings/residue_field_pari_ffelt.pyx @@ -68,6 +68,7 @@ class ResidueFiniteField_pari_ffelt(ResidueField_generic, FiniteField_pari_ffelt We create a residue field with implementation ``pari_ffelt``:: + sage: # needs sage.rings.number_field sage: x = polygen(ZZ, 'x') sage: K. = NumberField(x^3 - 7) sage: P = K.ideal(923478923).factor()[0][0] From a18e1ab4a38c3bb0d0c361f750d1e4e78ffab309 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Mon, 7 Aug 2023 22:44:22 -0700 Subject: [PATCH 19/23] src/sage/rings: sage -fixdoctests --only-tags --- src/sage/rings/finite_rings/finite_field_pari_ffelt.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sage/rings/finite_rings/finite_field_pari_ffelt.py b/src/sage/rings/finite_rings/finite_field_pari_ffelt.py index 038fb3d005e..c60a7a563a7 100644 --- a/src/sage/rings/finite_rings/finite_field_pari_ffelt.py +++ b/src/sage/rings/finite_rings/finite_field_pari_ffelt.py @@ -213,11 +213,11 @@ def _pari_frobenius(self, k=1): TESTS:: sage: F = FiniteField(37^10, 'a', impl='pari_ffelt') - sage: x = F.random_element() # optional - sage.modules - sage: all(x**(37**k) == F(F._pari_frobenius(k).ffmap(x)) # optional - sage.modules + sage: x = F.random_element() # needs sage.modules + sage: all(x**(37**k) == F(F._pari_frobenius(k).ffmap(x)) # needs sage.modules ....: for k in range(1, 30) if k % 10 != 0) True - sage: F(F._pari_frobenius(-1).ffmap(x))**37 == x # optional - sage.modules + sage: F(F._pari_frobenius(-1).ffmap(x))**37 == x # needs sage.modules True """ k = k % self.degree() From e9630a637eeac32ea0f9fb5012035de11cd0e100 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Thu, 26 Jan 2023 18:20:11 -0800 Subject: [PATCH 20/23] pkgs/sagemath-categories/MANIFEST.in.m4: Add sage.rings.finite_rings.integer_mod, sage.rings.factorint --- src/sage/rings/finite_rings/integer_mod.pyx | 8 +++++++- src/sage/rings/finite_rings/integer_mod_ring.py | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index 5863b0ffd75..66810dcb610 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -85,7 +85,13 @@ from sage.arith.long cimport ( integer_check_long, integer_check_long_py, is_small_python_int) import sage.rings.rational as rational -from sage.libs.pari.all import pari, PariError + +try: + from sage.libs.pari.all import pari, PariError +except ImportError: + class PariError(Exception): + pass + import sage.rings.integer_ring as integer_ring import sage.rings.rational_field diff --git a/src/sage/rings/finite_rings/integer_mod_ring.py b/src/sage/rings/finite_rings/integer_mod_ring.py index 48873370b22..4dbb268cb21 100644 --- a/src/sage/rings/finite_rings/integer_mod_ring.py +++ b/src/sage/rings/finite_rings/integer_mod_ring.py @@ -72,7 +72,11 @@ import sage.rings.integer_ring as integer_ring import sage.rings.quotient_ring as quotient_ring -from sage.libs.pari.all import pari, PariError +try: + from sage.libs.pari.all import pari, PariError +except ImportError: + class PariError(Exception): + pass from sage.misc.cachefunc import cached_method From 8a823ff28eefc182d24c083551b16080c056b3f6 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Wed, 9 Aug 2023 22:02:23 -0700 Subject: [PATCH 21/23] src/sage/rings/finite_rings: Use more block tags --- .../finite_rings/hom_prime_finite_field.pyx | 9 +- src/sage/rings/finite_rings/integer_mod.pyx | 110 ++++++++++-------- .../rings/finite_rings/integer_mod_ring.py | 84 +++++++------ .../finite_rings/residue_field_givaro.pyx | 34 +++--- .../finite_rings/residue_field_ntl_gf2e.pyx | 34 +++--- 5 files changed, 151 insertions(+), 120 deletions(-) diff --git a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx index fb5c88d54e7..e141120d918 100644 --- a/src/sage/rings/finite_rings/hom_prime_finite_field.pyx +++ b/src/sage/rings/finite_rings/hom_prime_finite_field.pyx @@ -79,13 +79,14 @@ cdef class FiniteFieldHomomorphism_prime(FiniteFieldHomomorphism_generic): """ TESTS:: + sage: # needs sage.rings.finite_rings sage: from sage.rings.finite_rings.hom_prime_finite_field import FiniteFieldHomomorphism_prime sage: k = GF(3) - sage: K. = GF(3^5) # needs sage.rings.finite_rings - sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)) # needs sage.rings.finite_rings - sage: a = f(4); a # needs sage.rings.finite_rings + sage: K. = GF(3^5) + sage: f = FiniteFieldHomomorphism_prime(Hom(k, K)) + sage: a = f(4); a 1 - sage: a.parent() # needs sage.rings.finite_rings + sage: a.parent() Finite Field in t of size 3^5 """ return self._codomain._element_constructor(x) diff --git a/src/sage/rings/finite_rings/integer_mod.pyx b/src/sage/rings/finite_rings/integer_mod.pyx index 66810dcb610..b9461bd362e 100644 --- a/src/sage/rings/finite_rings/integer_mod.pyx +++ b/src/sage/rings/finite_rings/integer_mod.pyx @@ -547,14 +547,15 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: + sage: # needs sage.libs.gap sage: a = Mod(2,19) - sage: gap(a) # needs sage.libs.gap + sage: gap(a) Z(19) - sage: gap(Mod(3, next_prime(10000))) # needs sage.libs.gap + sage: gap(Mod(3, next_prime(10000))) Z(10007)^6190 - sage: gap(Mod(3, next_prime(100000))) # needs sage.libs.gap + sage: gap(Mod(3, next_prime(100000))) ZmodpZObj( 3, 100003 ) - sage: gap(Mod(4, 48)) # needs sage.libs.gap + sage: gap(Mod(4, 48)) ZmodnZObj( 4, 48 ) """ return '%s*One(ZmodnZ(%s))' % (self, self.__modulus.sageInteger) @@ -565,11 +566,12 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: + sage: # optional - magma sage: a = Integers(15)(4) - sage: b = magma(a) # optional - magma - sage: b.Type() # optional - magma + sage: b = magma(a) + sage: b.Type() RngIntResElt - sage: b^2 # optional - magma + sage: b^2 1 """ return '%s!%s'%(self.parent()._magma_init_(magma), self) @@ -585,14 +587,14 @@ cdef class IntegerMod_abstract(FiniteRingElement): sage: a._axiom_init_() '4 :: IntegerMod(15)' - sage: aa = axiom(a); aa #optional - axiom + sage: aa = axiom(a); aa # optional - axiom 4 - sage: aa.type() #optional - axiom + sage: aa.type() # optional - axiom IntegerMod 15 - sage: aa = fricas(a); aa #optional - fricas + sage: aa = fricas(a); aa # optional - fricas 4 - sage: aa.typeOf() #optional - fricas + sage: aa.typeOf() # optional - fricas IntegerMod(15) """ @@ -654,12 +656,13 @@ cdef class IntegerMod_abstract(FiniteRingElement): EXAMPLES:: + sage: # needs sage.libs.pari sage: r = Integers(125) - sage: b = r.multiplicative_generator()^3 # needs sage.libs.pari - sage: a = b^17 # needs sage.libs.pari - sage: a.log(b) # needs sage.libs.pari + sage: b = r.multiplicative_generator()^3 + sage: a = b^17 + sage: a.log(b) 17 - sage: a.log() # needs sage.libs.pari + sage: a.log() 51 A bigger example:: @@ -702,12 +705,13 @@ cdef class IntegerMod_abstract(FiniteRingElement): We test against a bug (side effect on PARI) fixed in :trac:`9438`:: + sage: # needs sage.libs.pari sage: R. = QQ[] - sage: pari(b) # needs sage.libs.pari + sage: pari(b) b - sage: GF(7)(5).log() # needs sage.rings.finite_rings + sage: GF(7)(5).log() 5 - sage: pari(b) # needs sage.libs.pari + sage: pari(b) b We test that :trac:`23927` is fixed:: @@ -1034,22 +1038,24 @@ cdef class IntegerMod_abstract(FiniteRingElement): sage: Mod(3, 17).is_square() False - sage: Mod(9, 17).is_square() # needs sage.libs.pari + + sage: # needs sage.libs.pari + sage: Mod(9, 17).is_square() True - sage: Mod(9, 17*19^2).is_square() # needs sage.libs.pari + sage: Mod(9, 17*19^2).is_square() True - sage: Mod(-1, 17^30).is_square() # needs sage.libs.pari + sage: Mod(-1, 17^30).is_square() True - sage: Mod(1/9, next_prime(2^40)).is_square() # needs sage.libs.pari + sage: Mod(1/9, next_prime(2^40)).is_square() True - sage: Mod(1/25, next_prime(2^90)).is_square() # needs sage.libs.pari + sage: Mod(1/25, next_prime(2^90)).is_square() True TESTS:: - sage: Mod(1/25, 2^8).is_square() # needs sage.libs.pari + sage: Mod(1/25, 2^8).is_square() # needs sage.libs.pari True - sage: Mod(1/25, 2^40).is_square() # needs sage.libs.pari + sage: Mod(1/25, 2^40).is_square() # needs sage.libs.pari True sage: for p,q,r in cartesian_product_iterator([[3,5],[11,13],[17,19]]): # long time, needs sage.libs.pari @@ -1130,16 +1136,18 @@ cdef class IntegerMod_abstract(FiniteRingElement): 86 sage: mod(7, 18).sqrt() 5 - sage: a = mod(14, 5^60).sqrt() # needs sage.libs.pari - sage: a*a # needs sage.libs.pari + + sage: # needs sage.libs.pari + sage: a = mod(14, 5^60).sqrt() + sage: a*a 14 sage: mod(15, 389).sqrt(extend=False) Traceback (most recent call last): ... ValueError: self must be a square - sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) # needs sage.libs.pari + sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) 9 - sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) # needs sage.libs.pari + sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) 25 :: @@ -1154,7 +1162,8 @@ cdef class IntegerMod_abstract(FiniteRingElement): sage: y = x.sqrt(); y sqrt359 sage: y.parent() - Univariate Quotient Polynomial Ring in sqrt359 over Ring of integers modulo 360 with modulus x^2 + 1 + Univariate Quotient Polynomial Ring in sqrt359 over + Ring of integers modulo 360 with modulus x^2 + 1 sage: y^2 359 @@ -1173,15 +1182,16 @@ cdef class IntegerMod_abstract(FiniteRingElement): :: + sage: # needs sage.libs.pari sage: R = Integers(5*13^3*37); R Ring of integers modulo 406445 - sage: v = R(-1).sqrt(all=True); v # needs sage.libs.pari + sage: v = R(-1).sqrt(all=True); v [78853, 111808, 160142, 193097, 213348, 246303, 294637, 327592] - sage: [x^2 for x in v] # needs sage.libs.pari + sage: [x^2 for x in v] [406444, 406444, 406444, 406444, 406444, 406444, 406444, 406444] - sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) # needs sage.libs.pari + sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) (13, 13, 104) - sage: all(x^2 == 169 for x in v) # needs sage.libs.pari + sage: all(x^2 == 169 for x in v) True :: @@ -1391,17 +1401,20 @@ cdef class IntegerMod_abstract(FiniteRingElement): 5 sage: K(23).nth_root(3) 29 - sage: mod(225, 2^5*3^2).nth_root(4, all=True) # needs sage.rings.padics + + sage: # needs sage.rings.padics + sage: mod(225, 2^5*3^2).nth_root(4, all=True) [225, 129, 33, 63, 255, 159, 9, 201, 105, 279, 183, 87, 81, 273, 177, 207, 111, 15, 153, 57, 249, 135, 39, 231] - sage: mod(275, 2^5*7^4).nth_root(7, all=True) # needs sage.rings.padics + sage: mod(275, 2^5*7^4).nth_root(7, all=True) [58235, 25307, 69211, 36283, 3355, 47259, 14331] - sage: mod(1,8).nth_root(2, all=True) # needs sage.rings.padics + sage: mod(1,8).nth_root(2, all=True) [1, 7, 5, 3] sage: mod(4,8).nth_root(2, all=True) [2, 6] - sage: mod(1,16).nth_root(4, all=True) # needs sage.rings.padics + sage: mod(1,16).nth_root(4, all=True) [1, 15, 13, 3, 9, 7, 5, 11] + sage: (mod(22,31)^200).nth_root(200) 5 sage: mod(3,6).nth_root(0, all=True) @@ -1582,7 +1595,7 @@ cdef class IntegerMod_abstract(FiniteRingElement): TESTS:: - sage: for n in range(2,100): # long time + sage: for n in range(2,100): # long time ....: K = Integers(n) ....: elist = list(range(1,min(2*n+2,100))) ....: for e in random_sublist(elist, 5/len(elist)): @@ -2914,16 +2927,18 @@ cdef class IntegerMod_int(IntegerMod_abstract): 86 sage: mod(7, 18).sqrt() 5 - sage: a = mod(14, 5^60).sqrt() # needs sage.libs.pari - sage: a*a # needs sage.libs.pari + + sage: # needs sage.libs.pari + sage: a = mod(14, 5^60).sqrt() + sage: a*a 14 sage: mod(15, 389).sqrt(extend=False) Traceback (most recent call last): ... ValueError: self must be a square - sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) # needs sage.libs.pari + sage: Mod(1/9, next_prime(2^40)).sqrt()^(-2) 9 - sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) # needs sage.libs.pari + sage: Mod(1/25, next_prime(2^90)).sqrt()^(-2) 25 :: @@ -2960,15 +2975,16 @@ cdef class IntegerMod_int(IntegerMod_abstract): :: + sage: # needs sage.libs.pari sage: R = Integers(5*13^3*37); R Ring of integers modulo 406445 - sage: v = R(-1).sqrt(all=True); v # needs sage.libs.pari + sage: v = R(-1).sqrt(all=True); v [78853, 111808, 160142, 193097, 213348, 246303, 294637, 327592] - sage: [x^2 for x in v] # needs sage.libs.pari + sage: [x^2 for x in v] [406444, 406444, 406444, 406444, 406444, 406444, 406444, 406444] - sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) # needs sage.libs.pari + sage: v = R(169).sqrt(all=True); min(v), -max(v), len(v) (13, 13, 104) - sage: all(x^2 == 169 for x in v) # needs sage.libs.pari + sage: all(x^2 == 169 for x in v) True Modulo a power of 2:: diff --git a/src/sage/rings/finite_rings/integer_mod_ring.py b/src/sage/rings/finite_rings/integer_mod_ring.py index 4dbb268cb21..07b10cf797a 100644 --- a/src/sage/rings/finite_rings/integer_mod_ring.py +++ b/src/sage/rings/finite_rings/integer_mod_ring.py @@ -348,14 +348,16 @@ class IntegerModRing_generic(quotient_ring.QuotientRing_generic, sage.rings.abc. 29 sage: FF.order() 29 - sage: gens = FF.unit_gens() # needs sage.groups - sage: a = gens[0] # needs sage.groups - sage: a # needs sage.groups + + sage: # needs sage.groups + sage: gens = FF.unit_gens() + sage: a = gens[0] + sage: a 2 - sage: a.is_square() # needs sage.groups + sage: a.is_square() False sage: def pow(i): return a**i - sage: [pow(i) for i in range(16)] # needs sage.groups + sage: [pow(i) for i in range(16)] [1, 2, 4, 8, 16, 3, 6, 12, 24, 19, 9, 18, 7, 14, 28, 27] sage: TestSuite(FF).run() @@ -408,24 +410,27 @@ class IntegerModRing_generic(quotient_ring.QuotientRing_generic, sage.rings.abc. 16 sage: Z16.characteristic() 16 - sage: gens = Z16.unit_gens() # needs sage.groups - sage: gens # needs sage.groups + + sage: # needs sage.groups + sage: gens = Z16.unit_gens() + sage: gens (15, 5) - sage: a = gens[0] # needs sage.groups - sage: b = gens[1] # needs sage.groups + sage: a = gens[0] + sage: b = gens[1] sage: def powa(i): return a**i sage: def powb(i): return b**i - sage: gp_exp = FF.unit_group_exponent() # needs sage.groups - sage: gp_exp # needs sage.groups + sage: gp_exp = FF.unit_group_exponent() + sage: gp_exp 28 - sage: [powa(i) for i in range(15)] # needs sage.groups + sage: [powa(i) for i in range(15)] [1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1] - sage: [powb(i) for i in range(15)] # needs sage.groups + sage: [powb(i) for i in range(15)] [1, 5, 9, 13, 1, 5, 9, 13, 1, 5, 9, 13, 1, 5, 9] - sage: a.multiplicative_order() # needs sage.groups + sage: a.multiplicative_order() 2 - sage: b.multiplicative_order() # needs sage.groups + sage: b.multiplicative_order() 4 + sage: TestSuite(Z16).run() Saving and loading:: @@ -1153,14 +1158,15 @@ def _element_constructor_(self, x): """ TESTS:: + sage: # needs sage.rings.finite_rings sage: K2 = GF(2) sage: K3 = GF(3) - sage: K8 = GF(8, 'a') # needs sage.rings.finite_rings - sage: K8(5) # indirect doctest # needs sage.rings.finite_rings + sage: K8 = GF(8, 'a') + sage: K8(5) # indirect doctest 1 - sage: K8('a+1') # needs sage.rings.finite_rings + sage: K8('a+1') a + 1 - sage: K8(K2(1)) # needs sage.rings.finite_rings + sage: K8(K2(1)) 1 The following test refers to :trac:`6468`:: @@ -1232,7 +1238,7 @@ def _coerce_map_from_(self, S): EXAMPLES:: sage: R = Integers(15) - sage: f = R.coerce_map_from(Integers(450)); f # indirect doctest + sage: f = R.coerce_map_from(Integers(450)); f # indirect doctest Natural morphism: From: Ring of integers modulo 450 To: Ring of integers modulo 15 @@ -1461,37 +1467,40 @@ def unit_group(self, algorithm='sage'): differ in various ways. In the following example, the same cyclic factors are computed, but in a different order:: + sage: # needs sage.groups sage: A = Zmod(15) - sage: G = A.unit_group(); G # needs sage.groups + sage: G = A.unit_group(); G Multiplicative Abelian group isomorphic to C2 x C4 - sage: G.gens_values() # needs sage.groups + sage: G.gens_values() (11, 7) - sage: H = A.unit_group(algorithm='pari'); H # needs sage.groups sage.libs.pari + sage: H = A.unit_group(algorithm='pari'); H # needs sage.libs.pari Multiplicative Abelian group isomorphic to C4 x C2 - sage: H.gens_values() # needs sage.groups sage.libs.pari + sage: H.gens_values() # needs sage.libs.pari (7, 11) Here are two examples where the cyclic factors are isomorphic, but are ordered differently and have different generators:: + sage: # needs sage.groups sage: A = Zmod(40) - sage: G = A.unit_group(); G # needs sage.groups + sage: G = A.unit_group(); G Multiplicative Abelian group isomorphic to C2 x C2 x C4 - sage: G.gens_values() # needs sage.groups + sage: G.gens_values() (31, 21, 17) - sage: H = A.unit_group(algorithm='pari'); H # needs sage.groups sage.libs.pari + sage: H = A.unit_group(algorithm='pari'); H # needs sage.libs.pari Multiplicative Abelian group isomorphic to C4 x C2 x C2 - sage: H.gens_values() # needs sage.groups sage.libs.pari + sage: H.gens_values() # needs sage.libs.pari (17, 31, 21) + sage: # needs sage.groups sage: A = Zmod(192) - sage: G = A.unit_group(); G # needs sage.groups + sage: G = A.unit_group(); G Multiplicative Abelian group isomorphic to C2 x C16 x C2 - sage: G.gens_values() # needs sage.groups + sage: G.gens_values() (127, 133, 65) - sage: H = A.unit_group(algorithm='pari'); H # needs sage.groups sage.libs.pari + sage: H = A.unit_group(algorithm='pari'); H # needs sage.libs.pari Multiplicative Abelian group isomorphic to C16 x C2 x C2 - sage: H.gens_values() # needs sage.groups sage.libs.pari + sage: H.gens_values() # needs sage.libs.pari (133, 127, 65) In the following examples, the cyclic factors are not even @@ -1515,15 +1524,16 @@ def unit_group(self, algorithm='sage'): We test the cases where the unit group is trivial:: + sage: # needs sage.groups sage: A = Zmod(1) - sage: A.unit_group() # needs sage.groups + sage: A.unit_group() Trivial Abelian group - sage: A.unit_group(algorithm='pari') # needs sage.groups sage.libs.pari + sage: A.unit_group(algorithm='pari') # needs sage.libs.pari Trivial Abelian group sage: A = Zmod(2) - sage: A.unit_group() # needs sage.groups + sage: A.unit_group() Trivial Abelian group - sage: A.unit_group(algorithm='pari') # needs sage.groups sage.libs.pari + sage: A.unit_group(algorithm='pari') # needs sage.libs.pari Trivial Abelian group sage: Zmod(3).unit_group(algorithm='bogus') # needs sage.groups @@ -1602,7 +1612,7 @@ def _magma_init_(self, magma): sage: R = Integers(12345678900) sage: R Ring of integers modulo 12345678900 - sage: magma(R) # indirect doctest, optional - magma + sage: magma(R) # indirect doctest, optional - magma Residue class ring of integers modulo 12345678900 """ return 'Integers({})'.format(self.order()) diff --git a/src/sage/rings/finite_rings/residue_field_givaro.pyx b/src/sage/rings/finite_rings/residue_field_givaro.pyx index 7b9510a1dbe..07fd740c044 100644 --- a/src/sage/rings/finite_rings/residue_field_givaro.pyx +++ b/src/sage/rings/finite_rings/residue_field_givaro.pyx @@ -33,18 +33,19 @@ class ResidueFiniteField_givaro(ResidueField_generic, FiniteField_givaro): EXAMPLES:: + sage: # needs sage.rings.number_field sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: k.degree() # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: k.degree() 2 - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: c = OK(a) # needs sage.rings.number_field - sage: b = k(c) # needs sage.rings.number_field - sage: b*c^2 # needs sage.rings.number_field + sage: OK = K.maximal_order() + sage: c = OK(a) + sage: b = k(c) + sage: b*c^2 7 - sage: b*c # needs sage.rings.number_field + sage: b*c 13*abar + 5 sage: R. = GF(7)[]; P = R.ideal(t^2 + 4) @@ -107,16 +108,17 @@ class ResidueFiniteField_givaro(ResidueField_generic, FiniteField_givaro): EXAMPLES:: + sage: # needs sage.rings.number_field sage: R. = QQ[] - sage: K. = NumberField(x^4 + 3*x^2 - 17) # needs sage.rings.number_field - sage: P = K.ideal(61).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: k(77*a^7 + 4) # needs sage.rings.number_field + sage: K. = NumberField(x^4 + 3*x^2 - 17) + sage: P = K.ideal(61).factor()[0][0] + sage: k = K.residue_field(P) + sage: k(77*a^7 + 4) 2*abar + 4 - sage: V = k.vector_space(map=False); v = V([3,-2]) # needs sage.rings.number_field - sage: type(k.convert_map_from(V)) # needs sage.rings.number_field + sage: V = k.vector_space(map=False); v = V([3,-2]) + sage: type(k.convert_map_from(V)) - sage: k(v) # indirect doctest # needs sage.rings.number_field + sage: k(v) # indirect doctest 59*abar + 3 sage: R. = GF(3)[]; P = R.ideal(t^4 - t^3 + t + 1); k. = P.residue_field() diff --git a/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx b/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx index 57ec926e332..ed6af655258 100644 --- a/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx +++ b/src/sage/rings/finite_rings/residue_field_ntl_gf2e.pyx @@ -34,18 +34,19 @@ class ResidueFiniteField_ntl_gf2e(ResidueField_generic, FiniteField_ntl_gf2e): EXAMPLES:: + sage: # needs sage.rings.number_field sage: R. = QQ[] - sage: K. = NumberField(x^3 - 7) # needs sage.rings.number_field - sage: P = K.ideal(29).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: k.degree() # needs sage.rings.number_field + sage: K. = NumberField(x^3 - 7) + sage: P = K.ideal(29).factor()[0][0] + sage: k = K.residue_field(P) + sage: k.degree() 2 - sage: OK = K.maximal_order() # needs sage.rings.number_field - sage: c = OK(a) # needs sage.rings.number_field - sage: b = k(c) # needs sage.rings.number_field - sage: b*c^2 # needs sage.rings.number_field + sage: OK = K.maximal_order() + sage: c = OK(a) + sage: b = k(c) + sage: b*c^2 7 - sage: b*c # needs sage.rings.number_field + sage: b*c 13*abar + 5 sage: R. = GF(2)[]; P = R.ideal(t^19 + t^5 + t^2 + t + 1) @@ -112,16 +113,17 @@ class ResidueFiniteField_ntl_gf2e(ResidueField_generic, FiniteField_ntl_gf2e): EXAMPLES:: + sage: # needs sage.rings.number_field sage: R. = QQ[] - sage: K. = NumberField(x^4 + 3*x^2 - 17) # needs sage.rings.number_field - sage: P = K.ideal(61).factor()[0][0] # needs sage.rings.number_field - sage: k = K.residue_field(P) # needs sage.rings.number_field - sage: k(77*a^7 + 4) # needs sage.rings.number_field + sage: K. = NumberField(x^4 + 3*x^2 - 17) + sage: P = K.ideal(61).factor()[0][0] + sage: k = K.residue_field(P) + sage: k(77*a^7 + 4) 2*abar + 4 - sage: V = k.vector_space(map=False); v = V([3,-2]) # needs sage.rings.number_field - sage: type(k.convert_map_from(V)) # needs sage.rings.number_field + sage: V = k.vector_space(map=False); v = V([3,-2]) + sage: type(k.convert_map_from(V)) - sage: k(v) # indirect doctest # needs sage.rings.number_field + sage: k(v) # indirect doctest 59*abar + 3 sage: R. = GF(3)[]; P = R.ideal(t^4 - t^3 + t + 1); k. = P.residue_field() From 98283eaaab69b19c972c73d9c4e0913f51e07ddd Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Fri, 11 Aug 2023 09:39:11 -0700 Subject: [PATCH 22/23] src/sage/rings/finite_rings/conway_polynomials.py: Fix # needs --- src/sage/rings/finite_rings/conway_polynomials.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sage/rings/finite_rings/conway_polynomials.py b/src/sage/rings/finite_rings/conway_polynomials.py index df677de6477..35604cbcd07 100644 --- a/src/sage/rings/finite_rings/conway_polynomials.py +++ b/src/sage/rings/finite_rings/conway_polynomials.py @@ -161,9 +161,8 @@ def __init__(self, p, use_database=True): """ TESTS:: - sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice - sage: # needs sage.rings.finite_rings + sage: from sage.rings.finite_rings.conway_polynomials import PseudoConwayLattice sage: PCL = PseudoConwayLattice(3) sage: PCL.polynomial(3) x^3 + 2*x + 1 From 744ddf8487f8ae88d5ae23c1057e8a8e5ceed554 Mon Sep 17 00:00:00 2001 From: Matthias Koeppe Date: Fri, 11 Aug 2023 19:45:05 -0700 Subject: [PATCH 23/23] src/sage/rings/finite_rings/residue_field.pyx: Make a doctest work when another impl is used --- src/sage/rings/finite_rings/residue_field.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/finite_rings/residue_field.pyx b/src/sage/rings/finite_rings/residue_field.pyx index 202dc5aa421..b466ee5e2c1 100644 --- a/src/sage/rings/finite_rings/residue_field.pyx +++ b/src/sage/rings/finite_rings/residue_field.pyx @@ -1563,8 +1563,8 @@ cdef class LiftingMap(Section): sage: R. = GF(2)[]; h = t^5 + t^2 + 1 sage: k. = R.residue_field(h) sage: K = R.fraction_field() - sage: L = k.lift_map(); L.codomain() # needs sage.libs.ntl - Univariate Polynomial Ring in t over Finite Field of size 2 (using GF2X) + sage: L = k.lift_map(); L.codomain() + Univariate Polynomial Ring in t over Finite Field of size 2... """ self._K = reduction._K self._F = reduction._F # finite field