malachite-base 0.3.2

A collection of utilities, including new arithmetic traits and iterators that generate all values of a type
Documentation
use malachite_base::num::arithmetic::traits::UnsignedAbs;
use malachite_base::num::basic::integers::PrimitiveInt;
use malachite_base::num::basic::signeds::PrimitiveSigned;
use malachite_base::num::basic::unsigneds::PrimitiveUnsigned;
use malachite_base::num::conversion::traits::WrappingFrom;
use malachite_base::test_util::generators::{
    signed_pair_gen, signed_quadruple_gen, signed_triple_gen, signed_triple_gen_var_4,
    signed_triple_gen_var_5, unsigned_pair_gen_var_27, unsigned_quadruple_gen_var_10,
    unsigned_triple_gen_var_19, unsigned_triple_gen_var_7, unsigned_triple_gen_var_8,
};

#[test]
fn test_eq_mod() {
    fn test<T: PrimitiveInt>(x: T, y: T, m: T, out: bool) {
        assert_eq!(x.eq_mod(y, m), out);
    }
    test::<u8>(0, 0, 0, true);
    test::<u16>(0, 1, 0, false);
    test::<u32>(57, 57, 0, true);
    test::<u64>(57, 58, 0, false);
    test::<u128>(1000000000000, 57, 0, false);
    test::<usize>(0, 256, 256, true);
    test::<u16>(0, 256, 512, false);
    test::<u16>(13, 23, 10, true);
    test::<u32>(13, 24, 10, false);
    test::<u64>(13, 21, 1, true);
    test::<u128>(13, 21, 2, true);
    test::<usize>(13, 21, 4, true);
    test::<u8>(13, 21, 8, true);
    test::<u16>(13, 21, 16, false);
    test::<u32>(13, 21, 3, false);
    test::<u64>(1000000000001, 1, 4096, true);
    test::<u128>(1000000000001, 1, 8192, false);
    test::<u64>(12345678987654321, 321, 1000, true);
    test::<u64>(12345678987654321, 322, 1000, false);
    test::<u64>(1234, 1234, 1000000000000, true);
    test::<u64>(1234, 1235, 1000000000000, false);
    test::<u64>(1000000001234, 1000000002234, 1000, true);
    test::<u64>(1000000001234, 1000000002235, 1000, false);
    test::<u64>(1000000001234, 1234, 1000000000000, true);
    test::<u64>(1000000001234, 1235, 1000000000000, false);
    test::<u64>(1000000001234, 5000000001234, 1000000000000, true);
    test::<u64>(1000000001234, 5000000001235, 1000000000000, false);

    test::<i8>(0, -1, 0, false);
    test::<i16>(57, -57, 0, false);
    test::<i32>(57, -58, 0, false);
    test::<i64>(1000000000000, -57, 0, false);
    test::<i128>(0, -256, 256, true);
    test::<isize>(0, -256, 512, false);
    test::<i8>(13, -27, 10, true);
    test::<i16>(13, -28, 10, false);
    test::<i32>(29, -27, 1, true);
    test::<i64>(29, -27, 2, true);
    test::<i128>(29, -27, 4, true);
    test::<isize>(29, -27, 8, true);
    test::<i8>(29, -27, 16, false);
    test::<i16>(29, -27, 3, false);
    test::<i64>(999999999999, -1, 4096, true);
    test::<i64>(999999999999, -1, 8192, false);
    test::<i64>(12345678987654321, -679, 1000, true);
    test::<i64>(12345678987654321, -680, 1000, false);
    test::<i64>(1000000001234, -999999999766, 1000, true);
    test::<i64>(1000000001234, -999999999767, 1000, false);
    test::<i64>(1000000001234, -999999998766, 1000000000000, true);
    test::<i64>(1000000001234, -999999998767, 1000000000000, false);

    test::<i16>(-57, 57, 0, false);
    test::<i32>(-57, 58, 0, false);
    test::<i64>(-1000000000000, 57, 0, false);
    test::<i8>(-13, 27, 10, true);
    test::<i16>(-13, 28, 10, false);
    test::<i32>(-29, 27, 1, true);
    test::<i64>(-29, 27, 2, true);
    test::<i128>(-29, 27, 4, true);
    test::<isize>(-29, 27, 8, true);
    test::<i8>(-29, 27, 16, false);
    test::<i16>(-29, 27, 3, false);
    test::<i64>(-999999999999, 1, 4096, true);
    test::<i64>(-999999999999, 1, 8192, false);
    test::<i64>(-12345678987654321, 679, 1000, true);
    test::<i64>(-12345678987654321, 680, 1000, false);
    test::<i64>(-1000000001234, 999999999766, 1000, true);
    test::<i64>(-1000000001234, 999999999767, 1000, false);
    test::<i64>(-1000000001234, 999999998766, 1000000000000, true);
    test::<i64>(-1000000001234, 999999998767, 1000000000000, false);

    test::<i32>(-57, -57, 0, true);
    test::<i64>(-57, -58, 0, false);
    test::<i128>(-1000000000000, -57, 0, false);
    test::<i16>(-13, -23, 10, true);
    test::<i32>(-13, -24, 10, false);
    test::<i64>(-13, -21, 1, true);
    test::<i128>(-13, -21, 2, true);
    test::<isize>(-13, -21, 4, true);
    test::<i8>(-13, -21, 8, true);
    test::<i16>(-13, -21, 16, false);
    test::<i32>(-13, -21, 3, false);
    test::<i64>(-1000000000001, -1, 4096, true);
    test::<i128>(-1000000000001, -1, 8192, false);
    test::<i64>(-12345678987654321, -321, 1000, true);
    test::<i64>(-12345678987654321, -322, 1000, false);
    test::<i64>(-1234, -1234, 1000000000000, true);
    test::<i64>(-1234, -1235, 1000000000000, false);
    test::<i64>(-1000000001234, -1000000002234, 1000, true);
    test::<i64>(-1000000001234, -1000000002235, 1000, false);
    test::<i64>(-1000000001234, -1234, 1000000000000, true);
    test::<i64>(-1000000001234, -1235, 1000000000000, false);
    test::<i64>(-1000000001234, -5000000001234, 1000000000000, true);
    test::<i64>(-1000000001234, -5000000001235, 1000000000000, false);

    test::<isize>(0, 256, -256, true);
    test::<i16>(0, 256, -512, false);
    test::<i16>(13, 23, -10, true);
    test::<i32>(13, 24, -10, false);
    test::<i64>(13, 21, -1, true);
    test::<i128>(13, 21, -2, true);
    test::<isize>(13, 21, -4, true);
    test::<i8>(13, 21, -8, true);
    test::<i16>(13, 21, -16, false);
    test::<i32>(13, 21, -3, false);
    test::<i64>(1000000000001, 1, -4096, true);
    test::<i128>(1000000000001, 1, -8192, false);
    test::<i64>(12345678987654321, 321, -1000, true);
    test::<i64>(12345678987654321, 322, -1000, false);
    test::<i64>(1234, 1234, -1000000000000, true);
    test::<i64>(1234, 1235, -1000000000000, false);
    test::<i64>(1000000001234, 1000000002234, -1000, true);
    test::<i64>(1000000001234, 1000000002235, -1000, false);
    test::<i64>(1000000001234, 1234, -1000000000000, true);
    test::<i64>(1000000001234, 1235, -1000000000000, false);
    test::<i64>(1000000001234, 5000000001234, -1000000000000, true);
    test::<i64>(1000000001234, 5000000001235, -1000000000000, false);

    test::<i128>(0, -256, -256, true);
    test::<isize>(0, -256, -512, false);
    test::<i8>(13, -27, -10, true);
    test::<i16>(13, -28, -10, false);
    test::<i32>(29, -27, -1, true);
    test::<i64>(29, -27, -2, true);
    test::<i128>(29, -27, -4, true);
    test::<isize>(29, -27, -8, true);
    test::<i8>(29, -27, -16, false);
    test::<i16>(29, -27, -3, false);
    test::<i64>(999999999999, -1, -4096, true);
    test::<i64>(999999999999, -1, -8192, false);
    test::<i64>(12345678987654321, -679, -1000, true);
    test::<i64>(12345678987654321, -680, -1000, false);
    test::<i64>(1000000001234, -999999999766, -1000, true);
    test::<i64>(1000000001234, -999999999767, -1000, false);
    test::<i64>(1000000001234, -999999998766, -1000000000000, true);
    test::<i64>(1000000001234, -999999998767, -1000000000000, false);

    test::<i8>(-13, 27, -10, true);
    test::<i16>(-13, 28, -10, false);
    test::<i32>(-29, 27, -1, true);
    test::<i64>(-29, 27, -2, true);
    test::<i128>(-29, 27, -4, true);
    test::<isize>(-29, 27, -8, true);
    test::<i8>(-29, 27, -16, false);
    test::<i16>(-29, 27, -3, false);
    test::<i64>(-999999999999, 1, -4096, true);
    test::<i64>(-999999999999, 1, -8192, false);
    test::<i64>(-12345678987654321, 679, -1000, true);
    test::<i64>(-12345678987654321, 680, -1000, false);
    test::<i64>(-1000000001234, 999999999766, -1000, true);
    test::<i64>(-1000000001234, 999999999767, -1000, false);
    test::<i64>(-1000000001234, 999999998766, -1000000000000, true);
    test::<i64>(-1000000001234, 999999998767, -1000000000000, false);

    test::<i16>(-13, -23, -10, true);
    test::<i32>(-13, -24, -10, false);
    test::<i64>(-13, -21, -1, true);
    test::<i128>(-13, -21, -2, true);
    test::<isize>(-13, -21, -4, true);
    test::<i8>(-13, -21, -8, true);
    test::<i16>(-13, -21, -16, false);
    test::<i32>(-13, -21, -3, false);
    test::<i64>(-1000000000001, -1, -4096, true);
    test::<i128>(-1000000000001, -1, -8192, false);
    test::<i64>(-12345678987654321, -321, -1000, true);
    test::<i64>(-12345678987654321, -322, -1000, false);
    test::<i64>(-1234, -1234, -1000000000000, true);
    test::<i64>(-1234, -1235, -1000000000000, false);
    test::<i64>(-1000000001234, -1000000002234, -1000, true);
    test::<i64>(-1000000001234, -1000000002235, -1000, false);
    test::<i64>(-1000000001234, -1234, -1000000000000, true);
    test::<i64>(-1000000001234, -1235, -1000000000000, false);
    test::<i64>(-1000000001234, -5000000001234, -1000000000000, true);
    test::<i64>(-1000000001234, -5000000001235, -1000000000000, false);
}

