#[cfg(test)]
mod tests {
use number;
use number::Number;
use number::Number::*;
use parser;
use poly::raw::finitefield::FiniteField;
use poly::raw::MultivariatePolynomial;
use rug::{Integer, Rational};
use std::cmp::Ordering;
use std::io::Cursor;
use structure::Element;
use tools;
#[test]
fn simple_match() {
let mut program = parser::parse_string(
r#"
expr F = f(1);
apply {
id f(x?) = 1;
}
"#,
);
program.do_program(false, 0, 1);
assert_eq!(program.get_result("F"), "1");
}
#[test]
fn repeat() {
let mut program = parser::parse_string(
r#"
expr F = f(6);
apply {
repeat id f(x?{>0}) = x?*f(x?-1);
id f(0) = 1;
}
"#,
);
program.do_program(false, 0, 1);
assert_eq!(program.get_result("F"), "720");
}
#[test]
fn bigint() {
let a = SmallInt(300000000000);
let b = SmallInt(500000000000);
println!("{:?}", a * b);
}
#[test]
fn divmod() {
let mut a = MultivariatePolynomial::from_monomial(1, vec![3]);
a.append_monomial(-2, &[2]);
a.append_monomial(-4, &[0]);
let mut b = MultivariatePolynomial::from_monomial(1, vec![1]);
b.append_monomial(-3, &[0]);
let mut q = MultivariatePolynomial::from_monomial(1, vec![2]);
q.append_monomial(1, &[1]);
q.append_monomial(3, &[0]);
let r = MultivariatePolynomial::from_monomial(5, vec![0]);
assert_eq!(a.divmod(&b), (q, r));
}
#[test]
fn univariate_gcd() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(1), vec![3]);
a.append_monomial(SmallInt(-2), &[2]);
a.append_monomial(SmallInt(-4), &[0]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(1), vec![1]);
b.append_monomial(SmallInt(-3), &[0]);
assert_eq!(
MultivariatePolynomial::gcd(&a, &b),
MultivariatePolynomial::from_monomial(SmallInt(1), vec![0])
);
}
#[test]
fn univariate_gcd2() {
let mut a = MultivariatePolynomial::from_monomial(FiniteField::new(1, 2), vec![3]);
a.append_monomial(FiniteField::new(3, 2), &[2]);
a.append_monomial(FiniteField::new(3, 2), &[1]);
a.append_monomial(FiniteField::new(1, 2), &[0]);
let mut b = MultivariatePolynomial::from_monomial(FiniteField::new(1, 2), vec![3]);
b.append_monomial(FiniteField::new(1, 2), &[1]);
let mut res = MultivariatePolynomial::from_monomial(FiniteField::new(1, 2), vec![2]);
res.append_monomial(FiniteField::new(1, 2), &[0]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), res);
}
#[test]
fn content() {
let mut a = MultivariatePolynomial::from_monomial(9, vec![2]);
a.append_monomial(12, &[1]);
a.append_monomial(6, &[0]);
assert_eq!(MultivariatePolynomial::content(&a), 3);
}
#[test]
fn replace() {
let mut a = MultivariatePolynomial::from_monomial(FiniteField::new(1, 5), vec![3, 0]);
a.append_monomial(FiniteField::new(2, 5), &[1, 1]);
a.append_monomial(FiniteField::new(4, 5), &[1, 0]);
let mut res = MultivariatePolynomial::from_monomial(FiniteField::new(1, 5), vec![0, 1]);
res.append_monomial(FiniteField::new(4, 5), &[0, 0]);
assert_eq!(
MultivariatePolynomial::replace(&a, 0, FiniteField::new(3, 5)),
res
);
}
#[test]
fn chinese_remainder() {
assert_eq!(
number::chinese_remainder(SmallInt(5), SmallInt(30), SmallInt(11), SmallInt(31)),
SmallInt(-94)
);
}
#[test]
fn numgcd() {
assert_eq!(tools::GCD::gcd(-16, -4), 4);
}
#[test]
fn gcd() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(1), vec![2]);
a.append_monomial(SmallInt(2), &[1]);
a.append_monomial(SmallInt(1), &[0]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(1), vec![1]);
b.append_monomial(SmallInt(1), &[0]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), b);
}
#[test]
fn gcd2() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(2), vec![2]);
a.append_monomial(SmallInt(4), &[1]);
a.append_monomial(SmallInt(2), &[0]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(2), vec![1]);
b.append_monomial(SmallInt(2), &[0]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), b);
}
#[test]
fn gcd3() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(1), vec![2, 1]);
a.append_monomial(SmallInt(1), &[2, 0]);
a.append_monomial(SmallInt(2), &[1, 1]);
a.append_monomial(SmallInt(2), &[1, 0]);
a.append_monomial(SmallInt(1), &[0, 1]);
a.append_monomial(SmallInt(1), &[0, 0]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(1), vec![1, 1]);
b.append_monomial(SmallInt(1), &[1, 0]);
b.append_monomial(SmallInt(1), &[0, 1]);
b.append_monomial(SmallInt(1), &[0, 0]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), b);
}
#[test]
fn gcd4() {
let a = MultivariatePolynomial::from_monomial(SmallInt(3), vec![1, 1]);
let b = MultivariatePolynomial::from_monomial(SmallInt(1), vec![1, 0]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), b);
}
#[test]
fn gcd5() {
let a = MultivariatePolynomial::from_monomial(SmallInt(3), vec![1, 1]);
let b = MultivariatePolynomial::from_monomial(SmallInt(1), vec![1, 1]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), b);
}
#[test]
fn gcd6() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(1), vec![2, 1]);
a.append_monomial(SmallInt(2), &[1, 1]);
a.append_monomial(SmallInt(1), &[1, 0]);
a.append_monomial(SmallInt(2), &[0, 0]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(1), vec![2, 1]);
b.append_monomial(SmallInt(3), &[1, 1]);
b.append_monomial(SmallInt(1), &[1, 0]);
b.append_monomial(SmallInt(3), &[0, 0]);
let mut res = MultivariatePolynomial::from_monomial(SmallInt(1), vec![1, 1]);
res.append_monomial(SmallInt(1), &[0, 0]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), res);
}
#[test]
fn gcd7() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(50), vec![3, 0]);
a.append_monomial(SmallInt(50), &[4, 0]);
a.append_monomial(SmallInt(100), &[0, 1]);
a.append_monomial(SmallInt(100), &[1, 1]);
a.append_monomial(SmallInt(-49), &[3, 1]);
a.append_monomial(SmallInt(1), &[4, 1]);
a.append_monomial(SmallInt(-100), &[0, 2]);
a.append_monomial(SmallInt(-1), &[3, 2]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(50), vec![3, 0]);
b.append_monomial(SmallInt(50), &[4, 0]);
b.append_monomial(SmallInt(100), &[0, 1]);
b.append_monomial(SmallInt(100), &[1, 1]);
b.append_monomial(SmallInt(51), &[3, 1]);
b.append_monomial(SmallInt(1), &[4, 1]);
b.append_monomial(SmallInt(100), &[0, 2]);
b.append_monomial(SmallInt(1), &[3, 2]);
let mut res = MultivariatePolynomial::from_monomial(SmallInt(50), vec![3, 0]);
res.append_monomial(SmallInt(100), &[0, 1]);
res.append_monomial(SmallInt(1), &[3, 1]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), res);
}
#[test]
fn gcd8() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(100), vec![0, 0]);
a.append_monomial(SmallInt(-170), &[1, 0]);
a.append_monomial(SmallInt(-270), &[2, 0]);
a.append_monomial(SmallInt(12), &[0, 1]);
a.append_monomial(SmallInt(30), &[1, 1]);
a.append_monomial(SmallInt(18), &[2, 1]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(100), vec![0, 0]);
b.append_monomial(SmallInt(-370), &[1, 0]);
b.append_monomial(SmallInt(270), &[2, 0]);
b.append_monomial(SmallInt(12), &[0, 1]);
b.append_monomial(SmallInt(6), &[1, 1]);
b.append_monomial(SmallInt(-18), &[2, 1]);
let mut res = MultivariatePolynomial::from_monomial(SmallInt(100), vec![0, 0]);
res.append_monomial(SmallInt(-270), &[1, 0]);
res.append_monomial(SmallInt(12), &[0, 1]);
res.append_monomial(SmallInt(18), &[1, 1]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), res);
}
#[test]
fn gcd9() {
let mut a = MultivariatePolynomial::from_monomial(SmallInt(100), vec![0, 0]);
a.append_monomial(SmallInt(100), &[1, 0]);
a.append_monomial(SmallInt(-90), &[3, 0]);
a.append_monomial(SmallInt(-90), &[4, 0]);
a.append_monomial(SmallInt(12), &[0, 1]);
a.append_monomial(SmallInt(12), &[1, 1]);
a.append_monomial(SmallInt(3), &[3, 2]);
a.append_monomial(SmallInt(3), &[4, 2]);
let mut b = MultivariatePolynomial::from_monomial(SmallInt(100), vec![0, 0]);
b.append_monomial(SmallInt(-100), &[1, 0]);
b.append_monomial(SmallInt(-90), &[3, 0]);
b.append_monomial(SmallInt(90), &[4, 0]);
b.append_monomial(SmallInt(12), &[0, 1]);
b.append_monomial(SmallInt(-12), &[1, 1]);
b.append_monomial(SmallInt(3), &[3, 2]);
b.append_monomial(SmallInt(-3), &[4, 2]);
let mut res = MultivariatePolynomial::from_monomial(SmallInt(100), vec![0, 0]);
res.append_monomial(SmallInt(-90), &[3, 0]);
res.append_monomial(SmallInt(12), &[0, 1]);
res.append_monomial(SmallInt(3), &[3, 2]);
assert_eq!(MultivariatePolynomial::gcd(&a, &b), res);
}
#[test]
fn serialize1() {
let a = Element::Term(
false,
vec![
Element::Var(1, SmallInt(1)),
Element::Num(false, SmallInt(5)),
],
);
let b = Element::Term(
false,
vec![
Element::Var(1, SmallInt(1)),
Element::Num(false, SmallInt(6)),
],
);
let mut a1 = vec![];
a.serialize(&mut a1);
let mut b1 = vec![];
b.serialize(&mut b1);
assert_eq!(
Element::compare_serialized(&mut Cursor::new(&a1), &mut Cursor::new(&b1), true),
Ordering::Equal
)
}
#[test]
fn gmpexport() {
let a = BigRat(Box::new(Rational::from((
Integer::from_str_radix("-8123891273812738932462374623", 10).unwrap(),
Integer::from_str_radix("12987312472911297873291738912", 10).unwrap(),
))));
let mut buffer = vec![];
a.serialize(&mut buffer);
let res = Number::deserialize(&mut Cursor::new(&buffer)).unwrap();
assert_eq!(a, res);
}
}