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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
//! 素因数分解
/// 非負整数 $`n`$ を素因数分解し、`素因数`のベクタを返す
/// - 計算量 : $`O(\sqrt{n})`$
pub fn factorize_vec(mut n: usize) -> Vec<usize> {
let mut res = Vec::new();
for i in 2.. {
if i * i > n {
break;
}
while n % i == 0 {
n /= i;
res.push(i);
}
}
if n > 1 {
res.push(n);
}
res
}
/// 非負整数 $`n`$ を素因数分解し、`(素因数,指数)`のベクタを返す
/// - 計算量 : $`O(\sqrt{n})`$
pub fn factorize_pairs(mut n: usize) -> Vec<(usize, usize)> {
let mut res = Vec::new();
for i in 2.. {
if i * i > n {
break;
}
let mut cnt = 0;
while n % i == 0 {
n /= i;
cnt += 1;
}
if cnt >= 1 {
res.push((i, cnt));
}
}
if n > 1 {
res.push((n, 1));
}
res
}