wmathrs 0.1.0

A simple mathematical crate.
Documentation
#![allow(dead_code)]
#![allow(unused_imports)]

mod common; 
use wmath::*; 

#[test]
fn test_polynomial() {
    let coe = vec![1i128, 2, 3]; 
    let poly = Polynomial::new(&coe); 
    println!("{:?}", poly); 
    print_expr!(poly); 
    print_expr!(poly.latex()); 
    print_expr!(poly.neg()); 
    print_expr!(poly == Polynomial::new(&vec![1, 2, 3])); 
    print_expr!(poly == Polynomial::new(&vec![1, 2, 4])); 
    print_expr!(Polynomial::new(&vec![1.000000000001, 2.0, 3.0]) == Polynomial::new(&vec![1.0, 2.0, 3.0])); 
    print_expr!(Polynomial::new(&vec![1.000000000001, 2.0, 3.0]).similar(&Polynomial::new(&vec![1.0, 2.0, 3.0]), 1e-8)); 


    let poly1 = Polynomial::new(&vec![1i128, 2, 3]); 
    print_expr!(poly1.pow(4)); 
    let poly2 = Polynomial::new(&vec![1f64, 2.0, 3.0]); 
    print_expr!(poly2.pow(4)); 

    let poly1 = Polynomial::new(&vec![2.0, -9.2, 1.0]); 
    let poly2 = Polynomial::new(&vec![9.8, -0.8, 3.8, -8.7, 0.0]); 
    print_expr!(poly1.clone() + poly2.clone()); 
    print_expr!(poly1.clone() - poly2.clone()); 
    print_expr!(poly1.clone() * poly2.clone()); 
    let (quotient, remainder) = poly2.clone() / poly1.clone(); 
    let delta = poly1.clone() * quotient.clone() + remainder.clone() - poly2.clone(); 
    print_expr!(delta, delta.similar_zero(1e-8)); 
    let (quotient, remainder) = poly1.clone() / poly2.clone(); 
    let delta = poly2.clone() * quotient.clone() + remainder.clone() - poly1.clone(); 
    print_expr!(delta, delta.similar_zero(1e-8)); 

    print_expr!(poly2.value(9.4)); 
    print_expr!(poly2.value_left(9.4)); 

    let poly = poly!(&vec![frac!(4, 6), frac!(9, 2), frac!(1, 8), frac!(0, 1)]); 
    print_expr!(poly); 
    print_expr!(poly.adjust()); 
    print_expr!(poly.primitive()); 

    let poly1 = poly!(&vec![1i128, 2]); 
    let poly2 = poly!(&vec![5i128, 1]); 
    let poly3 = poly!(&vec![4i128, 1]); 
    let poly4 = poly!(&vec![3i128, 1]); 
    let poly5 = poly!(&vec![2i128, 7]); 
    let poly6 = poly!(&vec![0i128, 4]); 
    let poly7 = poly!(&vec![4i128, 0]); 
    let poly8 = poly!(&vec![7i128, 2]); 

    let poly = poly1 * poly2 * poly3 * poly4 * poly5 * poly6 * poly7 * poly8; 
    print_expr!(poly); 
    println!("{:?}", poly.rational_roots()); 

    let poly = poly!(&vec![3.4, -9.2, 9.4, -0.9, 1.8, 3.9, 0.0, 9.4, 2.9, 0.9, 1.2, -9.8, 0.0]); 
    let vec = poly.real_roots(1e-8, 0.0); 
    for i in vec.iter() {
        println!("{} => {}", i, poly.value(*i)); 
    }

    let poly1 = poly!(&vec![3.0, 2.0, 9.0, -12.0, 8.0]); 
    let poly2 = poly!(&vec![9.0, -2.0, 3.0, 1.0]); 
    let poly3 = poly!(&vec![8.0, -2.0, 9.0]); 
    let poly4 = poly1.clone() * poly2.clone(); 
    let poly5 = poly1.clone() * poly3.clone(); 
    let poly6 = poly4.similar_gcd(&poly5, 1e-10); 
    print_expr!(poly6.similar_gcd(&poly1, 1e-10) == poly1); 
    let (poly6, poly7, poly8) = poly4.similar_gcde(&poly5, 1e-10); 
    print_expr!(poly6.similar_gcd(&poly1, 1e-10) == poly1); 
    print_expr!((poly7 * poly4 + poly8 * poly5 - poly6).similar_zero(1e-10)); 

    fn vec2frac(vec: Vec<i128>) -> Vec<Fraction> {
        vec.iter().map(|x| Fraction::from(*x)).collect()
    }

    let poly1 = poly!(&vec2frac(vec![3, 2, 9, -12, 8])); 
    let poly2 = poly!(&vec2frac(vec![9, -2, 3, 1])); 
    let poly3 = poly!(&vec2frac(vec![8, -2, 9])); 
    let poly4 = poly1.clone() * poly2.clone(); 
    let poly5 = poly1.clone() * poly3.clone(); 
    let poly6 = poly4.gcd(&poly5); 
    print_expr!(poly6.primitive()); 
    print_expr!(poly6.gcd(&poly1) == poly1); 
    let (poly6, poly7, poly8) = poly4.gcde(&poly5); 
    print_expr!(poly6.gcd(&poly1) == poly1); 
    print_expr!((poly7 * poly4 + poly8 * poly5 - poly6).eq_zero()); 

    let poly1 = poly_from!(mat!(&vec![1.217333113417948, 0.26998337953114326, -0.8611873636503731, 0.2811466681445065], 2, 2), mat!(&vec![3.272064686686692, -4.604100407322709, -4.2197880812006066, -4.354597117121138], 2, 2), mat!(&vec![2.7764964649014043, 2.7788609367427295, 0.7194332588776877, -3.43018652645926], 2, 2), mat!(&vec![-0.9911457088294728, -4.158906605476865, -0.24911330335887172, -4.691242732779607], 2, 2), mat!(&vec![3.09521213357063, 0.9088259241921701, -3.24994747251231, 3.3988130324279364], 2, 2), mat!(&vec![-0.4373556723401606, 4.497003897250629, 1.1461488186517244, -3.3024332541505896], 2, 2), mat!(&vec![3.2800020950932716, 0.5002358684874526, -1.6471216137399103, -3.9164457759208062], 2, 2), mat!(&vec![3.307315585143371, 4.622287148377358, -0.016403323836067685, -2.891686771943477], 2, 2), mat!(&vec![3.1341740602098547, 3.3570554859784316, -3.013272946378378, 2.570361470532262], 2, 2)); 
    let poly2 = poly_from!(mat!(&vec![-3.7287278843007354, -3.9850435502415515, 0.6523183316121095, -0.7963321860330197], 2, 2), mat!(&vec![2.166904153348776, -4.2207165225532535, -1.38170735586725, -4.845749895691194], 2, 2), mat!(&vec![-3.543670330112838, -3.059109353057221, 4.441167967534188, 2.867567761041675], 2, 2), mat!(&vec![1.13807076197668, -2.794044062273252, -2.9589529723790333, -1.0426299694423022], 2, 2), mat!(&vec![-3.857275257785906, -2.516008679797599, 4.869913477610815, 3.9834832963249163], 2, 2), mat!(&vec![4.073777241172392, 4.675037364151384, 0.8779181248387484, 0.41734848376834854], 2, 2), mat!(&vec![4.994369038174341, 3.4118584229944435, 3.9281372564853747, -4.188394275565615], 2, 2), mat!(&vec![-1.7910193200861881, 4.2641465638473, 3.8498370944491693, -4.565355784092205], 2, 2), mat!(&vec![-1.6058450426912096, 4.889840799240323, 3.9353874659731556, 4.6925809125859725], 2, 2)); 
    print_expr!((poly1.clone() * poly2.clone()).latex()); 
    // let (poly3, poly4) = poly1.clone() / poly2.clone(); 
    // print_expr!(poly3, poly4); 
    // print_expr!(poly1.pow(1000).latex()); 
    let poly3 = poly1.multiply_by(mat!(&vec![1.0, 2.0, 3.0, 8.0], 2, 2), 0); 
    let poly4 = poly1.multiply_left_by(mat!(&vec![1.0, 2.0, 3.0, 8.0], 2, 2), 0); 
    let poly5 = poly1.divide_by(mat!(&vec![1.0, 2.0, 3.0, 8.0], 2, 2)); 
    let poly6 = poly1.divide_left_by(mat!(&vec![1.0, 2.0, 3.0, 8.0], 2, 2)); 
    print_expr!(poly3, poly4, poly5, poly6); 
}

fn main() {}