Esempio n. 1
0
        public static FiniteField nCm(FiniteField n, FiniteField m)
        {
            if (n < m)
            {
                return(0);
            }
            if (n < 0 || m < 0)
            {
                return(0);
            }

            return(Factorial(n) / (Factorial(m) * Factorial(n - m)));
        }
Esempio n. 2
0
 public static FiniteField Derangement(FiniteField n)
 {
     if (der.Length < n.Value)
     {
         der    = new FiniteField[n];
         der[0] = new FiniteField(0);
         der[1] = new FiniteField(1);
         for (int i = 2; i < n; i++)
         {
             der[i] = i * (der[i - 1] + der[i - 2]);
         }
     }
     return(der[n - 1]);
 }
Esempio n. 3
0
 public static FiniteField Factorial(FiniteField n)
 {
     if (fac.Length <= n.Value)
     {
         fac    = new FiniteField[n + 1];
         fac[0] = new FiniteField(1);
         fac[1] = new FiniteField(1);
         for (int i = 2; i <= n; i++)
         {
             fac[i] = i * fac[i - 1];
         }
     }
     return(fac[n]);
 }
Esempio n. 4
0
        static FiniteField inversion(FiniteField a)
        {
            long b = p, u = 1, v = 0;

            while (b != 0)
            {
                long t = a.Value / b;
                a.Value -= t * b;
                long tmp = a.Value;
                a.Value = b;
                b       = tmp;
                u      -= t * v;
                tmp     = u;
                u       = v;
                v       = tmp;
            }
            u %= p;
            if (u < 0)
            {
                u += p;
            }
            return(u);
        }
Esempio n. 5
0
 public FiniteField(FiniteField value)
 {
     Value = value.Value;
 }
Esempio n. 6
0
 public static FiniteField Catalan(FiniteField n)
 {
     return(nCm(2 * n, n) / (n + 1));
 }