Determine if number is (very probably) prime

Description

Determine whether the number n is prime or not, with three possible answers:

2:

n is prime,

1:

n is probably prime (without beeing certain),

0:

n is composite.

Usage

1
isprime(n, reps = 40)  

Arguments

n

integer number, to be tested.

reps

integer number of primality testing repeats.

Details

This function does some trial divisions, then some Miller-Rabin probabilistic primary tests. reps controls how many such tests are done, 5 to 10 is already a resonable number. More will reduce the chances of a composite being returned as “probably prime”.

Value

0

n is not prime

1

n is probably prime

2

n is prime

Author(s)

Antoine Lucas

References

The GNU MP Library, see http://gmplib.org

See Also

nextprime, factorize.

Note that for “small” n, which means something like n < 10'000'000, non-probabilistic methods (such as factorize()) are fast enough. For example, primes in package sfsmisc.

Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
isprime(210)
isprime(71)

# All primes numbers from 1 to 100
t <- isprime(1:99)
(1:99)[t > 0]

table(isprime(1:10000))# 0 and 2 : surely prime or not prime

primes <- function(n) {
  ## all primes <= n
  stopifnot(length(n) == 1, n <= 1e7) # be reasonable
  p <- c(2L, as.integer(seq(3, n, by=2)))
  p[isprime(p) > 0]
}

## quite quickly, but for these small numbers
## still slower than e.g., sfsmisc::primes()
system.time(p100k <- primes(100000))

## The first couple of Mersenne primes:
p.exp <- primes(1000)
Mers <- as.bigz(2) ^ p.exp - 1
isp.M <- sapply(seq_along(Mers), function(i) isprime(Mers[i], reps=256))
cbind(p.exp, isp.M)[isp.M > 0,]
Mers[isp.M > 0]

Want to suggest features or report bugs for rdrr.io? Use the GitHub issue tracker.