private XInt RecFactorial(int n) { if (n < 2) { return(XInt.One); } return(XInt.Pow(this.RecFactorial(n / 2), 2) * this.Swing(n)); }
private XInt RecFactorial3(int n) { if (n < 2) { return(XInt.One); } var recFact = this.RecFactorial3(n / 2); var sqrFact = XInt.Pow(recFact, 2); var swing = n < Smallswing ? SmallOddSwing3[n] : this.swingDelegate3.EndInvoke(this.results3[--this.taskCounter3]); return(sqrFact * swing); }
private XInt OddFactorial(int n) { XInt oddFact; if (n < Smallfact) { oddFact = SmallOddFactorial[n]; } else { var sqrOddFact = this.OddFactorial(n / 2); var ndiv4 = n / 4; var oddFactNd4 = ndiv4 < Smallfact ? SmallOddFactorial[ndiv4] : this.oddFactNdiv4; oddFact = XInt.Pow(sqrOddFact, 2) * OddSwing(n, oddFactNd4); } this.oddFactNdiv4 = this.oddFactNdiv2; this.oddFactNdiv2 = oddFact; return(oddFact); }
private XInt NestedSquare(int len) { if (len == 0) { return(XInt.One); } var i = 0; var mult = this.multiList[0]; while (mult > 1) { if ((mult & 1) == 1) // is mult odd ? { this.primeList[len++] = this.primeList[i]; } this.multiList[i++] = mult >> 1; mult = this.multiList[i]; } return(XMath.Product(this.primeList, i, len - i) * XInt.Pow(this.NestedSquare(i), 2)); }
public XInt Factorial(int n) { if (n < 20) { return(XMath.Factorial(n)); } var rootN = XMath.FloorSqrt(n); var log2N = XMath.FloorLog2(n); var section = new XInt[log2N + 1]; for (var i = 0; i < section.Length; i++) { section[i] = XInt.One; } var sieve = new PrimeSieve(n); var primes = sieve.GetPrimeCollection(3, rootN); foreach (var prime in primes) { int k = 0, m = 0, q = n; do { m += q /= prime; } while (q >= 1); while (m > 0) { if ((m & 1) == 1) { section[k] *= prime; } m = m / 2; k++; } } var j = 2; var low = n; while (low != rootN) { var high = low; low = n / j++; if (low < rootN) { low = rootN; } var primorial = sieve.GetPrimorial(low + 1, high); if (primorial != XInt.One) { int k = 0, m = j - 2; while (m > 0) { if ((m & 1) == 1) { section[k] *= primorial; } m = m / 2; k++; } } } var factorial = section[log2N]; for (var i = log2N - 1; i >= 0; --i) { factorial = XInt.Pow(factorial, 2) * section[i]; } var exp2N = n - XMath.BitCount(n); return(factorial << exp2N); }