#[derive(Debug)]
pub struct Prime(Vec<bool>);
impl Prime {
pub fn init(n: usize) -> Self {
let mut sieve = vec![true; n];
sieve[0] = false;
sieve[1] = false;
let mut i = 2;
while i * i <= n {
if sieve[i] {
(2..)
.map(|x| x * i)
.take_while(|x| *x < n)
.for_each(|x| sieve[x] = false);
}
i += 1;
}
Self(sieve)
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.len() == 0
}
pub fn factorization(&self, n: usize) -> Vec<(usize, usize)> {
assert!(self.len() > n);
let mut res = Vec::new();
let ps = self.primes();
let mut n = n;
for p in ps {
let mut count = 0;
while n % p == 0 {
n /= p;
count += 1;
}
if count > 0 {
res.push((p, count));
}
}
if n > 1 {
res.push((n, 1));
}
res
}
pub fn primes(&self) -> Vec<usize> {
self.0
.iter()
.enumerate()
.filter(|t| *t.1)
.map(|x| x.0)
.collect()
}
pub fn is_prime(&self, n: usize) -> bool {
assert!(n < self.len());
self.0[n]
}
}
#[test]
fn sieve_test() {
let p = Prime::init(10);
assert_eq!(
&[false, false, true, true, false, true, false, true, false, false],
&p.0[..]
);
}
#[test]
fn fact_test() {
let table = Prime::init(10);
assert_eq!(table.factorization(9), vec![(3, 2)]); }
pub fn factorization(n: usize) -> Vec<(usize, usize)> {
let mut res = Vec::new();
let ps = Prime::init(n).primes();
let mut n = n;
for p in ps {
let mut count = 0;
while n % p == 0 {
n /= p;
count += 1;
}
if count > 0 {
res.push((p, count));
}
}
if n > 1 {
res.push((n, 1));
}
res
}
fn firstfac(x: u64) -> u64 {
if x % 2 == 0 {
return 2;
};
for n in (3..).step_by(2).take_while(|m| m * m <= x) {
if x % n == 0 {
return n;
};
}
x
}
pub fn is_prime(n: u64) -> bool {
if n <= 1 {
return false;
}
firstfac(n) == n
}