From 0f06092e1d7196f372505600d7459b757cd21d63 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Fri, 25 Nov 2022 22:18:20 +0800 Subject: [PATCH 1/3] add limit= argument to Integer.prime_divisors() --- src/sage/rings/integer.pyx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index c43319942fb..d02415917bd 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -2951,13 +2951,15 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): return n - def prime_divisors(self): + def prime_divisors(self, *, limit=None): """ Return the prime divisors of this integer, sorted in increasing order. If this integer is negative, we do *not* include -1 among its prime divisors, since -1 is not a prime number. + If ``limit`` is given, only primes up to the limit are returned. + EXAMPLES:: sage: a = 1; a.prime_divisors() @@ -2968,8 +2970,22 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): [2, 5] sage: a = 2004; a.prime_divisors() [2, 3, 167] + + :: + + sage: a = 10^100 + 1 + sage: a.prime_divisors() + [73, 137, 401, 1201, 1601, 1676321, 5964848081, + 129694419029057750551385771184564274499075700947656757821537291527196801] + sage: a.prime_divisors(limit=10^3) + [73, 137, 401] + sage: a.prime_divisors(limit=10^7) + [73, 137, 401, 1201, 1601, 1676321] """ - return [r[0] for r in self.factor()] + res = [r[0] for r in self.factor(limit=limit)] + if limit is not None: + res = [r for r in res if r <= limit] + return res prime_factors = prime_divisors From a6770f874917e9b395884f29e3afae5b728ffc2f Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Fri, 10 Feb 2023 01:07:34 +0800 Subject: [PATCH 2/3] pass extra arguments on to Integer.factor() --- src/sage/rings/integer.pyx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index d02415917bd..ed821e6684a 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -2951,14 +2951,19 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): return n - def prime_divisors(self, *, limit=None): + def prime_divisors(self, *args, **kwds): """ Return the prime divisors of this integer, sorted in increasing order. If this integer is negative, we do *not* include -1 among its prime divisors, since -1 is not a prime number. - If ``limit`` is given, only primes up to the limit are returned. + INPUT: + + - ``limit`` -- (integer, optional keyword argument) + Return only prime divisors up to this bound. + + Any additional arguments are passed on to the :meth:`factor` method. EXAMPLES:: @@ -2971,7 +2976,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): sage: a = 2004; a.prime_divisors() [2, 3, 167] - :: + Setting the optional ``limit`` argument works as expected:: sage: a = 10^100 + 1 sage: a.prime_divisors() @@ -2982,7 +2987,8 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): sage: a.prime_divisors(limit=10^7) [73, 137, 401, 1201, 1601, 1676321] """ - res = [r[0] for r in self.factor(limit=limit)] + res = [r[0] for r in self.factor(*args, **kwds)] + limit = kwds.get('limit') if limit is not None: res = [r for r in res if r <= limit] return res From 805b2defa5df1c256ae16a824ddfba5f3b6deb99 Mon Sep 17 00:00:00 2001 From: Lorenz Panny Date: Thu, 16 Feb 2023 01:13:07 +0800 Subject: [PATCH 3/3] document that limit= invokes trial division --- src/sage/rings/integer.pyx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index ed821e6684a..e72b6dc01d1 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -2961,7 +2961,8 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): INPUT: - ``limit`` -- (integer, optional keyword argument) - Return only prime divisors up to this bound. + Return only prime divisors up to this bound, and the factorization + is done by checking primes up to ``limit`` using trial division. Any additional arguments are passed on to the :meth:`factor` method.