54 lines
1.1 KiB
Rust
54 lines
1.1 KiB
Rust
fn subfactors(mut n: u64, p: u64) -> (u64, Vec<u64>) {
|
|
let mut subfactors = Vec::new();
|
|
|
|
let mut q = n / p;
|
|
let mut r = n % p;
|
|
|
|
while r == 0 {
|
|
subfactors.push(p);
|
|
n = q;
|
|
q = n / p;
|
|
r = n % p;
|
|
}
|
|
|
|
return (n, subfactors);
|
|
}
|
|
|
|
pub fn trial_factorization(mut n: u64) -> Vec<u64> {
|
|
let mut factors = Vec::new();
|
|
|
|
let (num, division_by_two) = subfactors(n, 2);
|
|
n = num; // is there a clean way to avoid this assignment?
|
|
factors.extend(division_by_two);
|
|
|
|
let (num, division_by_three) = subfactors(n, 3);
|
|
n = num;
|
|
factors.extend(division_by_three);
|
|
|
|
let mut p = 5;
|
|
while p * p <= n
|
|
{
|
|
let (num, division_by_p) = subfactors(n, p);
|
|
n = num;
|
|
factors.extend(division_by_p);
|
|
p += 2;
|
|
|
|
let (num, division_by_p_plus_two) = subfactors(n, p);
|
|
n = num;
|
|
factors.extend(division_by_p_plus_two);
|
|
p += 4;
|
|
}
|
|
if n >= 1 { factors.push(n); }
|
|
return factors;
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use euler::prime::trial_factorization;
|
|
|
|
#[test]
|
|
fn test() {
|
|
assert_eq!(trial_factorization(20).len(), 3);
|
|
}
|
|
}
|