private static StaticModInt <T>[] CalcurateSumE() { int g = InternalMath.PrimitiveRoot((int)default(T).Mod); int cnt2 = InternalBit.BSF(default(T).Mod - 1); var e = new StaticModInt <T>(g).Pow((default(T).Mod - 1) >> cnt2); var ie = e.Inv(); var sumE = new StaticModInt <T> [cnt2 - 2]; // es[i]^(2^(2+i)) == 1 Span <StaticModInt <T> > es = stackalloc StaticModInt <T> [cnt2 - 1]; Span <StaticModInt <T> > ies = stackalloc StaticModInt <T> [cnt2 - 1]; for (int i = es.Length - 1; i >= 0; i--) { // e^(2^(2+i)) == 1 es[i] = e; ies[i] = ie; e *= e; ie *= ie; } var now = StaticModInt <T> .Raw(1); for (int i = 0; i < sumE.Length; i++) { sumE[i] = es[i] * now; now *= ies[i]; } return(sumE); }
public void PrimitiveRootTemplateTest() { MathUtil.IsPrimitiveRoot(2, InternalMath.PrimitiveRoot <Mod2>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(3, InternalMath.PrimitiveRoot <Mod3>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(5, InternalMath.PrimitiveRoot <Mod5>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(7, InternalMath.PrimitiveRoot <Mod7>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(11, InternalMath.PrimitiveRoot <Mod11>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(998244353, InternalMath.PrimitiveRoot <Mod998244353>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(1000000007, InternalMath.PrimitiveRoot <Mod1000000007>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(469762049, InternalMath.PrimitiveRoot <Mod469762049>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(167772161, InternalMath.PrimitiveRoot <Mod167772161>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(754974721, InternalMath.PrimitiveRoot <Mod754974721>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(324013369, InternalMath.PrimitiveRoot <Mod324013369>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(831143041, InternalMath.PrimitiveRoot <Mod831143041>()).Should().BeTrue(); MathUtil.IsPrimitiveRoot(1685283601, InternalMath.PrimitiveRoot <Mod1685283601>()).Should().BeTrue(); }
private static StaticModInt <T>[] CalcurateSumIE() { int g = InternalMath.PrimitiveRoot <T>(); int cnt2 = InternalBit.BSF(default(T).Mod - 1); var e = new StaticModInt <T>(g).Pow((default(T).Mod - 1) >> cnt2); var ie = e.Inv(); var sumIE = new StaticModInt <T> [30]; // es[i]^(2^(2+i)) == 1 Span <StaticModInt <T> > es = #if !NETCOREAPP3_0_OR_GREATER new #else stackalloc #endif StaticModInt <T> [cnt2 - 1]; Span <StaticModInt <T> > ies = #if !NETCOREAPP3_0_OR_GREATER new #else stackalloc #endif StaticModInt <T> [cnt2 - 1]; for (int i = es.Length - 1; i >= 0; i--) { // e^(2^(2+i)) == 1 es[i] = e; ies[i] = ie; e *= e; ie *= ie; } var now = StaticModInt <T> .Raw(1); for (int i = 0; i <= cnt2 - 2; i++) { sumIE[i] = ies[i] * now; now *= es[i]; } return(sumIE); }