public BigInteger[] DivideAndRemainder(
BigInteger val)
{
if (val.sign == 0)
throw new ArithmeticException("Division by zero error");
BigInteger[] biggies = new BigInteger[2];
if (sign == 0)
{
biggies[0] = Zero;
biggies[1] = Zero;
}
else if (val.QuickPow2Check()) // val is power of two
{
int e = val.Abs().BitLength - 1;
BigInteger quotient = this.Abs().ShiftRight(e);
int[] remainder = this.LastNBits(e);
biggies[0] = val.sign == this.sign ? quotient : quotient.Negate();
biggies[1] = new BigInteger(this.sign, remainder, true);
}
else
{
int[] remainder = (int[]) this.magnitude.Clone();
int[] quotient = Divide(remainder, val.magnitude);
biggies[0] = new BigInteger(this.sign * val.sign, quotient, true);
biggies[1] = new BigInteger(this.sign, remainder, true);
}
return biggies;
}