#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.