#20693: Sage crashes when computing newforms
---------------------------------+------------------------
       Reporter:  ehlen          |        Owner:
           Type:  defect         |       Status:  new
       Priority:  critical       |    Milestone:  sage-7.3
      Component:  modular forms  |   Resolution:
       Keywords:                 |    Merged in:
        Authors:                 |    Reviewers:
Report Upstream:  N/A            |  Work issues:
         Branch:                 |       Commit:
   Dependencies:                 |     Stopgaps:
---------------------------------+------------------------

Comment (by pbruin):

 Replying to [comment:20 ehlen]:
 > I tried to debug this and catch the NTL exception but I failed.
 > Can someone help me? How do I properly catch the exception that NTL is
 probably raising?
 > I tried adding except + to the declarations of ZZX_XGCD in ZZX.pxd and
 then subsequently to _invert_c and wrapped the call to _invert_c in
 try:...:except: but that didn't work... I'm probably doing something
 stupid.
 The method `_invert_c()` should be declared `except *` instead of `except
 +`, and you have to wrap the NTL calls in `sig_on()...sig_off()`.  I made
 the following changes (not sure if the `except +` on `ZZX_XGCD` is
 actually necessary):
 {{{
 #!diff
 --- a/src/sage/libs/ntl/ZZX.pxd
 +++ b/src/sage/libs/ntl/ZZX.pxd
 @@ -35,7 +35,7 @@ cdef extern from "sage/libs/ntl/ntlwrap.cpp":
      void ZZX_div_ZZ "div"( ZZX_c x, ZZX_c a, ZZ_c b)
      long ZZX_deg "deg"( ZZX_c x )
      void ZZX_rem "rem"(ZZX_c r, ZZX_c a, ZZX_c b)
 -    void ZZX_XGCD "XGCD"(ZZ_c r, ZZX_c s, ZZX_c t, ZZX_c a, ZZX_c b, long
 deterministic)
 +    void ZZX_XGCD "XGCD"(ZZ_c r, ZZX_c s, ZZX_c t, ZZX_c a, ZZX_c b, long
 deterministic) except +
      void ZZX_content "content"(ZZ_c d, ZZX_c f)
      void ZZX_factor "factor"(ZZ_c c, vec_pair_ZZX_long_c factors, ZZX_c
 f, long verbose, long bnd)

 --- a/src/sage/rings/number_field/number_field_element.pxd
 +++ b/src/sage/rings/number_field/number_field_element.pxd
 @@ -26,7 +26,7 @@ cdef class NumberFieldElement(FieldElement):
      cdef void _ntl_coeff_as_mpz(self, mpz_t z, long i)
      cdef void _ntl_denom_as_mpz(self, mpz_t z)

 -    cdef void _invert_c_(self, ZZX_c *num, ZZ_c *den)
 +    cdef void _invert_c_(self, ZZX_c *num, ZZ_c *den) except *
      cdef void _reduce_c_(self)
      cpdef ModuleElement _add_(self, ModuleElement right)
      cpdef ModuleElement _sub_(self, ModuleElement right)
 --- a/src/sage/rings/number_field/number_field_element.pyx
 +++ b/src/sage/rings/number_field/number_field_element.pyx
 @@ -2258,7 +2258,7 @@ cdef class NumberFieldElement(FieldElement):
          """
          return long(self.polynomial())

 -    cdef void _invert_c_(self, ZZX_c *num, ZZ_c *den):
 +    cdef void _invert_c_(self, ZZX_c *num, ZZ_c *den) except *:
          """
          Computes the numerator and denominator of the multiplicative
          inverse of this element.
 @@ -2276,11 +2276,13 @@ cdef class NumberFieldElement(FieldElement):
          """
          cdef ZZX_c t # unneeded except to be there
          cdef ZZX_c a, b
 +        sig_on()
          ZZX_mul_ZZ( a, self.__numerator, self.__fld_denominator.x )
          ZZX_mul_ZZ( b, self.__fld_numerator.x, self.__denominator )
          ZZX_XGCD( den[0], num[0],  t, a, b, 1 )
          ZZX_mul_ZZ( num[0], num[0], self.__fld_denominator.x )
          ZZX_mul_ZZ( num[0], num[0], self.__denominator )
 +        sig_off()

      def __invert__(self):
          """
 }}}
 Then I get
 {{{
 sage: D=DirichletGroup(23)
 sage: c=D.gen()^2
 sage: N=Newforms(c,6, names='a')
 ---------------------------------------------------------------------------
 NTLError                                  Traceback (most recent call
 last)
 <ipython-input-3-e9e314cc3f45> in <module>()
 ----> 1 N=Newforms(c,Integer(6), names='a')

 /home/bruinpj/src/sage/local/lib/python2.7/site-
 packages/sage/modular/modform/constructor.pyc in Newforms(group, weight,
 base_ring, names)
     452
     453     """
 --> 454     return CuspForms(group, weight, base_ring).newforms(names)
     455
     456

 /home/bruinpj/src/sage/local/lib/python2.7/site-
 packages/sage/modular/modform/space.pyc in newforms(self, names)
    1680             names = 'a'
    1681         return [ element.Newform(self, factors[i],
 names=(names+str(i)) )
 -> 1682                  for i in range(len(factors)) ]
    1683
    1684     def eisenstein_submodule(self):

 /home/bruinpj/src/sage/local/lib/python2.7/site-
 packages/sage/modular/modform/element.pyc in __init__(self, parent,
 component, names, check)
    1070             if not component.is_simple():
    1071                 raise ValueError("component must be simple")
 -> 1072         extension_field =
 component.eigenvalue(1,name=names).parent()
    1073         if extension_field != parent.base_ring(): # .degree() != 1
 and rings.is_NumberField(extension_field):
    1074             assert extension_field.base_field() ==
 parent.base_ring()

 /home/bruinpj/src/sage/local/lib/python2.7/site-
 packages/sage/modular/hecke/module.pyc in eigenvalue(self, n, name)
    1304         if (arith.is_prime(n) or n==1):
    1305             Tn_e = self._eigen_nonzero_element(n)
 -> 1306             an = self._element_eigenvalue(Tn_e, name=name)
    1307             _dict_set(ev, n, name, an)
    1308             return an

 /home/bruinpj/src/sage/local/lib/python2.7/site-
 packages/sage/modular/hecke/module.pyc in _element_eigenvalue(self, x,
 name)
     694         if not x in self.ambient_hecke_module():
     695             raise ArithmeticError("x must be in the ambient Hecke
 module.")
 --> 696         v = self.dual_eigenvector(names=name)
     697         return v.dot_product(x.element())
     698

 /home/bruinpj/src/sage/local/lib/python2.7/site-
 packages/sage/modular/hecke/module.pyc in dual_eigenvector(self, names,
 lift, nz)
    1197             x = self._eigen_nonzero_element()
    1198         alpha = w_lift.dot_product(x.element())
 -> 1199         beta = ~alpha
    1200         w_lift = w_lift * beta
    1201         w = w * beta

 /home/bruinpj/src/sage/src/sage/rings/number_field/number_field_element.pyx
 in
 sage.rings.number_field.number_field_element.NumberFieldElement.__invert__
 
(/home/bruinpj/src/sage/src/build/cythonized/sage/rings/number_field/number_field_element.cpp:22816)()
    2301         cdef NumberFieldElement x
    2302         x = self._new()
 -> 2303         self._invert_c_(&x.__numerator, &x.__denominator)
    2304         x._reduce_c_()
    2305         return x

 /home/bruinpj/src/sage/src/sage/rings/number_field/number_field_element.pyx
 in
 sage.rings.number_field.number_field_element.NumberFieldElement._invert_c_
 
(/home/bruinpj/src/sage/src/build/cythonized/sage/rings/number_field/number_field_element.cpp:22657)()
    2277         cdef ZZX_c t # unneeded except to be there
    2278         cdef ZZX_c a, b
 -> 2279         sig_on()
    2280         ZZX_mul_ZZ( a, self.__numerator, self.__fld_denominator.x
 )
    2281         ZZX_mul_ZZ( b, self.__fld_numerator.x, self.__denominator
 )

 /home/bruinpj/src/sage/src/sage/libs/ntl/error.pyx in
 sage.libs.ntl.error.NTL_error_callback
 (/home/bruinpj/src/sage/src/build/cythonized/sage/libs/ntl/error.cpp:794)()
      39
      40 cdef void NTL_error_callback(const char* s) except *:
 ---> 41     raise NTLError(s)
      42
      43

 NTLError: FFT prime index too large
 }}}

--
Ticket URL: <http://trac.sagemath.org/ticket/20693#comment:21>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/d/optout.

Reply via email to