Skip to content

Commit 49c41d4

Browse files
committed
Use sig_check() in divisors()
1 parent a5b54ca commit 49c41d4

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

src/sage/rings/integer.pyx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)