Advertisement
Guest User

pre-release

a guest
Sep 8th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.92 KB | None | 0 0
  1.  
  2. /// Factor the number, ignoring factors greater than `max`. Returns a vec of tuples `Vec<(lo, hi)>`
  3. /// where `lo` <= `max` and `lo` > `hi`
  4. fn factor(number: &BigUint, max: &BigUint) -> FactorList {
  5.     let mut factors = FactorList::new();
  6.     let mut one = ToBigUint::to_biguint(&1).unwrap();
  7.     let mut zero = ToBigUint::to_biguint(&0).unwrap();
  8.     let mut loop_idx = ToBigUint::to_biguint(&2).unwrap();
  9.     let loop_max = std::cmp::min(number.sqrt(), max.clone());
  10.  
  11.     loop {
  12.         if loop_idx > loop_max {
  13.             break;
  14.         }
  15.  
  16.         if number % &loop_idx == zero {
  17.             factors.push((loop_idx.clone(), number / &loop_idx));
  18.         }
  19.  
  20.         loop_idx = &loop_idx + &one;
  21.     }
  22.     factors
  23. }
  24.  
  25. /// Factor `number` into the `tree`, avoiding lo-factors greater than `max`.
  26. fn factor_tree(number: &BigUint, max: &BigUint, tree: &mut FactorTree) {
  27.     if tree.contains_key(&number) {
  28.         return;
  29.     }
  30.  
  31.     let factors = factor(number, max);
  32.     if factors.is_empty() {
  33.         return;
  34.     }
  35.  
  36.     tree.insert(number.clone(), factors.clone());
  37.  
  38.     for (_, hi) in factors {
  39.         factor_tree(&hi, max, tree);
  40.     }
  41. }
  42.  
  43. fn collect_solutions(
  44.     number: &BigUint,
  45.     tree: &FactorTree,
  46.     max: &BigUint,
  47.     solution_callback: fn(Vec<BigUint>),
  48.     so_far: &mut Vec<BigUint>,
  49. ) {
  50.     if number <= max {
  51.         so_far.push(number.clone());
  52.         solution_callback(so_far.clone());
  53.         so_far.pop();
  54.     }
  55.  
  56.     let factors = match tree.get(number) {
  57.         Some(v) => v,
  58.         None => {
  59.             return;
  60.         }
  61.     };
  62.  
  63.     for (lo, hi) in factors {
  64.         so_far.push(lo.clone());
  65.         collect_solutions(hi, tree, max, solution_callback, so_far);
  66.         so_far.pop();
  67.  
  68.         if hi <= max {
  69.             so_far.push(hi.clone());
  70.             collect_solutions(lo, tree, max, solution_callback, so_far);
  71.             so_far.pop();
  72.         }
  73.     }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement