Sharith.Factorial.PrimeSwing.Swing C# (CSharp) Метод

Swing() приватный Метод

private Swing ( int n ) : Sharith.Arithmetic.XInt
n int
Результат Sharith.Arithmetic.XInt
        private XInt Swing(int n)
        {
            if (n < 33) return SmallOddSwing[n];

            int count = 0, rootN = XMath.FloorSqrt(n);

            var aPrimes = this.sieve.GetPrimeCollection(3, rootN);
            var bPrimes = this.sieve.GetPrimeCollection(rootN + 1, n / 3);

            foreach (var prime in aPrimes)
            {
                int q = n, p = 1;

                while ((q /= prime) > 0)
                {
                    if ((q & 1) == 1)
                    {
                        p *= prime;
                    }
                }

                if (p > 1)
                {
                    this.primeList[count++] = p;
                }
            }

            foreach (var prime in bPrimes.Where(prime => ((n / prime) & 1) == 1))
            {
                this.primeList[count++] = prime;
            }

            var primorial = this.sieve.GetPrimorial(n / 2 + 1, n);
            return primorial * XMath.Product(this.primeList, 0, count);
        }