public void BarrettBorder()
 {
     for (uint mod = int.MaxValue; mod >= int.MaxValue - 20; mod--)
     {
         var bt = new Barrett(mod);
         var v  = new List <uint>();
         for (uint i = 0; i < 10; i++)
         {
             v.Add(i);
             v.Add(mod - i);
             v.Add(mod / 2 + i);
             v.Add(mod / 2 - i);
         }
         foreach (var a in v)
         {
             long a2 = a;
             bt.Mul(a, bt.Mul(a, a)).Should().Be((uint)(a2 * a2 % mod * a2 % mod));
             foreach (var b in v)
             {
                 long b2 = b;
                 bt.Mul(a, b).Should().Be((uint)(a2 * b2 % mod));
             }
         }
     }
 }
        public void Barrett()
        {
            for (uint m = 1; m <= 100; m++)
            {
                var bt = new Barrett(m);
                for (uint a = 0; a < m; a++)
                {
                    for (uint b = 0; b < m; b++)
                    {
                        bt.Mul(a, b).Should().Be((a * b) % m);
                    }
                }
            }

            new Barrett(1).Mul(0, 0).Should().Be(0);
        }
Beispiel #3
0
        private static long PowMod(long x, long n, int m)
        {
            Contract.Assert(0 <= n && 1 <= m, reason: $"0 <= {nameof(n)} && 1 <= {nameof(m)}");
            if (m == 1)
            {
                return(0);
            }
            Barrett barrett = new Barrett((uint)m);
            uint    r = 1, y = (uint)SafeMod(x, m);

            while (0 < n)
            {
                if ((n & 1) != 0)
                {
                    r = barrett.Mul(r, y);
                }
                y   = barrett.Mul(y, y);
                n >>= 1;
            }
            return(r);
        }