Struct primesieve::Sieve [] [src]

pub struct Sieve { /* fields omitted */ }

A structure which sieves for primes up to a given limit and stores the results for later iteration and querying.

Methods

impl Sieve
[src]

Returns whether or not n is a prime number, or Err(()) if n is larger than the square of the largest prime held in the sieve.

Uses a simple lookup if n is not greater than the largest number known about by the sieve, and uses trial division otherwise.

Examples

let sieve = primesieve::Sieve::to_limit(100);

assert_eq!(sieve.is_prime(0), Ok(false));
assert_eq!(sieve.is_prime(1), Ok(false));
assert_eq!(sieve.is_prime(2), Ok(true));
assert_eq!(sieve.is_prime(3), Ok(true));
assert_eq!(sieve.is_prime(4), Ok(false));
assert_eq!(sieve.is_prime(5), Ok(true));

assert_eq!(sieve.is_prime(491), Ok(true));
assert_eq!(sieve.is_prime(493), Ok(false));
assert_eq!(sieve.is_prime(495), Ok(false));
assert_eq!(sieve.is_prime(497), Ok(false));
assert_eq!(sieve.is_prime(499), Ok(true));

assert_eq!(sieve.is_prime(1000001), Err(()));

Factorises n into (prime, exponent) pairs.

Returns Err(remainder, partial factorisation) if n cannot be fully factorised without sieving for more primes.

If x is the largest number known about by the sieve, then any integer having at most one prime factor larger than x can be factorised. In particular, any number not greater than x^2 can be factorised.

Examples

let sieve = primesieve::Sieve::to_limit(100);

assert_eq!(sieve.factorise(2), Ok(vec![(2, 1)]));
assert_eq!(sieve.factorise(4), Ok(vec![(2, 2)]));
assert_eq!(sieve.factorise(1 << 63), Ok(vec![(2, 63)]));

assert_eq!(sieve.factorise(2 * 3), Ok(vec![(2, 1), (3, 1)]));
assert_eq!(sieve.factorise(89 * 97), Ok(vec![(89, 1), (97, 1)]));
assert_eq!(sieve.factorise(8 * 9 * 5), Ok(vec![(2, 3), (3, 2), (5, 1)]));

assert_eq!(sieve.factorise(2 * 3 * 5 * 991), Ok(vec![(2, 1), (3, 1), (5, 1), (991, 1)]));
assert_eq!(sieve.factorise(2 * 3 * 5 * 991 * 991),
           Err((991 * 991, vec![(2, 1), (3, 1), (5, 1)])));

Calculates the value of Euler's totient function ϕ at n.

Uses the formula based on the factorisation of n, that is ϕ(n) is equal to n times the product of 1 - 1/p, where p ranges over the distinct prime factors of n.

Returns Err(()) if n cannot be factorised without first sieving for more primes.

Examples

let sieve = primesieve::Sieve::to_limit(100);

assert_eq!(sieve.euler_phi(2), Ok(1));
assert_eq!(sieve.euler_phi(4), Ok(2));
assert_eq!(sieve.euler_phi(1 << 63), Ok(1 << 62));

assert_eq!(sieve.euler_phi(2 * 3), Ok(2));
assert_eq!(sieve.euler_phi(89 * 97), Ok(88 * 96));
assert_eq!(sieve.euler_phi(8 * 9 * 5), Ok(4 * 6 * 4));

assert_eq!(sieve.euler_phi(2 * 3 * 5 * 991), Ok(2 * 4 * 990));
assert_eq!(sieve.euler_phi(2 * 3 * 5 * 991 * 991), Err(()));

Calculates the number of divisors of n.

Returns Err(()) is n cannot be fully factorised without first sieving for more primes.

This uses the well-known formula, that if n is given in factorised form as a product p_i ^ a_i, then the number of divisors of n is given by:

(a_1 + 1)(a_2 + 1) ... (a_k + 1)

Examples

let sieve = primesieve::Sieve::to_limit(100);

assert_eq!(sieve.number_of_divisors(2), Ok(2));
assert_eq!(sieve.number_of_divisors(4), Ok(3));
assert_eq!(sieve.number_of_divisors(1 << 63), Ok(64));

assert_eq!(sieve.number_of_divisors(2 * 3), Ok(2 * 2));
assert_eq!(sieve.number_of_divisors(89 * 97), Ok(2 * 2));
assert_eq!(sieve.number_of_divisors(8 * 9 * 5), Ok(4 * 3 * 2));

assert_eq!(sieve.number_of_divisors(2 * 3 * 5 * 991), Ok(2 * 2 * 2 * 2));
assert_eq!(sieve.number_of_divisors(2 * 3 * 5 * 991 * 991), Err(()));

impl Sieve
[src]

Create a new Sieve which knows about the primes up to the given limit.

Create a new Sieve which knows about at least the first n primes.

Returns the highest number that this Sieve knows about. Note that this may be slightly larger than the limit the sieve was created with.

Examples

let sieve = primesieve::Sieve::to_limit(1000);
assert!(sieve.limit() >= 1000);

Returns the number of primes that this Sieve knows about. Note that this may be slightly higher than the number of primes the sieve was created with.

Examples

let sieve = primesieve::Sieve::to_n_primes(1000);
assert!(sieve.num_primes() >= 1000);

Returns the nth prime number, indexed from 0, or None if fewer than n prime numbers are held in the sieve.

Examples

let sieve = primesieve::Sieve::to_n_primes(100);

assert_eq!(sieve.nth_prime(0), Some(2));
assert_eq!(sieve.nth_prime(1), Some(3));
assert_eq!(sieve.nth_prime(2), Some(5));
assert_eq!(sieve.nth_prime(3), Some(7));
assert_eq!(sieve.nth_prime(4), Some(11));

assert_eq!(sieve.nth_prime(97), Some(521));
assert_eq!(sieve.nth_prime(98), Some(523));
assert_eq!(sieve.nth_prime(99), Some(541));

assert_eq!(sieve.nth_prime(1000), None);

impl<'a> Sieve
[src]

Return an iterator over the primes in this Sieve.

Examples

let sieve = primesieve::Sieve::to_limit(100);
assert_eq!(sieve.iter().take_while(|&x| x < 100).collect::<Vec<u64>>(),
           vec![2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
                43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]);