public void PrimitiveRootTest() { for (int i = 0; i < 1000; i++) { int x = int.MaxValue - i; if (!InternalMath.IsPrime(x)) { continue; } MathUtil.IsPrimitiveRoot(x, mods[x].PrimitiveRoot()).Should().BeTrue(); } }
public void IsPrime() { InternalMath.IsPrime(121).Should().BeFalse(); InternalMath.IsPrime(11 * 13).Should().BeFalse(); InternalMath.IsPrime(1_000_000_007).Should().BeTrue(); InternalMath.IsPrime(1_000_000_008).Should().BeFalse(); InternalMath.IsPrime(1_000_000_009).Should().BeTrue(); for (int i = 0; i <= 10000; i++) { InternalMath.IsPrime(i).Should().Be(IsPrimeNaive(i)); } for (int i = 0; i <= 10000; i++) { int x = int.MaxValue - i; InternalMath.IsPrime(x).Should().Be(IsPrimeNaive(x)); } }
public void PrimitiveRootTestNaive() { for (int m = 2; m <= 10000; m++) { if (!InternalMath.IsPrime(m)) { continue; } //int n = InternalMath.PrimitiveRoot(m); int n = mods[m].PrimitiveRoot(); n.Should().BeGreaterOrEqualTo(1); m.Should().BeGreaterThan(n); int x = 1; for (int i = 1; i <= m - 2; i++) { x = (int)((long)x * n % m); // x == n^i x.Should().NotBe(1); } x = (int)((long)x * n % m); x.Should().Be(1); } }