Skip to content

Commit

Permalink
Trac #16878: faster is_prime
Browse files Browse the repository at this point in the history
Right now to test if a Sage integer is prime it is faster to call
`prime_range` rather than `.is_prime()`...
{{{
sage: timeit("bool(prime_range(121,122))", number=10000)
10000 loops, best of 3: 1.09 µs per loop
sage:  timeit("bool(prime_range(1009,1010))", number=10000)
10000 loops, best of 3: 1.2 µs per loop
}}}
versus
{{{
sage: timeit("121.is_prime()", number=10000)
10000 loops, best of 3: 5.3 µs per loop
sage: timeit("1009.is_prime()", number=10000)
10000 loops, best of 3: 4.19 µs per loop
}}}

The patch does some tiny modifications in `integer.pyx` and we get
{{{
sage: timeit("121.is_prime()", number=10000)
10000 loops, best of 3: 812 ns per loop
sage: timeit("1009.is_prime()", number=10000)
10000 loops, best of 3: 730 ns per loop
}}}

We also modify `is_prime_power()` to return `False` for 1 and raise an
error for non-integral rationals like `1/2`.

See also [https://groups.google.com/forum/#!topic/sage-devel/v6s2RI4dd1Q
this sage-devel discussion].

URL: http://trac.sagemath.org/16878
Reported by: vdelecroix
Ticket author(s): Vincent Delecroix, Jeroen Demeyer
Reviewer(s): Jeroen Demeyer, Vincent Delecroix
  • Loading branch information
Release Manager authored and vbraun committed Mar 4, 2015
2 parents 420e44e + 1f8abd9 commit 6f61838
Show file tree
Hide file tree
Showing 7 changed files with 321 additions and 255 deletions.
5 changes: 3 additions & 2 deletions src/sage/combinat/sloane_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -2390,7 +2390,8 @@ def _eval(self, n):
class A000015(SloaneSequence):
def __init__(self):
r"""
Smallest prime power `\geq n`.
Smallest prime power `\geq n` (where `1` is considered a prime
power).
INPUT:
Expand Down Expand Up @@ -2447,7 +2448,7 @@ def _eval(self, n):
sage: [sloane.A000015._eval(n) for n in range(1,11)]
[1, 2, 3, 4, 5, 7, 7, 8, 9, 11]
"""
if arith.is_prime_power(n):
if n == 1 or arith.is_prime_power(n):
return n
else:
return arith.next_prime_power(n)
Expand Down
2 changes: 1 addition & 1 deletion src/sage/misc/functional.py
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ def symbolic_sum(expression, *args, **kwds):
sage: sum(valuation(n,2),n,1,5)
Traceback (most recent call last):
...
AttributeError: 'sage.symbolic.expression.Expression' object has no attribute 'valuation'
TypeError: unable to convert n to an integer
Again, use python ``sum()``::
Expand Down
4 changes: 2 additions & 2 deletions src/sage/rings/all.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@

# Arithmetic
from arith import algdep, bernoulli, is_prime, is_prime_power, \
is_pseudoprime, is_pseudoprime_small_power, valuation, \
is_pseudoprime, is_pseudoprime_power, is_pseudoprime_small_power, \
prime_powers, primes_first_n, eratosthenes, primes, \
next_prime_power, next_probable_prime, next_prime, \
previous_prime, previous_prime_power, random_prime, \
Expand All @@ -158,7 +158,7 @@
fundamental_discriminant, squarefree_divisors, \
Sigma, radical, Euler_Phi, binomial_coefficients, jacobi_symbol, \
Moebius, dedekind_sum, \
prime_factors
prime_factors, valuation


from fast_arith import prime_range
Expand Down
Loading

0 comments on commit 6f61838

Please sign in to comment.