From 3e06400d35d7b8f105e45e70ca9cfb3161d720b0 Mon Sep 17 00:00:00 2001 From: "Trevor K. Karn" Date: Mon, 22 Jan 2024 15:55:01 -0800 Subject: [PATCH 1/4] Initial commit of fix for #37108 --- .../algebras/exterior_algebra_groebner.pyx | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/sage/algebras/exterior_algebra_groebner.pyx b/src/sage/algebras/exterior_algebra_groebner.pyx index 265e9323536..f5aadb46772 100644 --- a/src/sage/algebras/exterior_algebra_groebner.pyx +++ b/src/sage/algebras/exterior_algebra_groebner.pyx @@ -477,13 +477,32 @@ cdef class GroebnerStrategy: 0 sage: I._groebner_strategy.reduce(E.zero()) 0 + + Check #37108 is fixed:: + + sage: E = ExteriorAlgebra(QQ, 6) + ....: E.inject_variables(verbose=False) + ....: gens = [-e0*e1*e2 + e0*e1*e5 - e0*e2*e3 - e0*e3*e5 + e1*e2*e3 + e1*e3*e5, + ....: e1*e2 - e1*e5 + e2*e5, + ....: e0*e2 - e0*e4 + e2*e4, + ....: e3*e4 - e3*e5 + e4*e5, + ....: e0*e1 - e0*e3 + e1*e3] + ....: I = E.ideal(gens) + ....: S = E.quo(I) + ....: I.reduce(e1*e3*e4*e5) + 0 """ if not f: return f # Make a copy to mutate f = type(f)(f._parent, copy(f._monomial_coefficients)) - for g in self.groebner_basis: - self.reduce_single(f, g) + was_reduced = True + while was_reduced: + was_reduced = False + for g in self.groebner_basis: + was_reduced = self.reduce_single(f, g) + if was_reduced: + break return f cdef bint reduce_single(self, CliffordAlgebraElement f, CliffordAlgebraElement g) except -1: From b1ffa01182e69d0325576cbc653ccf037030a5af Mon Sep 17 00:00:00 2001 From: "Trevor K. Karn" Date: Mon, 22 Jan 2024 22:34:55 -0800 Subject: [PATCH 2/4] Update doctest --- src/sage/algebras/exterior_algebra_groebner.pyx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sage/algebras/exterior_algebra_groebner.pyx b/src/sage/algebras/exterior_algebra_groebner.pyx index f5aadb46772..170b0dc43a3 100644 --- a/src/sage/algebras/exterior_algebra_groebner.pyx +++ b/src/sage/algebras/exterior_algebra_groebner.pyx @@ -481,15 +481,15 @@ cdef class GroebnerStrategy: Check #37108 is fixed:: sage: E = ExteriorAlgebra(QQ, 6) - ....: E.inject_variables(verbose=False) - ....: gens = [-e0*e1*e2 + e0*e1*e5 - e0*e2*e3 - e0*e3*e5 + e1*e2*e3 + e1*e3*e5, + sage: E.inject_variables(verbose=False) + sage: gens = [-e0*e1*e2 + e0*e1*e5 - e0*e2*e3 - e0*e3*e5 + e1*e2*e3 + e1*e3*e5, ....: e1*e2 - e1*e5 + e2*e5, ....: e0*e2 - e0*e4 + e2*e4, ....: e3*e4 - e3*e5 + e4*e5, ....: e0*e1 - e0*e3 + e1*e3] - ....: I = E.ideal(gens) - ....: S = E.quo(I) - ....: I.reduce(e1*e3*e4*e5) + sage: I = E.ideal(gens) + sage: S = E.quo(I) + sage: I.reduce(e1*e3*e4*e5) 0 """ if not f: From 7bbb66c9188720def73f458db495cb3ab33e7da1 Mon Sep 17 00:00:00 2001 From: trevorkarn <53057577+trevorkarn@users.noreply.github.com> Date: Tue, 23 Jan 2024 23:04:29 -0800 Subject: [PATCH 3/4] Documentation fix Co-authored-by: Travis Scrimshaw --- src/sage/algebras/exterior_algebra_groebner.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/algebras/exterior_algebra_groebner.pyx b/src/sage/algebras/exterior_algebra_groebner.pyx index 170b0dc43a3..6143bc774bd 100644 --- a/src/sage/algebras/exterior_algebra_groebner.pyx +++ b/src/sage/algebras/exterior_algebra_groebner.pyx @@ -478,7 +478,7 @@ cdef class GroebnerStrategy: sage: I._groebner_strategy.reduce(E.zero()) 0 - Check #37108 is fixed:: + Check :issue:`37108` is fixed:: sage: E = ExteriorAlgebra(QQ, 6) sage: E.inject_variables(verbose=False) From fa766d2e6a1b7d6025df5be93aac50e6c5c82f52 Mon Sep 17 00:00:00 2001 From: trevorkarn <53057577+trevorkarn@users.noreply.github.com> Date: Tue, 23 Jan 2024 23:04:46 -0800 Subject: [PATCH 4/4] Documentation enhancement Co-authored-by: Travis Scrimshaw --- src/sage/algebras/exterior_algebra_groebner.pyx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sage/algebras/exterior_algebra_groebner.pyx b/src/sage/algebras/exterior_algebra_groebner.pyx index 6143bc774bd..3afc924e7ae 100644 --- a/src/sage/algebras/exterior_algebra_groebner.pyx +++ b/src/sage/algebras/exterior_algebra_groebner.pyx @@ -483,10 +483,8 @@ cdef class GroebnerStrategy: sage: E = ExteriorAlgebra(QQ, 6) sage: E.inject_variables(verbose=False) sage: gens = [-e0*e1*e2 + e0*e1*e5 - e0*e2*e3 - e0*e3*e5 + e1*e2*e3 + e1*e3*e5, - ....: e1*e2 - e1*e5 + e2*e5, - ....: e0*e2 - e0*e4 + e2*e4, - ....: e3*e4 - e3*e5 + e4*e5, - ....: e0*e1 - e0*e3 + e1*e3] + ....: e1*e2 - e1*e5 + e2*e5, e0*e2 - e0*e4 + e2*e4, + ....: e3*e4 - e3*e5 + e4*e5, e0*e1 - e0*e3 + e1*e3] sage: I = E.ideal(gens) sage: S = E.quo(I) sage: I.reduce(e1*e3*e4*e5)