From d2774399d5897ac760c09173a58ab4bfe36c711d Mon Sep 17 00:00:00 2001 From: pzinn Date: Sat, 23 May 2026 10:59:39 +1000 Subject: [PATCH] Reject zero substitutions in Laurent denominators --- M2/Macaulay2/e/ringmap.cpp | 6 +++++- M2/Macaulay2/tests/normal/subst.m2 | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/M2/Macaulay2/e/ringmap.cpp b/M2/Macaulay2/e/ringmap.cpp index 4822dfc4a8d..df6d1cbd201 100644 --- a/M2/Macaulay2/e/ringmap.cpp +++ b/M2/Macaulay2/e/ringmap.cpp @@ -5,6 +5,7 @@ #include "matrix-con.hpp" #include "polyring.hpp" #include "relem.hpp" +#include "exceptions.hpp" #include RingMap::RingMap(const Matrix *m) : R(m->get_ring()) @@ -147,7 +148,10 @@ ring_elem RingMap::eval_term(const Ring *sourceK, // source coeff ring { int v = first_var + i.var(); if (v >= nvars || _elem[v].is_zero) - return R->from_long(0); // The result is zero. + { + if (i.exponent() < 0) throw exc::division_by_zero_error(); + return R->from_long(0); // The result is zero. + } } // If K is a coeff ring of R, AND map is an identity on K, diff --git a/M2/Macaulay2/tests/normal/subst.m2 b/M2/Macaulay2/tests/normal/subst.m2 index c09bbd87d55..ab9c497b12e 100644 --- a/M2/Macaulay2/tests/normal/subst.m2 +++ b/M2/Macaulay2/tests/normal/subst.m2 @@ -4,6 +4,13 @@ I = matrix{{x^2,y^2}} P=matrix({{2,3,4}}) substitute(f,P) substitute(I,P) + +S = QQ[t,Inverses=>true,MonomialOrder=>Lex] +g = matrix{{t^-1,1/2}} +assert(try (sub(g,t=>0); false) else true) +assert(sub(matrix{{t,1/2}}, t=>0) == matrix{{0_QQ,1/2}}) +assert(sub(t^-1, t=>2) == 1/2) + end -- Local Variables: -- compile-command: "make -C $M2BUILDDIR/Macaulay2/packages/Macaulay2Doc/test subst.out"