From ee2117919d0d6d499aa5cf01d5dc7b05a4ede3fc Mon Sep 17 00:00:00 2001 From: Chenxin Zhong Date: Wed, 5 Nov 2025 22:05:40 +0800 Subject: [PATCH 1/3] Refine mres resolution length check for Singular Adjust handling of mres to account for trailing zero module in Singular. --- .../hyperplane_arrangement/arrangement.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/sage/geometry/hyperplane_arrangement/arrangement.py b/src/sage/geometry/hyperplane_arrangement/arrangement.py index 3f8f47bad37..2c54f2ec873 100644 --- a/src/sage/geometry/hyperplane_arrangement/arrangement.py +++ b/src/sage/geometry/hyperplane_arrangement/arrangement.py @@ -3472,7 +3472,20 @@ def is_free(self, algorithm='singular') -> bool: if algorithm == "singular": # TODO: Implement this using libSingular mres = self.defining_polynomial().jacobian_ideal()._singular_().mres(0) - return len(mres) <= 2 + # Newer versions of Singular include a trailing zero module (R^0). + # Check if the last element is trivial and exclude it from the count. + resolution_length = len(mres) + if resolution_length > 0: + try: + sing = mres.parent() + last_elem = mres[resolution_length] + # Check if this element is the zero module using size() + size_val = int(sing.eval(f"size({last_elem.name()})")) + if size_val == 0: # Trailing zero module + resolution_length -= 1 + except: + pass + return resolution_length <= 2 elif algorithm == "BC": return self.derivation_module_free_chain() is not None else: From 9155ceba63d36c5be38f18416d3605447edaaf6b Mon Sep 17 00:00:00 2001 From: Chenxin Zhong Date: Wed, 5 Nov 2025 22:12:37 +0800 Subject: [PATCH 2/3] Simplify resolution length check in arrangement.py Refactor the resolution length check to remove try-except block. --- .../hyperplane_arrangement/arrangement.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/sage/geometry/hyperplane_arrangement/arrangement.py b/src/sage/geometry/hyperplane_arrangement/arrangement.py index 2c54f2ec873..6ee5d9a6e90 100644 --- a/src/sage/geometry/hyperplane_arrangement/arrangement.py +++ b/src/sage/geometry/hyperplane_arrangement/arrangement.py @@ -3476,15 +3476,12 @@ def is_free(self, algorithm='singular') -> bool: # Check if the last element is trivial and exclude it from the count. resolution_length = len(mres) if resolution_length > 0: - try: - sing = mres.parent() - last_elem = mres[resolution_length] - # Check if this element is the zero module using size() - size_val = int(sing.eval(f"size({last_elem.name()})")) - if size_val == 0: # Trailing zero module - resolution_length -= 1 - except: - pass + sing = mres.parent() + last_elem = mres[resolution_length] + # Check if this element is the zero module using size() + size_val = int(sing.eval(f"size({last_elem.name()})")) + if size_val == 0: # Trailing zero module + resolution_length -= 1 return resolution_length <= 2 elif algorithm == "BC": return self.derivation_module_free_chain() is not None From a3c6bbd935c4ecfda573d4fad52cd15b17ecbb67 Mon Sep 17 00:00:00 2001 From: Chenxin Zhong Date: Thu, 6 Nov 2025 14:09:20 +0800 Subject: [PATCH 3/3] Refactor size calculation for last element --- src/sage/geometry/hyperplane_arrangement/arrangement.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/geometry/hyperplane_arrangement/arrangement.py b/src/sage/geometry/hyperplane_arrangement/arrangement.py index 6ee5d9a6e90..2023d17f4a3 100644 --- a/src/sage/geometry/hyperplane_arrangement/arrangement.py +++ b/src/sage/geometry/hyperplane_arrangement/arrangement.py @@ -3479,7 +3479,7 @@ def is_free(self, algorithm='singular') -> bool: sing = mres.parent() last_elem = mres[resolution_length] # Check if this element is the zero module using size() - size_val = int(sing.eval(f"size({last_elem.name()})")) + size_val = sing.size(last_elem) if size_val == 0: # Trailing zero module resolution_length -= 1 return resolution_length <= 2