From 693b85af82d51e29efc19e20cd4df01e7db93d36 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Sat, 1 Apr 2023 16:21:32 +0900 Subject: [PATCH] Support modint under m = 1 --- src/modint.rs | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/modint.rs b/src/modint.rs index 956c440..aa4b985 100644 --- a/src/modint.rs +++ b/src/modint.rs @@ -673,7 +673,7 @@ pub trait ModIntBase: #[inline] fn pow(self, mut n: u64) -> Self { let mut x = self; - let mut r = Self::raw(1); + let mut r = Self::new(1); while n > 0 { if n & 1 == 1 { r *= x; @@ -1043,14 +1043,41 @@ macro_rules! impl_folding { impl_folding! { impl Sum<_> for StaticModInt { fn sum(_) -> _ { _(Self::raw(0), Add::add) } } - impl Product<_> for StaticModInt { fn product(_) -> _ { _(Self::raw(1), Mul::mul) } } + impl Product<_> for StaticModInt { fn product(_) -> _ { _(Self::new(1), Mul::mul) } } impl Sum<_> for DynamicModInt { fn sum(_) -> _ { _(Self::raw(0), Add::add) } } - impl Product<_> for DynamicModInt { fn product(_) -> _ { _(Self::raw(1), Mul::mul) } } + impl Product<_> for DynamicModInt { fn product(_) -> _ { _(Self::new(1), Mul::mul) } } } #[cfg(test)] mod tests { - use crate::modint::ModInt1000000007; + use crate::modint::{ModInt, ModInt1000000007}; + + #[test] + fn dynamic_modint_new() { + ModInt::set_modulus(1_000_000_007); + + assert_eq!(0, ModInt::new(0u32).val); + assert_eq!(1, ModInt::new(1u32).val); + assert_eq!(1, ModInt::new(1_000_000_008u32).val); + + assert_eq!(0, ModInt::new(0u64).val); + assert_eq!(1, ModInt::new(1u64).val); + assert_eq!(1, ModInt::new(1_000_000_008u64).val); + + assert_eq!(0, ModInt::new(0usize).val); + assert_eq!(1, ModInt::new(1usize).val); + assert_eq!(1, ModInt::new(1_000_000_008usize).val); + + assert_eq!(0, ModInt::new(0i64).val); + assert_eq!(1, ModInt::new(1i64).val); + assert_eq!(1, ModInt::new(1_000_000_008i64).val); + assert_eq!(1_000_000_006, ModInt::new(-1i64).val); + + ModInt::set_modulus(1); + + assert_eq!(0, ModInt::new(0i64).val); + assert_eq!(0, ModInt::new(1i64).val); + } #[test] fn static_modint_new() {