예제 #1
0
        public void Sub(ref int sign, ref BigIntegerBuilder reg)
        {
            if (reg._iuLast == 0)
            {
                Sub(ref sign, reg._uSmall);
                return;
            }

            if (_iuLast == 0)
            {
                var num = _uSmall;
                if (num != 0)
                {
                    Load(ref reg);
                    Sub(ref sign, num);
                }
                else
                {
                    this = new BigIntegerBuilder(ref reg);
                }

                sign = -sign;
                return;
            }

            if (_iuLast < reg._iuLast)
            {
                SubRev(ref reg);
                sign = -sign;
                return;
            }

            var num1 = reg._iuLast + 1;

            if (_iuLast == reg._iuLast)
            {
                _iuLast = BigInteger.GetDiffLength(_bits, reg._bits, _iuLast + 1) - 1;
                if (_iuLast < 0)
                {
                    _iuLast = 0;
                    _uSmall = 0;
                    return;
                }

                var num2 = _bits[_iuLast];
                var num3 = reg._bits[_iuLast];
                if (_iuLast == 0)
                {
                    if (num2 >= num3)
                    {
                        _uSmall = num2 - num3;
                    }
                    else
                    {
                        _uSmall = num3 - num2;
                        sign    = -sign;
                    }

                    return;
                }

                if (num2 < num3)
                {
                    reg._iuLast = _iuLast;
                    SubRev(ref reg);
                    reg._iuLast = num1 - 1;
                    sign        = -sign;
                    return;
                }

                num1 = _iuLast + 1;
            }

            EnsureWritable();
            uint num4 = 0;

            for (var i = 0; i < num1; i++)
            {
                num4 = SubBorrow(ref _bits[i], reg._bits[i], num4);
            }

            if (num4 != 0)
            {
                ApplyBorrow(num1);
            }

            Trim();
        }
예제 #2
0
 public void Sub(ref int sign, ref BigIntegerBuilder reg)
 {
     if (reg._iuLast == 0)
     {
         this.Sub(ref sign, reg._uSmall);
     }
     else if (this._iuLast == 0)
     {
         uint u = this._uSmall;
         if (u == 0)
         {
             this = new BigIntegerBuilder(ref reg);
         }
         else
         {
             this.Load(ref reg);
             this.Sub(ref sign, u);
         }
         sign = -sign;
     }
     else if (this._iuLast < reg._iuLast)
     {
         this.SubRev(ref reg);
         sign = -sign;
     }
     else
     {
         int iuMin = reg._iuLast + 1;
         if (this._iuLast == reg._iuLast)
         {
             this._iuLast = BigInteger.GetDiffLength(this._rgu, reg._rgu, this._iuLast + 1) - 1;
             if (this._iuLast < 0)
             {
                 this._iuLast = 0;
                 this._uSmall = 0;
                 return;
             }
             uint num3 = this._rgu[this._iuLast];
             uint num4 = reg._rgu[this._iuLast];
             if (this._iuLast == 0)
             {
                 if (num3 < num4)
                 {
                     this._uSmall = num4 - num3;
                     sign         = -sign;
                     return;
                 }
                 this._uSmall = num3 - num4;
                 return;
             }
             if (num3 < num4)
             {
                 reg._iuLast = this._iuLast;
                 this.SubRev(ref reg);
                 reg._iuLast = iuMin - 1;
                 sign        = -sign;
                 return;
             }
             iuMin = this._iuLast + 1;
         }
         this.EnsureWritable();
         uint uBorrow = 0;
         for (int i = 0; i < iuMin; i++)
         {
             uBorrow = SubBorrow(ref this._rgu[i], reg._rgu[i], uBorrow);
         }
         if (uBorrow != 0)
         {
             this.ApplyBorrow(iuMin);
         }
         this.Trim();
     }
 }