func Factorial(n uint64) *big.Int {

	if n < 20 {
		var r big.Int
		return r.MulRange(1, int64(n))
	}

	s := swingfactorial.NewSwing(n)
	r := OddFactorial(s, n)
	exp := uint(n - uint64(xmath.BitCount64(n)))
	return r.Lsh(r, exp)
}