@@ -3136,14 +3136,11 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
31363136 (the ``divisors`` call below allocates about 800 MB every time,
31373137 so a memory leak will not go unnoticed)::
31383138
3139+ sage: from sage.doctest.util import ensure_interruptible_after
31393140 sage: n = prod(primes_first_n(25)) # needs sage.libs.pari
31403141 sage: for i in range(20): # long time # needs sage.libs.pari
3141- ....: try:
3142- ....: alarm(RDF.random_element(1e-3, 0.5))
3142+ ....: with ensure_interruptible_after(RDF.random_element(1e-3, 0.5)):
31433143 ....: _ = n.divisors()
3144- ....: cancel_alarm() # we never get here
3145- ....: except AlarmInterrupt:
3146- ....: pass
31473144
31483145 Test a strange method::
31493146
@@ -3165,7 +3162,12 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
31653162 if mpz_cmp_ui(self .value, 0 ) == 0 :
31663163 raise ValueError (" n must be nonzero" )
31673164
3168- if (method is None or method == ' pari' ) and mpz_fits_slong_p(self .value):
3165+ value_fits_slong = mpz_fits_slong_p(self .value)
3166+ if method is None :
3167+ method = ' pari' if value_fits_slong else ' sage'
3168+ if method == ' pari' :
3169+ if not value_fits_slong:
3170+ raise ValueError (" method `pari` requested, but integer value is too large" )
31693171 global pari_divisors_small
31703172 if pari_divisors_small is None :
31713173 try :
@@ -3238,8 +3240,6 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
32383240 # The two cases below are essentially the same algorithm, one
32393241 # operating on Integers in Python lists, the other on unsigned long's.
32403242 if fits_c:
3241- sig_on()
3242-
32433243 pn_c = p_c = p
32443244
32453245 swap_tmp = sorted_c
@@ -3251,6 +3251,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
32513251 tip = 0
32523252 prev_c[prev_len] = prev_c[prev_len- 1 ] * pn_c
32533253 for i in range (prev_len):
3254+ if (i & 0x1f ) == 0 : sig_check()
32543255 apn_c = prev_c[i] * pn_c
32553256 while prev_c[tip] < apn_c:
32563257 sorted_c[sorted_len] = prev_c[tip]
@@ -3271,6 +3272,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
32713272 tip = 0
32723273 all_c[all_len] = prev_c[prev_len- 1 ] * pn_c
32733274 for i in range (prev_len):
3275+ if (i & 0x1f ) == 0 : sig_check()
32743276 apn_c = prev_c[i] * pn_c
32753277 while all_c[tip] < apn_c:
32763278 sorted_c[sorted_len] = all_c[tip]
@@ -3279,8 +3281,6 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
32793281 sorted_c[sorted_len] = apn_c
32803282 sorted_len += 1
32813283
3282- sig_off()
3283-
32843284 else :
32853285 # fits_c is False: use mpz integers
32863286 prev = sorted
@@ -3292,7 +3292,8 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement):
32923292 tip = 0
32933293 top = len (all )
32943294 mpz_mul(pn.value, pn.value, p.value) # pn *= p
3295- for a in prev:
3295+ for i, a in enumerate (prev):
3296+ if (i & 0x1f ) == 0 : sig_check()
32963297 # apn = a*pn
32973298 apn = < Integer> PY_NEW(Integer)
32983299 mpz_mul(apn.value, (< Integer> a).value, pn.value)
0 commit comments