예제 #1
0
        private ulong FinishBlock(long k0, int length, long[] products, ushort[] values, long kmin, ulong[] sums, long smin, ulong sum0, bool onlySums)
        {
            // Each product can have at most one more prime factor.
            // It has that factor if the value of the product is
            // less than the full value.
            var deltai = (int)(k0 - kmin);
            var deltas = (int)(smin - kmin);
            var kmax   = (int)(deltai + length);

            if (onlySums)
            {
                for (var k = 0; k < kmax; k++)
                {
                    sums[k - deltas] = sum0 += (uint)(values[k] << -(int)((products[k] - (k + kmin)) >> 63));
                    Debug.Assert(k == 0 || (uint)IntegerMath.NumberOfDivisors(k + kmin) == sums[k - deltas] - sums[k - deltas - 1]);
                }
            }
            else if (sums == null)
            {
                for (var k = deltai; k < kmax; k++)
                {
                    sum0 += values[k] <<= -(int)((products[k - deltai] - (k + kmin)) >> 63);
                    Debug.Assert(IntegerMath.NumberOfDivisors(k + kmin) == values[k]);
                }
            }
            else
            {
                for (var k = deltai; k < kmax; k++)
                {
                    sums[k - deltas] = sum0 += values[k] <<= -(int)((products[k - deltai] - (k + kmin)) >> 63);
                    Debug.Assert(IntegerMath.NumberOfDivisors(k + kmin) == values[k]);
                }
            }
            return(sum0);
        }