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))); }
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]); }
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]); }
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); }
public FiniteField(FiniteField value) { Value = value.Value; }
public static FiniteField Catalan(FiniteField n) { return(nCm(2 * n, n) / (n + 1)); }