コード例 #1
0
 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}");
     }
 }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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));
        }
コード例 #5
0
 public void Ntt_FindPKs()
 {
     Ntt0.FindPKs(1 << 20, 1000);
     Console.WriteLine();
     Ntt0.FindPKs(1 << 24, 100);
 }