Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segmentation fault on calling .change_ring() for a polynomial over AA #36101

Open
2 tasks done
maxale opened this issue Aug 18, 2023 · 2 comments · May be fixed by #39293
Open
2 tasks done

Segmentation fault on calling .change_ring() for a polynomial over AA #36101

maxale opened this issue Aug 18, 2023 · 2 comments · May be fixed by #39293

Comments

@maxale
Copy link
Contributor

maxale commented Aug 18, 2023

Steps To Reproduce

The following code causes Segmentation fault:

RR.<x, y, r, s0, c0, s1, c1> = AA[]
f = -4*r^2+(((1+2*AA(cos(pi/6)))*c0*r+2*c1*r+(1+2*AA(cos(pi/6)))*s0*r+2*s1*r)/2-1/2)^2+((1-(1+2*AA(cos(pi/6)))*c0*r-2*c1*r+(1+2*AA(cos(pi/6)))*s0*r+2*s1*r)/2-1/2)^2
f.change_ring( QuadraticField(3) )

Expected Behavior

The ring change should be done without an issue, since individually each coefficient is converted into an element of QuadraticField(3) without an issue:

sage: print( [QuadraticField(3)(c) for c in f.coefficients()] )
[a + 2, a + 2, 2*a + 2, 2, 2*a + 2, 2, -4, -1/2*a - 1/2, -1/2*a - 1/2, -1, -1, 1/4]

Actual Behavior

There is a long trace produced along with the fault, which I can provide upon request.

Additional Information

No response

Environment

- **OS**: Ubuntu 22.04.3 LTS
- **Sage Version**: 10.1.beta7

Checklist

  • I have searched the existing issues for a bug report that matches the one I want to file, without success.
  • I have read the documentation and troubleshoot guide
@maxale maxale added the t: bug label Aug 18, 2023
@mezzarobba
Copy link
Member

And this works:

sage: RR.<x, y, r, s0, c0, s1, c1> = AA[]
sage: f = -4*r^2+(((1+2*AA(cos(pi/6)))*c0*r+2*c1*r+(1+2*AA(cos(pi/6)))*s0*r+2*s1*r)/2-1/2)^2+((1-(1+2*AA(cos(p
....: i/6)))*c0*r-2*c1*r+(1+2*AA(cos(pi/6)))*s0*r+2*s1*r)/2-1/2)^2
sage: [QuadraticField(3)(c) for c in f.coefficients()]
[a + 2,
 a + 2,
 2*a + 2,
 2,
 2*a + 2,
 2,
 -4,
 -1/2*a - 1/2,
 -1/2*a - 1/2,
 -1,
 -1,
 1/4]
sage: f.change_ring( QuadraticField(3) )
(a + 2)*r^2*s0^2 + (a + 2)*r^2*c0^2 + (2*a + 2)*r^2*s0*s1 + 2*r^2*s1^2 + (2*a + 2)*r^2*c0*c1 + 2*r^2*c1^2 - 4*r^2 + (-1/2*a - 1/2)*r*s0 + (-1/2*a - 1/2)*r*c0 - r*s1 - r*c1 + 1/4

(but just converting one of the non-rational coefficients is not enough).

I suppose there is something wrong with the state of the Singular interface when change_ring() attempts to create the new polynomial, but I'm not familiar enough with Singular to understand what is going on. (@nbruin, @malb, do you have any idea?)

Here is the relevant part (I think) of the backtrace:

#8  0x00007f72eed14220 in __pyx_f_4sage_4libs_8singular_8singular_sa2si_NF () at /home/marc/co/sage/src/sage/libs/singular/singular.cpp:13195
  13190     *
  13191     *     nMapFuncPtr =  naSetMap(_ring.cf, currRing.cf) # choose correct mapping function             # <<<<<<<<<<<<<<
  13192     *
  13193     *     if nMapFuncPtr is NULL:
  13194     */
> 13195      __pyx_v_nMapFuncPtr = naSetMap(__pyx_v__ring->cf, currRing->cf);
  13196
  13197      /* "sage/libs/singular/singular.pyx":1423
  13198     *     nMapFuncPtr =  naSetMap(_ring.cf, currRing.cf) # choose correct mapping function
  13199     *
#9  0x00007f72ef88cd50 in __pyx_pf_4sage_5rings_10polynomial_28multi_polynomial_libsingular_27MPolynomialRing_libsingular_12_element_constructor_ () at /home/marc/co/sage/src/sage/rings/polynomial/multi_polynomial_libsingular.cpp:9966
  9961     *                             p_SetCoeff(mon, sa2si(c , _ring), _ring)             # <<<<<<<<<<<<<<
  9962     *                             for pos in m.nonzero_positions():
  9963     *                                 overflow_check(m[pos], _ring)
  9964     */
  9965                  if (!(likely(((__pyx_v_c) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_c, __pyx_ptype_4sage_9structure_7element_Element))))) __PYX_ERR(0, 904, __pyx_L54_error)
