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);
}