fn eq_mod_properties_helper_unsigned<T: PrimitiveUnsigned>() {
    unsigned_triple_gen_var_19::<T>().test_properties(|(x, y, m)| {
        let equal = x.eq_mod(y, m);
        assert_eq!(y.eq_mod(x, m), equal);
    });

    unsigned_triple_gen_var_7::<T>().test_properties(|(x, y, m)| {
        assert!(x.eq_mod(y, m));
        assert!(y.eq_mod(x, m));
    });

    unsigned_triple_gen_var_8::<T>().test_properties(|(x, y, m)| {
        assert!(!x.eq_mod(y, m));
        assert!(!y.eq_mod(x, m));
    });

    unsigned_pair_gen_var_27::<T>().test_properties(|(x, y)| {
        assert!(x.eq_mod(y, T::ONE));
        assert_eq!(x.eq_mod(y, T::ZERO), x == y);
        assert_eq!(x.eq_mod(T::ZERO, y), x.divisible_by(y));
        assert!(x.eq_mod(x, y));
    });

    unsigned_quadruple_gen_var_10::<T>().test_properties(|(x, y, z, m)| {
        if x.eq_mod(y, m) && y.eq_mod(z, m) {
            assert!(x.eq_mod(z, m));
        }
    });
}

fn eq_mod_properties_helper_signed<
    U: PrimitiveUnsigned + WrappingFrom<S>,
    S: PrimitiveSigned + UnsignedAbs<Output = U> + WrappingFrom<U>,
