/// <summary>Adds the values of two specified <see cref="BigInteger" /> objects.</summary> /// <returns>The sum of <paramref name="left" /> and <paramref name="right" />.</returns> /// <param name="left">The first value to add.</param> /// <param name="right">The second value to add.</param> public static BigInteger operator +(BigInteger left, BigInteger right) { if (right.IsZero) { return(left); } if (left.IsZero) { return(right); } var signLeft = 1; var signRight = 1; var regLeft = new BigIntegerBuilder(left, ref signLeft); var regRight = new BigIntegerBuilder(right, ref signRight); if (signLeft != signRight) { regLeft.Sub(ref signLeft, ref regRight); } else { regLeft.Add(ref regRight); } return(regLeft.GetInteger(signLeft)); }
/// <summary> /// Subtracts a <see cref="BigInteger" /> value from another /// <see cref="BigInteger" /> value. /// </summary> /// <returns>The result of subtracting <paramref name="right" /> from <paramref name="left" />.</returns> /// <param name="left">The value to subtract from (the minuend).</param> /// <param name="right">The value to subtract (the subtrahend).</param> public static BigInteger operator -(BigInteger left, BigInteger right) { if (right.IsZero) { return(left); } if (left.IsZero) { return(-right); } var leftSign = 1; var rightSign = -1; var regLeft = new BigIntegerBuilder(left, ref leftSign); var regRight = new BigIntegerBuilder(right, ref rightSign); if (leftSign != rightSign) { regLeft.Sub(ref leftSign, ref regRight); } else { regLeft.Add(ref regRight); } return(regLeft.GetInteger(leftSign)); }
/// <summary> /// Divides a specified <see cref="BigInteger" /> value by another specified /// <see cref="BigInteger" /> value by using integer division. /// </summary> /// <returns>The integral result of the division.</returns> /// <param name="dividend">The value to be divided.</param> /// <param name="divisor">The value to divide by.</param> /// <exception cref="DivideByZeroException"> /// <paramref name="divisor" /> is 0 (zero). /// </exception> public static BigInteger operator /(BigInteger dividend, BigInteger divisor) { var sign = 1; var regNum = new BigIntegerBuilder(dividend, ref sign); var regDen = new BigIntegerBuilder(divisor, ref sign); regNum.Div(ref regDen); return(regNum.GetInteger(sign)); }
/// <summary>Multiplies two specified <see cref="BigInteger" /> values.</summary> /// <returns>The product of <paramref name="left" /> and <paramref name="right" />.</returns> /// <param name="left">The first value to multiply.</param> /// <param name="right">The second value to multiply.</param> public static BigInteger operator *(BigInteger left, BigInteger right) { var sign = 1; var regLeft = new BigIntegerBuilder(left, ref sign); var regRight = new BigIntegerBuilder(right, ref sign); regLeft.Mul(ref regRight); return(regLeft.GetInteger(sign)); }
/// <summary> /// Returns the remainder that results from division with two specified /// <see cref="BigInteger" /> values. /// </summary> /// <returns>The remainder that results from the division.</returns> /// <param name="dividend">The value to be divided.</param> /// <param name="divisor">The value to divide by.</param> /// <exception cref="DivideByZeroException"> /// <paramref name="divisor" /> is 0 (zero). /// </exception> public static BigInteger operator %(BigInteger dividend, BigInteger divisor) { var signNUm = 1; var signDen = 1; var regNum = new BigIntegerBuilder(dividend, ref signNUm); var regDen = new BigIntegerBuilder(divisor, ref signDen); regNum.Mod(ref regDen); return(regNum.GetInteger(signNUm)); }