From f67d72da4754832c7ed0b85cf8c08be42725a6bd Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Wed, 1 Oct 2025 21:13:58 +0700 Subject: [PATCH] Fix finite field GF(p).extension(1, names=tuple) --- .../rings/finite_rings/finite_field_base.pyx | 15 +++++++++ .../finite_rings/finite_field_constructor.py | 33 +++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/finite_rings/finite_field_base.pyx b/src/sage/rings/finite_rings/finite_field_base.pyx index 3eed6a7e4b8..09543a1846f 100644 --- a/src/sage/rings/finite_rings/finite_field_base.pyx +++ b/src/sage/rings/finite_rings/finite_field_base.pyx @@ -1421,6 +1421,21 @@ cdef class FiniteField(Field): sage: L. = K.extension(b) sage: L(u).minpoly() == u.minpoly() True + + Check the test above when `a=b=1`, see :issue:`40926`. + While in general it doesn't make much sense to talk about the generator + of a prime finite field (:meth:`gen` returns 1), generic code may find + it convenient to always specify the variable name when it is not known + in advance whether the exponent is 1. + + The reason why one may want to specify ``name`` is :issue:`38376`. + + :: + + sage: K. = GF((random_prime(10^100), 1)) + sage: L. = K.extension(1) + sage: L(u).minpoly() == u.minpoly() + True """ from sage.rings.finite_rings.finite_field_constructor import GF from sage.rings.polynomial.polynomial_element import Polynomial diff --git a/src/sage/rings/finite_rings/finite_field_constructor.py b/src/sage/rings/finite_rings/finite_field_constructor.py index 2a9f1952a47..015144db4ed 100644 --- a/src/sage/rings/finite_rings/finite_field_constructor.py +++ b/src/sage/rings/finite_rings/finite_field_constructor.py @@ -597,7 +597,7 @@ def create_key_and_extra_args(self, order, name=None, modulus=None, names=None, sage: GF((5, 1), 3) Traceback (most recent call last): ... - TypeError: variable name 3 must be a string, not + TypeError: 'sage.rings.integer.Integer' object is not iterable sage: GF((5, 2), 3) Traceback (most recent call last): ... @@ -610,6 +610,35 @@ def create_key_and_extra_args(self, order, name=None, modulus=None, names=None, Traceback (most recent call last): ... ValueError: the order of a finite field must be a prime power + + We expect ``name`` to be a string (if it is a single name) and ``names`` to be + a tuple of strings, but for backwards compatibility this is not enforced. + This behavior might change in the future. :: + + sage: GF(7, name='aa') + Finite Field of size 7 + sage: GF(7^2, name='aa') + Finite Field in aa of size 7^2 + sage: GF(7, name=('aa',)) + Finite Field of size 7 + sage: GF(7^2, name=('aa',)) + Finite Field in aa of size 7^2 + sage: GF(7, name=['aa']) + Finite Field of size 7 + sage: GF(7^2, name=['aa']) + Finite Field in aa of size 7^2 + sage: GF(7, names='aa') + Finite Field of size 7 + sage: GF(7^2, names='aa') + Finite Field in aa of size 7^2 + sage: GF(7, names=('aa',)) + Finite Field of size 7 + sage: GF(7^2, names=('aa',)) + Finite Field in aa of size 7^2 + sage: GF(7, names=['aa']) + Finite Field of size 7 + sage: GF(7^2, names=['aa']) + Finite Field in aa of size 7^2 """ for key, val in kwds.items(): if key not in ['structure', 'implementation', 'prec', 'embedding', 'latex_names']: @@ -646,7 +675,7 @@ def create_key_and_extra_args(self, order, name=None, modulus=None, names=None, if impl is None: impl = 'modn' if name is not None: - certify_names((name,)) + certify_names((name,) if isinstance(name, str) else name) name = ('x',) # Ignore name # Every polynomial of degree 1 is irreducible check_irreducible = False