> 9966                  (void)(p_SetCoeff(__pyx_v_mon, __pyx_f_4sage_4libs_8singular_8singular_sa2si(((struct __pyx_obj_4sage_9structure_7element_Element *)__pyx_v_c), __pyx_v__ring), __pyx_v__ring));
  9967
  9968                  /* "sage/rings/polynomial/multi_polynomial_libsingular.pyx":905
  9969     *                             mon = p_Init(_ring)
  9970     *                             p_SetCoeff(mon, sa2si(c , _ring), _ring)
#10 0x0000000000544b70 in cfunction_call () at /build/python3.11-6qBZ2b/python3.11-3.11.4/build-static/../Objects/methodobject.c:542
#11 0x00007f733c19ddd5 in __Pyx_PyObject_Call () at /home/marc/co/sage/src/sage/structure/coerce_maps.c:14540
  14535        ternaryfunc call = Py_TYPE(func)->tp_call;
  14536        if (unlikely(!call))
  14537            return PyObject_Call(func, arg, kw);
  14538        if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
  14539            return NULL;
> 14540        result = (*call)(func, arg, kw);
  14541        Py_LeaveRecursiveCall();
  14542        if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
  14543            PyErr_SetString(
  14544                PyExc_SystemError,
#12 0x00007f733c19ddb0 in __Pyx__PyObject_CallOneArg () at /home/marc/co/sage/src/sage/structure/coerce_maps.c:14743
  14738        PyObject *result;
  14739        PyObject *args = PyTuple_New(1);
  14740        if (unlikely(!args)) return NULL;
  14741        Py_INCREF(arg);
  14742        PyTuple_SET_ITEM(args, 0, arg);
> 14743        result = __Pyx_PyObject_Call(func, args, NULL);
  14744        Py_DECREF(args);
  14745        return result;
  14746    }
  14747    static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
#13 0x00007f733c1ab478 in __Pyx_PyObject_CallOneArg () at /home/marc/co/sage/src/sage/structure/coerce_maps.c:14762
  14757            } else if (__Pyx_PyFastCFunction_Check(func)) {
  14758                return __Pyx_PyCFunction_FastCall(func, &arg, 1);
  14759    #endif
  14760            }
  14761        }
> 14762        return __Pyx__PyObject_CallOneArg(func, arg);
  14763    }
  14764    #else
  14765    static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
  14766        PyObject *result;
#14 0x00007f733c1ab2e0 in __pyx_f_4sage_9structure_11coerce_maps_24DefaultConvertMap_unique__call_ () at /home/marc/co/sage/src/sage/structure/coerce_maps.c:4719
  4714              __Pyx_INCREF(__pyx_t_3);
  4715              __Pyx_INCREF(function);
  4716              __Pyx_DECREF_SET(__pyx_t_2, function);
  4717            }
  4718          }
> 4719          __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_x) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_x);
  4720          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  4721          if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L3_error)
  4722          __Pyx_GOTREF(__pyx_t_1);
  4723          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

@user202729
Copy link
Contributor

Partial progress

diff --git a/src/sage/libs/singular/singular.pyx b/src/sage/libs/singular/singular.pyx
index dd1c5a35239..40cf99474af 100644
--- a/src/sage/libs/singular/singular.pyx
+++ b/src/sage/libs/singular/singular.pyx
@@ -1405,6 +1405,8 @@ cdef number *sa2si_NF(object elem, ring *_ring) noexcept:
 
     cdef nMapFunc nMapFuncPtr = NULL
 
+    if currRing.cf.type != n_algExt:
+        raise RuntimeError(f"{currRing.cf.type=}")
     nMapFuncPtr = naSetMap(_ring.cf, currRing.cf) # choose correct mapping function
 
     if nMapFuncPtr is NULL:

Reveals the type of currRing is 2 (i.e. QQ).

@user202729 user202729 linked a pull request Jan 6, 2025 that will close this issue
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants