#![cfg(feature = "int")]
use puremp::{Int, ModInt};
fn m(v: i64, modulus: i64) -> ModInt {
ModInt::new(Int::from(v), Int::from(modulus))
}
#[test]
fn modular_operators() {
let a = m(5, 7);
let b = m(4, 7);
assert_eq!((&a + &b).to_int().to_string(), "2"); assert_eq!((&a - &b).to_int().to_string(), "1");
assert_eq!((&b - &a).to_int().to_string(), "6"); assert_eq!((&a * &b).to_int().to_string(), "6"); assert_eq!((-a.clone()).to_int().to_string(), "2");
assert_eq!(m(3, 7).inv().unwrap().to_int().to_string(), "5"); assert!(m(2, 6).inv().is_none()); assert_eq!((&a / &b).to_int(), (&a * &b.inv().unwrap()).to_int());
let p = Int::from(1000000007);
let g = ModInt::new(Int::from(123456), p.clone());
assert!(g.pow(&p.sub(&Int::ONE)).to_int().is_one()); assert_eq!(g.pow(&Int::from(-1)), g.inv().unwrap());
let x = m(2, 97);
let y = x.of(Int::from(50));
assert_eq!((&x * &y).to_int().to_string(), "3");
let mut z = m(10, 13);
z *= m(10, 13);
assert_eq!(z, m(9, 13)); assert_eq!(m(20, 13), m(7, 13));
}