public void Ntt_FindMinPK() { for (int n = 1; n > 0; n *= 2) { var(p, k) = Ntt0.FindMinPK(n); Console.WriteLine($"{n}: k={k}, p={p}"); } }
public void Convolution() { var a = new long[] { 1, 2, 3, 4 }; var b = new long[] { 5, 6, 7, 8, 9 }; var expected = new long[] { 5, 16, 34, 60, 70, 70, 59, 36 }; CollectionAssert.AreEqual(expected, Dft.Convolution(a, b)); CollectionAssert.AreEqual(expected, Dft0.Convolution(a, b)); CollectionAssert.AreEqual(expected, Ntt.Convolution(a, b)); CollectionAssert.AreEqual(expected, Ntt0.Convolution(a, b)); }
public void Ntt_Fft() { var n = 1 << 4; var a = Enumerable.Range(3, n).Select(x => (long)x).ToArray(); var t0 = Ntt0.Naive(a); var r0 = Ntt0.Naive(t0, true); var t1 = Ntt0.Fft(a); var r1 = Ntt0.Fft(t1, true); var ntt = new Ntt(n); var t2 = ntt.Fft(a); var r2 = ntt.Fft(t2, true); CollectionAssert.AreEqual(t0, t1); CollectionAssert.AreEqual(t0, t2); CollectionAssert.AreEqual(a, r0); CollectionAssert.AreEqual(a, r1); CollectionAssert.AreEqual(a, r2); }
public void Ntt_FindMinGenerator() { Assert.AreEqual(2, Ntt0.FindMinGenerator(3)); Assert.AreEqual(2, Ntt0.FindMinGenerator(5)); Assert.AreEqual(3, Ntt0.FindMinGenerator(17)); Assert.AreEqual(5, Ntt0.FindMinGenerator(97)); Assert.AreEqual(3, Ntt0.FindMinGenerator(65537)); //Assert.AreEqual(3, Ntt0.FindMinGenerator(104857601)); //Assert.AreEqual(3, Ntt0.FindMinGenerator(167772161)); //Assert.AreEqual(3, Ntt0.FindMinGenerator(469762049)); //Assert.AreEqual(11, Ntt0.FindMinGenerator(754974721)); //Assert.AreEqual(3, Ntt0.FindMinGenerator(998244353)); //Assert.AreEqual(3, Ntt0.FindMinGenerator(1004535809)); // Too large. //Assert.AreEqual(5, Ntt0.FindMinGenerator(1001801121793)); //Assert.AreEqual(3, Ntt0.FindMinGenerator(1009317314561)); Console.WriteLine(Ntt0.FindMinGenerator(200003)); }
public void Ntt_FindPKs() { Ntt0.FindPKs(1 << 20, 1000); Console.WriteLine(); Ntt0.FindPKs(1 << 24, 100); }