public XInt Factorial(int n)
{
if (n < 20) { return XMath.Factorial(n); }
this.sieve = new PrimeSieve(n);
var pLen = (int)(2.0 * (XMath.FloorSqrt(n)
+ (double)n / (XMath.Log2(n) - 1)));
this.primeList = new int[pLen];
var exp2 = n - XMath.BitCount(n);
return this.RecFactorial(n) << exp2;
}