From a7de32424b471a47ce86ca633a996f998d8cbf56 Mon Sep 17 00:00:00 2001 From: Chenxin Zhong Date: Fri, 5 Dec 2025 00:02:23 +0800 Subject: [PATCH 1/3] Evaluate direction after multiplication with normalization --- src/sage/symbolic/ginac/infinity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/symbolic/ginac/infinity.cpp b/src/sage/symbolic/ginac/infinity.cpp index 187ff7ac67d..02db754c1f0 100644 --- a/src/sage/symbolic/ginac/infinity.cpp +++ b/src/sage/symbolic/ginac/infinity.cpp @@ -314,7 +314,7 @@ void infinity::set_direction(const ex & new_direction) direction = _ex0; else { ex normalization = GiNaC::pow(GiNaC::abs(new_direction),-1); - direction = mul(new_direction, normalization); + direction = mul(new_direction, normalization).eval(); } hashvalue = hash_from_dir(direction); } From 655630f81d3896982986f59dff8ebaf6f545a937 Mon Sep 17 00:00:00 2001 From: Chenxin Zhong Date: Sat, 6 Dec 2025 14:54:34 +0800 Subject: [PATCH 2/3] Remove unnecessary eval() call on direction --- src/sage/symbolic/ginac/infinity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sage/symbolic/ginac/infinity.cpp b/src/sage/symbolic/ginac/infinity.cpp index 02db754c1f0..187ff7ac67d 100644 --- a/src/sage/symbolic/ginac/infinity.cpp +++ b/src/sage/symbolic/ginac/infinity.cpp @@ -314,7 +314,7 @@ void infinity::set_direction(const ex & new_direction) direction = _ex0; else { ex normalization = GiNaC::pow(GiNaC::abs(new_direction),-1); - direction = mul(new_direction, normalization).eval(); + direction = mul(new_direction, normalization); } hashvalue = hash_from_dir(direction); } From 795a86c1287bd2ec6b1db4a6f268f3011e971e10 Mon Sep 17 00:00:00 2001 From: Chenxin Zhong Date: Sat, 6 Dec 2025 14:56:17 +0800 Subject: [PATCH 3/3] Enhance relational operator handling for infinities Added checks for zero differences in relational comparisons involving infinities, improving handling of symbolic expressions. --- src/sage/symbolic/ginac/relational.cpp | 35 ++++++++++++++++++-------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/sage/symbolic/ginac/relational.cpp b/src/sage/symbolic/ginac/relational.cpp index 44d8f644083..afacc21119c 100644 --- a/src/sage/symbolic/ginac/relational.cpp +++ b/src/sage/symbolic/ginac/relational.cpp @@ -400,20 +400,35 @@ relational::result relational::decide() const const infinity & rh_inf = ex_to(rh); const ex df = lh_inf.get_direction() - rh_inf.get_direction(); - if (!is_exactly_a(df)) - return result::notimplemented; + // First check if the difference is zero (handles both numeric zero + // and symbolic expressions that simplify to zero, e.g. when comparing + // infinities with identical complex directions like (1+I)*oo == (2+2I)*oo) + if (df.is_zero()) { + switch (o) { + case equal: + return result::True; + case not_equal: + return result::False; + case less: + case greater: + return result::False; + case less_or_equal: + case greater_or_equal: + return result::True; + default: + throw(std::logic_error("invalid relational operator")); + } + } + + // For non-zero differences, we need a numeric to proceed + if (!is_exactly_a(df)) + return result::notimplemented; switch (o) { case equal: - if (ex_to(df).is_zero()) - return result::True; - else - return result::False; + return result::False; case not_equal: - if (ex_to(df).is_zero()) - return result::False; - else - return result::True; + return result::True; case less: case less_or_equal: if (lh_inf.is_minus_infinity() and rh_inf.is_plus_infinity())