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