static private void Mul(BigNumber aa, BigNumber bb, BigNumber rr) { int ai, itmp, nexp, ii, jj, indexa, indexb, index0, numdigits; sbyte sign; sign = (sbyte)(aa.signum * bb.signum); nexp = aa.exponent + bb.exponent; if (sign == 0) { BigNumber.SetZero(rr); return; } numdigits = aa.dataLength + bb.dataLength; indexa = (aa.dataLength + 1) >> 1; indexb = (bb.dataLength + 1) >> 1; if (indexa >= 48 && indexb >= 48) { BigNumber.FastMul(aa, bb, rr); return; } ii = (numdigits + 1) >> 1; if (ii >= rr.mantissa.Length) { BigNumber.Expand(rr, ii + 32); } index0 = indexa + indexb; for (int i = 0; i < index0; i++) { rr.mantissa[i] = 0; } ii = indexa; while (true) { index0--; int crp = index0; jj = indexb; ai = (int)aa.mantissa[--ii]; while (true) { itmp = ai * bb.mantissa[--jj]; rr.mantissa[crp - 1] += s_MsbLookupMult[itmp]; rr.mantissa[crp] += s_LsbLookupMult[itmp]; if (rr.mantissa[crp] >= 100) { rr.mantissa[crp] -= 100; rr.mantissa[crp - 1] += 1; } crp--; if (rr.mantissa[crp] >= 100) { rr.mantissa[crp] -= 100; rr.mantissa[crp - 1] += 1; } if (jj == 0) { break; } } if (ii == 0) { break; } } rr.signum = sign; rr.exponent = nexp; rr.dataLength = numdigits; BigNumber.Normalize(rr); }