From 7792961084750045b22c5d0756b82732ff08ee91 Mon Sep 17 00:00:00 2001 From: Gustavo Rama Date: Thu, 11 Sep 2014 08:11:10 -0300 Subject: [PATCH 1/2] Eliminates the use of matrix constructor in internal loop of the function sage.quadratic_forms.ternary._reduced_ternary_form_eisenstein_with_matrix. --- src/sage/quadratic_forms/ternary.pyx | 183 +++++++++++++++++++-------- 1 file changed, 128 insertions(+), 55 deletions(-) diff --git a/src/sage/quadratic_forms/ternary.pyx b/src/sage/quadratic_forms/ternary.pyx index ddcfbfdb6a9..37d2e17105a 100644 --- a/src/sage/quadratic_forms/ternary.pyx +++ b/src/sage/quadratic_forms/ternary.pyx @@ -67,23 +67,31 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): sage: Q(M) == Qr True """ - M = identity_matrix(3) + # M = identity_matrix(3) + # M = matrix(ZZ, 3, [m11, m12, m13, m21, m22, m23, m31, m32, m33]) + m11, m12, m13, m21, m22, m23, m31, m32, m33 = 1, 0, 0, 0, 1, 0, 0, 0, 1 loop = True while loop: # adjust - v = a1+a2+a23+a13+a12 - if v < 0: - M *= matrix(ZZ, 3, [1, 0, 1, 0, 1, 1, 0, 0, 1]) + v = a1 + a2 + a23 + a13 + a12 + if (v < 0): + # M *= matrix(ZZ, 3, [1, 0, 1, 0, 1, 1, 0, 0, 1]) + [m13] = [m11 + m12 + m13] + [m23] = [m21 + m22 + m23] + [m33] = [m31 + m32 + m33] a3 += v - a23 += a12+2*a2 - a13 += a12+2*a1 + a23 += a12 + 2*a2 + a13 += a12 + 2*a1 # cuadred 12 m = red_mfact(a1, a12) - M *= matrix(ZZ, 3, [1, m, 0, 0, 1, 0, 0, 0, 1]) + # M *= matrix(ZZ, 3, [1, m, 0, 0, 1, 0, 0, 0, 1]) + [m12] = [m*m11 + m12] + [m22] = [m*m21 + m22] + [m32] = [m*m31 + m32] t = a1*m a12 += t a2 += a12*m @@ -92,7 +100,10 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): # cuadred 23 m = red_mfact(a2, a23) - M *= matrix(ZZ, 3, [1, 0, 0, 0, 1, m, 0, 0, 1]) + # M *= matrix(ZZ, 3, [1, 0, 0, 0, 1, m, 0, 0, 1]) + [m13] = [m*m12 + m13] + [m23] = [m*m22 + m23] + [m33] = [m*m32 + m33] t = a2*m a23 += t a3 += a23*m @@ -101,7 +112,10 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): # cuadred 13 m = red_mfact(a1, a13) - M *= matrix(ZZ, 3, [1, 0, m, 0, 1, 0, 0, 0, 1]) + # M *= matrix(ZZ, 3, [1, 0, m, 0, 1, 0, 0, 0, 1]) + [m13] = [m*m11 + m13] + [m23] = [m*m21 + m23] + [m33] = [m*m31 + m33] t = a1*m a13 += t a3 += a13*m @@ -110,19 +124,28 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): # order 12 if a1 > a2 or (a1 == a2 and abs(a23) > abs(a13)): - M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + [m11, m12, m13] = [-m12, -m11, -m13] + [m21, m22, m23] = [-m22, -m21, -m23] + [m31, m32, m33] = [-m32, -m31, -m33] [a1, a2] = [a2, a1] [a13, a23] = [a23, a13] # order 23 if a2 > a3 or (a2 == a3 and abs(a13) > abs(a12)): - M *= matrix(ZZ, 3, [-1, 0, 0, 0, 0, -1, 0, -1, 0]) + # M *= matrix(ZZ, 3, [-1, 0, 0, 0, 0, -1, 0, -1, 0]) + [m11, m12, m13] = [-m11, -m13, -m12] + [m21, m22, m23] = [-m21, -m23, -m22] + [m31, m32, m33] = [-m31, -m33, -m32] [a2, a3] = [a3, a2] [a13, a12] = [a12, a13] # order 12 if a1 > a2 or (a1 == a2 and abs(a23) > abs(a13)): - M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + [m11, m12, m13] = [-m12, -m11, -m13] + [m21, m22, m23] = [-m22, -m21, -m23] + [m31, m32, m33] = [-m32, -m31, -m33] [a1, a2] = [a2, a1] [a13, a23] = [a23, a13] @@ -130,110 +153,160 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): if a23*a13*a12 > 0: # a23, a13, a12 positive - if a23 < 0: - M *= diagonal_matrix([-1, 1, 1]) + if (a23 < 0): + # M *= diagonal_matrix([-1, 1, 1]) + m11 = -m11 + m21 = -m21 + m31 = -m31 a23 = -a23 - if a13 < 0: - M *= diagonal_matrix([1, -1, 1]) - a13 = -a13 - if a12 < 0: - M *= diagonal_matrix([1, 1, -1]) + if (a13 < 0): + # M *= diagonal_matrix([1, -1, 1]) + m12 = -m12 + m22 = -m22 + m32 = -m32 + a13=-a13 + if (a12 < 0): + # M *= diagonal_matrix([1, 1, -1]) + m13 = -m13 + m23 = -m23 + m33 = -m33 a12 = -a12 else: # a23, a13, a12 nonpositive [s1, s2, s3] = [a23 > 0, a13 > 0, a12 > 0] - if (s1+s2+s3) % 2: + if (s1 + s2 + s3) % 2: if a23 == 0: s1 = 1 else: if a13 == 0: s2 = 1 else: - if a12 == 0: + if (a12 == 0): s3 = 1 if s1: - M *= diagonal_matrix([-1, 1, 1]) - a23 = -a23 + # M *= diagonal_matrix([-1, 1, 1]) + m11 = -m11 + m21 = -m21 + m31 = -m31 + a23 = -a23 if s2: - M *= diagonal_matrix([1, -1, 1]) - a13 = -a13 + # M *= diagonal_matrix([1, -1, 1]) + m12 = -m12 + m22 = -m22 + m32 = -m32 + a13 = -a13 if s3: - M *= diagonal_matrix([1, 1, -1]) - a12 = -a12 + # M *= diagonal_matrix([1, 1, -1]) + m13 = -m13 + m23 = -m23 + m33 = -m33 + a12 = -a12 - loop = not (abs(a23) <= a2 and abs(a13) <= a1 and abs(a12) <= a1 and a1+a2+a23+a13+a12 >= 0) + loop = not (abs(a23) <= a2 and abs(a13) <= a1 and abs(a12) <= a1 and a1 + a2 + a23 + a13 + a12 >= 0) # adj 3 - if a1+a2+a23+a13+a12 == 0 and 2*a1+2*a13+a12 > 0: - M *= matrix(ZZ, 3, [-1, 0, 1, 0, -1, 1, 0, 0, 1]) - # a3 += a1+a2+a23+a13+a12 - a23 = -2*a2-a23-a12 - a13 = -2*a1-a13-a12 + if a1 + a2 + a23 + a13 + a12 == 0 and 2*a1 + 2*a13 + a12 > 0: + # M *= matrix(ZZ, 3, [-1, 0, 1, 0, -1, 1, 0, 0, 1]) + [m11, m12, m13] = [-m11, -m12, m11 + m12 + m13] + [m21, m22, m23] = [-m21, -m22, m21 + m22 + m23] + [m31, m32, m33] = [-m31, -m32, m31 + m32 + m33] + # a3 += a1+a2+a23+a13+a12 = 0 + a23 = -2*a2 - a23 - a12 + a13 = -2*a1 - a13 - a12 # adj 5.12 if a1 == -a12 and a13 != 0: - M *= matrix(ZZ, 3, [-1, -1, 0, 0, -1, 0, 0, 0, 1]) - # a2 += a1+a12 - a23 = -a23-a13 + # M *= matrix(ZZ, 3, [-1, -1, 0, 0, -1, 0, 0, 0, 1]) + [m11, m12] = [-m11, -m11 - m12] + [m21, m22] = [-m21, -m21 - m22] + [m31, m32] = [-m31, -m31 - m32] + # a2 += a1 + a12 = 0 + a23 = -a23 - a13 a13 = -a13 - a12 = -a12 # = 2*a1+a12 + a12 = -a12 # = 2*a1 + a12 # adj 5.13 if a1 == -a13 and a12 != 0: - M *= matrix(ZZ, 3, [-1, 0, -1, 0, 1, 0, 0, 0, -1]) - # a3 += a1+a13 - a23 = -a23-a12 - a13 = -a13 # = 2*a1+a13 + # M *= matrix(ZZ, 3, [-1, 0, -1, 0, 1, 0, 0, 0, -1]) + [m11, m13] = [-m11, -m11 - m13] + [m21, m23] = [-m21, -m21 - m23] + [m31, m33] = [-m31, -m31 - m33] + # a3 += a1 + a13 = 0 + a23 = -a23 - a12 + a13 = -a13 # = 2*a1 + a13 a12 = -a12 # adj 5.23 if a2 == -a23 and a12 != 0: - M *= matrix(ZZ, 3, [1, 0, 0, 0, -1, -1, 0, 0, -1]) - # a3 += a2+a23 - a23 = -a23 # = 2*a2+a23 - a13 = -a13-a12 + # M *= matrix(ZZ, 3, [1, 0, 0, 0, -1, -1, 0, 0, -1]) + [m12, m13] = [-m12, -m12 - m13] + [m22, m23] = [-m22, -m22 - m23] + [m32, m33] = [-m32, -m32 - m33] + # a3 += a2 + a23 = 0 + a23 = -a23 # = 2*a2 + a23 + a13 = -a13 - a12 a12 = -a12 # adj 4.12 if a1 == a12 and a13 > 2*a23: - M *= matrix(ZZ, 3, [-1, -1, 0, 0, 1, 0, 0, 0, -1]) - # a 2 += a1-a12 + # M *= matrix(ZZ, 3, [-1, -1, 0, 0, 1, 0, 0, 0, -1]) + [m11, m12, m13] = [-m11, -m11 + m12, -m13] + [m21, m22, m23] = [-m21, -m21 + m22, -m23] + [m31, m32, m33] = [-m31, -m31 + m32, -m33] + # a2 += a1 - a12 = 0 a23 = -a23 + a13 # a12 = 2*a1 - a12 # adj 4.13 if a1 == a13 and a12 > 2*a23: - M *= matrix(ZZ, 3, [-1, 0, -1, 0, -1, 0, 0, 0, 1]) - # a3 += a1-a13 + # M *= matrix(ZZ, 3, [-1, 0, -1, 0, -1, 0, 0, 0, 1]) + [m11, m12, m13] = [-m11, -m12, -m11 + m13] + [m21, m22, m23] = [-m21, -m22, -m21 + m23] + [m31, m32, m33] = [-m31, -m32, -m31 + m33] + # a3 += a1 - a13 = 0 a23 = -a23 + a12 # a13 = 2*a1 - a13 # adj 4.23 if a2 == a23 and a12 > 2*a13: - M *= matrix(ZZ, 3, [-1, 0, 0, 0, -1, -1, 0, 0, 1]) - # a3 += a2-a23 + # M *= matrix(ZZ, 3, [-1, 0, 0, 0, -1, -1, 0, 0, 1]) + [m11, m12, m13] = [-m11, -m12, -m12 + m13] + [m21, m22, m23] = [-m21, -m22, -m22 + m23] + [m31, m32, m33] = [-m31, -m32, -m32 + m33] + # a3 += a2 - a23 = 0 # a23 = 2*a2 - a23 a13 = -a13 + a12 # order 12 if a1 == a2 and abs(a23) > abs(a13): - M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + [m11, m12, m13] = [-m12, -m11, -m13] + [m21, m22, m23] = [-m22, -m21, -m23] + [m31, m32, m33] = [-m32, -m31, -m33] [a1, a2] = [a2, a1] [a13, a23] = [a23, a13] # order 23 if a2 == a3 and abs(a13) > abs(a12): - M *= matrix(ZZ, 3, [-1, 0, 0, 0, 0, -1, 0, -1, 0]) + # M *= matrix(ZZ, 3, [-1, 0, 0, 0, 0, -1, 0, -1, 0]) + [m11, m12, m13] = [-m11, -m13, -m12] + [m21, m22, m23] = [-m21, -m23, -m22] + [m31, m32, m33] = [-m31, -m33, -m32] [a13, a12] = [a12, a13] # order 12 if a1 == a2 and abs(a23) > abs(a13): - M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + # M *= matrix(ZZ, 3, [0, -1, 0, -1, 0, 0, 0, 0, -1]) + [m11, m12, m13] = [-m12, -m11, -m13] + [m21, m22, m23] = [-m22, -m21, -m23] + [m31, m32, m33] = [-m32, -m31, -m33] [a13, a23] = [a23, a13] - return (a1, a2, a3, a23, a13, a12), M + return (a1, a2, a3, a23, a13, a12), \ + matrix(ZZ, 3, (m11, m12, m13, m21, m22, m23, m31, m32, m33)) + def _reduced_ternary_form_eisenstein_without_matrix(a1, a2, a3, a23, a13, a12): From e3a46ed56a5edca89d36c3f6b5fe56d995bb927a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonzalo=20Tornar=C3=ADa?= Date: Thu, 26 Oct 2023 22:29:06 -0300 Subject: [PATCH 2/2] Fix linter in previous commit --- src/sage/quadratic_forms/ternary.pyx | 33 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/sage/quadratic_forms/ternary.pyx b/src/sage/quadratic_forms/ternary.pyx index 37d2e17105a..28dd9514c30 100644 --- a/src/sage/quadratic_forms/ternary.pyx +++ b/src/sage/quadratic_forms/ternary.pyx @@ -164,7 +164,7 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): m12 = -m12 m22 = -m22 m32 = -m32 - a13=-a13 + a13 = -a13 if (a12 < 0): # M *= diagonal_matrix([1, 1, -1]) m13 = -m13 @@ -186,23 +186,23 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): if (a12 == 0): s3 = 1 if s1: - # M *= diagonal_matrix([-1, 1, 1]) - m11 = -m11 - m21 = -m21 - m31 = -m31 - a23 = -a23 + # M *= diagonal_matrix([-1, 1, 1]) + m11 = -m11 + m21 = -m21 + m31 = -m31 + a23 = -a23 if s2: - # M *= diagonal_matrix([1, -1, 1]) - m12 = -m12 - m22 = -m22 - m32 = -m32 - a13 = -a13 + # M *= diagonal_matrix([1, -1, 1]) + m12 = -m12 + m22 = -m22 + m32 = -m32 + a13 = -a13 if s3: - # M *= diagonal_matrix([1, 1, -1]) - m13 = -m13 - m23 = -m23 - m33 = -m33 - a12 = -a12 + # M *= diagonal_matrix([1, 1, -1]) + m13 = -m13 + m23 = -m23 + m33 = -m33 + a12 = -a12 loop = not (abs(a23) <= a2 and abs(a13) <= a1 and abs(a12) <= a1 and a1 + a2 + a23 + a13 + a12 >= 0) @@ -308,7 +308,6 @@ def _reduced_ternary_form_eisenstein_with_matrix(a1, a2, a3, a23, a13, a12): matrix(ZZ, 3, (m11, m12, m13, m21, m22, m23, m31, m32, m33)) - def _reduced_ternary_form_eisenstein_without_matrix(a1, a2, a3, a23, a13, a12): """ Find the coefficients of the equivalent unique reduced ternary form according to the conditions