>() {
    signed_triple_gen::<S>().test_properties(|(x, y, m)| {
        let equal = x.eq_mod(y, m);
        assert_eq!(y.eq_mod(x, m), equal);

        if x != S::MIN && y != S::MIN {
            assert_eq!((-x).eq_mod(-y, m), equal);
        }
        if m != S::MIN {
            assert_eq!(x.eq_mod(y, -m), equal);
        }
    });

    signed_triple_gen_var_4::<U, S>().test_properties(|(x, y, m)| {
        assert!(x.eq_mod(y, m));
        assert!(y.eq_mod(x, m));
    });

    signed_triple_gen_var_5::<S>().test_properties(|(x, y, m)| {
        assert!(!x.eq_mod(y, m));
        assert!(!y.eq_mod(x, m));
    });

    signed_pair_gen::<S>().test_properties(|(x, y)| {
        assert!(x.eq_mod(y, S::ONE));
        assert_eq!(x.eq_mod(y, S::ZERO), x == y);
        assert_eq!(x.eq_mod(S::ZERO, y), x.divisible_by(y));
        assert!(x.eq_mod(x, y));
    });

    signed_quadruple_gen::<S>().test_properties(|(x, y, z, m)| {
        if x.eq_mod(y, m) && y.eq_mod(z, m) {
            assert!(x.eq_mod(z, m));
        }
    });
}

#[test]
fn eq_mod_properties() {
    apply_fn_to_unsigneds!(eq_mod_properties_helper_unsigned);
    apply_fn_to_unsigned_signed_pairs!(eq_mod_properties_helper_signed);
}