Skip to content

Commit 6428bd4

Browse files
committed
Corner cases of "modint" when mod = 1
rust-lang-ja#110
1 parent 6600bef commit 6428bd4

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

src/modint.rs

+16-3
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,7 @@ pub trait ModIntBase:
673673
#[inline]
674674
fn pow(self, mut n: u64) -> Self {
675675
let mut x = self;
676-
let mut r = Self::raw(1);
676+
let mut r = Self::raw(u32::from(Self::modulus() > 1));
677677
while n > 0 {
678678
if n & 1 == 1 {
679679
r *= x;
@@ -1046,9 +1046,9 @@ macro_rules! impl_folding {
10461046

10471047
impl_folding! {
10481048
impl<M: Modulus> Sum<_> for StaticModInt<M> { fn sum(_) -> _ { _(Self::raw(0), Add::add) } }
1049-
impl<M: Modulus> Product<_> for StaticModInt<M> { fn product(_) -> _ { _(Self::raw(1), Mul::mul) } }
1049+
impl<M: Modulus> Product<_> for StaticModInt<M> { fn product(_) -> _ { _(Self::raw(u32::from(Self::modulus() > 1)), Mul::mul) } }
10501050
impl<I: Id > Sum<_> for DynamicModInt<I> { fn sum(_) -> _ { _(Self::raw(0), Add::add) } }
1051-
impl<I: Id > Product<_> for DynamicModInt<I> { fn product(_) -> _ { _(Self::raw(1), Mul::mul) } }
1051+
impl<I: Id > Product<_> for DynamicModInt<I> { fn product(_) -> _ { _(Self::raw(u32::from(Self::modulus() > 1)), Mul::mul) } }
10521052
}
10531053

10541054
#[cfg(test)]
@@ -1163,6 +1163,19 @@ mod tests {
11631163
assert_eq!(expected, c);
11641164
}
11651165

1166+
// Corner cases of "modint" when mod = 1
1167+
// https://github.com/rust-lang-ja/ac-library-rs/issues/110
1168+
#[test]
1169+
fn mod1_corner_case() {
1170+
ModInt::set_modulus(1); // !!
1171+
1172+
let x: ModInt = std::iter::empty::<ModInt>().product();
1173+
assert_eq!(x.val(), 0);
1174+
1175+
let y = ModInt::new(123).pow(0);
1176+
assert_eq!(y.val(), 0);
1177+
}
1178+
11661179
// test `2^31 < modulus < 2^32` case
11671180
// https://github.com/rust-lang-ja/ac-library-rs/issues/111
11681181
#[test]

0 commit comments

Comments
 (0)