diff options
| author | Juan Manuel Tomás <jtomas1815@gmail.com> | 2021-01-12 01:28:57 -0300 | 
|---|---|---|
| committer | Juan Manuel Tomás <jtomas1815@gmail.com> | 2021-01-12 01:28:57 -0300 | 
| commit | 9e2e1387375658c3052138c238eb2afcd0b63a1f (patch) | |
| tree | 5ed62ef9475bad76930ac026373cd9c506064c76 | |
| parent | 9d071ab5241758da5b9cde72b75fba3c2e9eb0ee (diff) | |
| download | bezier-9e2e1387375658c3052138c238eb2afcd0b63a1f.tar.gz bezier-9e2e1387375658c3052138c238eb2afcd0b63a1f.zip | |
Make div return quotient and remainder
| -rw-r--r-- | src/poly.rs | 67 | 
1 files changed, 24 insertions, 43 deletions
| diff --git a/src/poly.rs b/src/poly.rs index 488b0ea..6ffaf7d 100644 --- a/src/poly.rs +++ b/src/poly.rs @@ -2,8 +2,7 @@ mod iter;  use crate::number::Number;  use iter::Iter; -use std::cmp::Ordering; -use std::ops::{Add, Sub, Mul, Div, Rem}; +use std::ops::{Add, Sub, Mul, Div};  #[derive(PartialEq, Debug, Clone)]  pub struct Poly(pub Vec<Number>); @@ -73,29 +72,10 @@ impl Mul for &Poly {      }  } -impl Rem for &Poly { -    type Output = Poly; - -    fn rem(self, other: Self) -> Poly { -        let mut q = Poly(vec![0.0]); -        let mut r = self.clone(); -        let d = other.degree(); -        let c = other.0[d]; -        while r.degree() >= d { -            let mut p = vec![0.0; r.degree() - d + 1]; -            p[r.degree() - d] = r.0[r.degree()] / c; -            let s = Poly(p); -            q = &q + &s; -            r = &r - &(&s * other); -        } -        r -    } -} -  impl Div for &Poly { -    type Output = Poly; +    type Output = (Poly, Poly); -    fn div(self, other: Self) -> Poly { +    fn div(self, other: Self) -> (Poly, Poly) {          let mut q = Poly(vec![0.0]);          let mut r = self.clone();          let d = other.degree(); @@ -107,12 +87,13 @@ impl Div for &Poly {              q = &q + &s;              r = &r - &(&s * other);          } -        q +        (q, r)      }  }  pub fn gcd(a: &Poly, b: &Poly) -> Poly { -    let c = a % b; +    let (_, c) = a / b; +    println!("a: {:?}, b: {:?}, c: {:?}", a, b, c);      if c.is_zero() {          b.clone()      } else { @@ -125,10 +106,24 @@ mod tests {      use super::*;      #[test] -    fn div_test() { -        let a = Poly(vec![1.0, 4.0, 7.0, 6.0]); -        let b = Poly(vec![1.0, 2.0, 3.0]); -        assert_eq!(&a / &b, Poly(vec![1.0, 2.0])); +    fn div_equal() { +        let a = Poly(vec![6.0, 7.0, 1.0]); +        let b = Poly(vec![-6.0, -5.0, 1.0]); +        assert_eq!(&a / &b, (Poly(vec![1.0]), Poly(vec![12.0, 12.0, 0.0]))); +    } + +    #[test] +    fn div_greater() { +        let a = Poly(vec![-6.0, -5.0, 1.0]); +        let b = Poly(vec![12.0, 12.0]); +        assert_eq!(&a / &b, (Poly(vec![-0.5, 1.0/12.0]), Poly(vec![0.0, 0.0]))); +    } + +    #[test] +    fn div_less() { +        let a = Poly(vec![12.0, 12.0]); +        let b = Poly(vec![-6.0, -5.0, 1.0]); +        assert_eq!(&a / &b, (Poly(vec![0.0]), a));      }      #[test] @@ -179,20 +174,6 @@ mod tests {      }      #[test] -    fn rem_equal() { -        let a = Poly(vec![6.0, 7.0, 1.0]); -        let b = Poly(vec![-6.0, -5.0, 1.0]); -        assert_eq!(&a % &b, Poly(vec![12.0, 12.0, 0.0])); -    } - -    #[test] -    fn rem_greater() { -        let a = Poly(vec![-6.0, -5.0, 1.0]); -        let b = Poly(vec![12.0, 12.0]); -        assert_eq!(&a % &b, Poly(vec![0.0, 0.0])); -    } - -    #[test]      fn gcd_test() {          let a = Poly(vec![6.0, 7.0, 1.0]);          let b = Poly(vec![-6.0, -5.0, 1.0]); | 
