use crate::Rational;
use core::mem::swap;
use malachite_base::num::arithmetic::traits::{AddMulAssign, UnsignedAbs};
use malachite_base::num::basic::traits::{One, Zero};
use malachite_nz::integer::Integer;
use malachite_nz::natural::Natural;
impl Rational {
pub fn from_continued_fraction<I: Iterator<Item = Natural>>(floor: Integer, xs: I) -> Self {
let mut previous_numerator = Integer::ONE;
let mut previous_denominator = Natural::ZERO;
let mut numerator = floor;
let mut denominator = Natural::ONE;
for n in xs {
assert_ne!(n, 0u32);
previous_numerator.add_mul_assign(&numerator, Integer::from(&n));
previous_denominator.add_mul_assign(&denominator, n);
swap(&mut numerator, &mut previous_numerator);
swap(&mut denominator, &mut previous_denominator);
}
Self {
sign: numerator >= 0,
numerator: numerator.unsigned_abs(),
denominator,
}
}
pub fn from_continued_fraction_ref<'a, I: Iterator<Item = &'a Natural>>(
floor: &Integer,
xs: I,
) -> Self {
let mut previous_numerator = Integer::ONE;
let mut previous_denominator = Natural::ZERO;
let mut numerator = floor.clone();
let mut denominator = Natural::ONE;
for n in xs {
assert_ne!(*n, 0u32);
previous_numerator.add_mul_assign(&numerator, Integer::from(n));
previous_denominator.add_mul_assign(&denominator, n);
swap(&mut numerator, &mut previous_numerator);
swap(&mut denominator, &mut previous_denominator);
}
Self {
sign: numerator >= 0,
numerator: numerator.unsigned_abs(),
denominator,
}
}
}