예제 #1
0
        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);
        }