public void WriteFactors(TextWriter file) { if (file == null) { return; } file.WriteLine("The prime factors of {0}! ", this.n); var sum = this.n - XMath.BitCount(this.n); file.Write("2^{0}", sum); for (var p = 0; p < this.card; p++) { int f = this.primeList[p], m = this.multiList[p]; sum += m; if (m > 1) { file.Write("*{0}^{1}", f, m); } else { file.Write("*{0}", f); } } file.WriteLine(); file.WriteLine("Number of different factors: {0} ", this.card); file.WriteLine("Number of all factors: {0} ", sum); }
public XInt Factorial(int n) { if (n < 0) { throw new ArithmeticException( this.Name + ": " + nameof(n) + " >= 0 required, but was " + n); } this.oddFactNdiv4 = this.oddFactNdiv2 = XInt.One; return(this.OddFactorial(n) << (n - XMath.BitCount(n))); }
public XInt Factorial(int n) { if (n < 20) { return(XMath.Factorial(n)); } var log2N = XMath.FloorLog2(n); var j = log2N; var hN = n; this.primeList = new int[log2N][]; this.listLength = new int[log2N]; this.bound = new int[log2N]; this.tower = new int[log2N + 1]; while (true) { this.tower[j] = hN; if (hN == 1) { break; } this.bound[--j] = hN / 3; var pLen = hN < 4 ? 6 : (int)(2.0 * (XMath.FloorSqrt(hN) + (double)hN / (XMath.Log2(hN) - 1))); this.primeList[j] = new int[pLen]; hN >>= 1; } this.tower[0] = 2; this.PrimeFactors(n); var init = this.listLength[0] == 0 ? 1 : 3; var oddFactorial = new XInt(init); var results = new XInt[log2N]; Parallel.For(1, log2N, i => results[i] = XMath.Product(this.primeList[i], 0, this.listLength[i]) ); for (var i = 1; i < log2N; i++) { oddFactorial = XInt.Pow(oddFactorial, 2); oddFactorial = oddFactorial * results[i]; } return(oddFactorial << (n - XMath.BitCount(n))); }
public XInt Factorial(int n) { if (n < 20) { return(XMath.Factorial(n)); } this.cache = new Dictionary <int, CachedPrimorial>(); 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); }
public XInt Factorial(int n) { if (n < 20) { return(XMath.Factorial(n)); } var sieve = new PrimeSieve(n); this.results = new IAsyncResult[XMath.FloorLog2(n)]; this.swingDelegate = Swing; this.taskCounter = 0; var N = n; // -- It is more efficient to add the big swings // -- first and the small ones later! while (N >= Smallswing) { this.results[this.taskCounter++] = this.swingDelegate.BeginInvoke(sieve, N, null, null); N >>= 1; } return(this.RecFactorial(n) << (n - XMath.BitCount(n))); }
public XInt Factorial(int n) { if (n < 0) { throw new System.ArgumentOutOfRangeException( this.Name + ": " + nameof(n) + " >= 0 required, but was " + n); } if (n < 20) { return(XMath.Factorial(n)); } var lgN = XMath.FloorLog2(n); var piN = 2 + (15 * n) / (8 * (lgN - 1)); this.primeList = new int[piN]; this.multiList = new int[piN]; var len = this.PrimeFactors(n); var exp2 = n - XMath.BitCount(n); return(this.RepeatedSquare(len, 1) << exp2); }