From 6f6dd06f046385cb29d321bb3d63244312dd2852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Wed, 8 Mar 2023 11:51:54 +0100 Subject: [PATCH 1/3] using "change_ring" in quadratic_forms --- src/sage/algebras/clifford_algebra.py | 4 ++-- src/sage/quadratic_forms/count_local_2.pyx | 17 +++-------------- src/sage/quadratic_forms/quadratic_form.py | 9 ++++++--- .../quadratic_form__local_field_invariants.py | 2 +- .../quadratic_form__mass__Siegel_densities.py | 10 +++++----- 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/sage/algebras/clifford_algebra.py b/src/sage/algebras/clifford_algebra.py index 04d9b3f0cae..84b5af5237e 100644 --- a/src/sage/algebras/clifford_algebra.py +++ b/src/sage/algebras/clifford_algebra.py @@ -571,8 +571,8 @@ def _coerce_map_from_(self, V): Q = self._quadratic_form try: return (V.variable_names() == self.variable_names() and - V._quadratic_form.base_change_to(self.base_ring()) == Q) - except Exception: + V._quadratic_form.change_ring(self.base_ring()) == Q) + except AttributeError: return False if self.free_module().has_coerce_map_from(V): diff --git a/src/sage/quadratic_forms/count_local_2.pyx b/src/sage/quadratic_forms/count_local_2.pyx index 36b6b9d593c..cb3290da9f4 100644 --- a/src/sage/quadratic_forms/count_local_2.pyx +++ b/src/sage/quadratic_forms/count_local_2.pyx @@ -90,10 +90,6 @@ def count_modp__by_gauss_sum(n, p, m, Qdet): return count - - - - cdef CountAllLocalTypesNaive_cdef(Q, p, k, m, zvec, nzvec): """ This Cython routine is documented in its Python wrapper method @@ -104,26 +100,21 @@ cdef CountAllLocalTypesNaive_cdef(Q, p, k, m, zvec, nzvec): cdef long ptr # Used to increment the vector cdef long solntype # Used to store the kind of solution we find - # Some shortcuts and definitions n = Q.dim() R = p ** k - Q1 = Q.base_change_to(IntegerModRing(R)) - + Q1 = Q.change_ring(IntegerModRing(R)) # Cython Variables cdef IntegerMod_gmp zero, one zero = IntegerMod_gmp(IntegerModRing(R), 0) one = IntegerMod_gmp(IntegerModRing(R), 1) - - # Initialize the counting vector - count_vector = [0 for i in range(6)] + count_vector = [0 for i in range(6)] # Initialize v = (0, ... , 0) - v = [Mod(0, R) for i in range(n)] - + v = [Mod(0, R) for i in range(n)] # Some declarations to speed up the loop R_n = R ** n @@ -142,7 +133,6 @@ cdef CountAllLocalTypesNaive_cdef(Q, p, k, m, zvec, nzvec): if (ptr > 0): v[ptr-1] += 1 - # Evaluate Q(v) quickly tmp_val = Mod(0, R) for a from 0 <= a < n: @@ -156,7 +146,6 @@ cdef CountAllLocalTypesNaive_cdef(Q, p, k, m, zvec, nzvec): if (solntype != 0): count_vector[solntype] += 1 - # Generate the Bad-type and Total counts count_vector[3] = count_vector[4] + count_vector[5] count_vector[0] = count_vector[1] + count_vector[2] + count_vector[3] diff --git a/src/sage/quadratic_forms/quadratic_form.py b/src/sage/quadratic_forms/quadratic_form.py index f53602f49f3..e80b475d53a 100644 --- a/src/sage/quadratic_forms/quadratic_form.py +++ b/src/sage/quadratic_forms/quadratic_form.py @@ -39,6 +39,8 @@ from sage.quadratic_forms.quadratic_form__evaluate import QFEvaluateVector, QFEvaluateMatrix from sage.structure.sage_object import SageObject from sage.combinat.integer_lists.invlex import IntegerListsLex +from sage.misc.superseded import deprecated_function_alias + def QuadraticForm__constructor(R, n=None, entries=None): """ @@ -1554,8 +1556,7 @@ def Gram_det(self): """ return self.det() / ZZ(2**self.dim()) - - def base_change_to(self, R): + def change_ring(self, R): """ Alters the quadratic form to have all coefficients defined over the new base_ring R. Here R must be @@ -1582,7 +1583,7 @@ def base_change_to(self, R): :: - sage: Q1 = Q.base_change_to(IntegerModRing(5)); Q1 + sage: Q1 = Q.change_ring(IntegerModRing(5)); Q1 Quadratic form in 2 variables over Ring of integers modulo 5 with coefficients: [ 1 0 ] [ * 1 ] @@ -1599,6 +1600,8 @@ def base_change_to(self, R): # Return the coerced form return QuadraticForm(R, self.dim(), [R(x) for x in self.coefficients()]) + base_change_to = deprecated_function_alias(35555, change_ring) + def level(self): r""" Determines the level of the quadratic form over a PID, which is a diff --git a/src/sage/quadratic_forms/quadratic_form__local_field_invariants.py b/src/sage/quadratic_forms/quadratic_form__local_field_invariants.py index 3556c101705..3413bf34137 100644 --- a/src/sage/quadratic_forms/quadratic_form__local_field_invariants.py +++ b/src/sage/quadratic_forms/quadratic_form__local_field_invariants.py @@ -223,7 +223,7 @@ def _rational_diagonal_form_and_transformation(self): """ n = self.dim() K = self.base_ring().fraction_field() - Q = self.base_change_to(K) + Q = self.change_ring(K) MS = MatrixSpace(K, n, n) try: diff --git a/src/sage/quadratic_forms/quadratic_form__mass__Siegel_densities.py b/src/sage/quadratic_forms/quadratic_form__mass__Siegel_densities.py index 97b07023060..f16727d821a 100644 --- a/src/sage/quadratic_forms/quadratic_form__mass__Siegel_densities.py +++ b/src/sage/quadratic_forms/quadratic_form__mass__Siegel_densities.py @@ -10,7 +10,7 @@ # Copyright by Jonathan Hanke 2007 ######################################################################## -import copy +from copy import deepcopy from sage.misc.misc_c import prod from sage.misc.mrange import mrange @@ -192,7 +192,7 @@ def Watson_mass_at_2(self): """ # Make a 0-dim'l quadratic form (for initialization purposes) - Null_Form = copy.deepcopy(self) + Null_Form = deepcopy(self) Null_Form.__init__(ZZ, 0) # Step 0: Compute Jordan blocks and bounds of the scales to keep track of @@ -231,7 +231,7 @@ def Watson_mass_at_2(self): eps_dict = {} for j in range(s_min, s_max+3): two_form = (diag_dict[j-2] + diag_dict[j] + dim2_dict[j]).scale_by_factor(2) - j_form = (two_form + diag_dict[j-1]).base_change_to(IntegerModRing(4)) + j_form = (two_form + diag_dict[j-1]).change_ring(IntegerModRing(4)) if j_form.dim() == 0: eps_dict[j] = 1 @@ -280,7 +280,7 @@ def Kitaoka_mass_at_2(self): """ # Make a 0-dim'l quadratic form (for initialization purposes) - Null_Form = copy.deepcopy(self) + Null_Form = deepcopy(self) Null_Form.__init__(ZZ, 0) # Step 0: Compute Jordan blocks and bounds of the scales to keep track of @@ -373,7 +373,7 @@ def mass_at_two_by_counting_mod_power(self, k): 4 """ R = IntegerModRing(2**k) - Q1 = self.base_change_to(R) + Q1 = self.change_ring(R) n = self.dim() MS = MatrixSpace(R, n) From 39fe637e7c8daf19ce85f82b1883dcc704329887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Wed, 8 Mar 2023 11:54:08 +0100 Subject: [PATCH 2/3] correct PR number --- src/sage/quadratic_forms/quadratic_form.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/sage/quadratic_forms/quadratic_form.py b/src/sage/quadratic_forms/quadratic_form.py index e80b475d53a..74a0eded621 100644 --- a/src/sage/quadratic_forms/quadratic_form.py +++ b/src/sage/quadratic_forms/quadratic_form.py @@ -1581,8 +1581,6 @@ def change_ring(self, R): [ 1 0 ] [ * 1 ] - :: - sage: Q1 = Q.change_ring(IntegerModRing(5)); Q1 Quadratic form in 2 variables over Ring of integers modulo 5 with coefficients: [ 1 0 ] @@ -1590,7 +1588,6 @@ def change_ring(self, R): sage: Q1([35,11]) 1 - """ # Check that a canonical coercion is possible if not is_Ring(R): @@ -1600,7 +1597,7 @@ def change_ring(self, R): # Return the coerced form return QuadraticForm(R, self.dim(), [R(x) for x in self.coefficients()]) - base_change_to = deprecated_function_alias(35555, change_ring) + base_change_to = deprecated_function_alias(35248, change_ring) def level(self): r""" From 70e030348c2cb2e78e0ea216b6ab2004f0738910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Wed, 8 Mar 2023 15:56:12 +0100 Subject: [PATCH 3/3] fix doctest --- src/sage/algebras/clifford_algebra.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/algebras/clifford_algebra.py b/src/sage/algebras/clifford_algebra.py index 84b5af5237e..220a2eb27a5 100644 --- a/src/sage/algebras/clifford_algebra.py +++ b/src/sage/algebras/clifford_algebra.py @@ -572,7 +572,7 @@ def _coerce_map_from_(self, V): try: return (V.variable_names() == self.variable_names() and V._quadratic_form.change_ring(self.base_ring()) == Q) - except AttributeError: + except (TypeError, AttributeError): return False if self.free_module().has_coerce_map_from(V):