public static unsafe void Multiply (uint [] x, uint xOffset, uint xLen, uint [] y, uint yOffset, uint yLen, uint [] d, uint dOffset)
{
fixed (uint* xx = x, yy = y, dd = d) {
uint* xP = xx + xOffset,
xE = xP + xLen,
yB = yy + yOffset,
yE = yB + yLen,
dB = dd + dOffset;
for (; xP < xE; xP++, dB++) {
if (*xP == 0) continue;
ulong mcarry = 0;
uint* dP = dB;
for (uint* yP = yB; yP < yE; yP++, dP++) {
mcarry += ((ulong)*xP * (ulong)*yP) + (ulong)*dP;
*dP = (uint)mcarry;
mcarry >>= 32;
}
if (mcarry != 0)
*dP = (uint)mcarry;
}
}
}