//root function public BigInteger root(int order) { uint numBits = (uint)this.bitCount(); if ((numBits & 0x1) != 0) // odd number of bits numBits = (numBits >> 1) + 1; else numBits = (numBits >> 1); uint bytePos = numBits >> 5; byte bitPos = (byte)(numBits & 0x1F); uint mask; BigInteger result = new BigInteger(); if (bitPos == 0) mask = 0x80000000; else { mask = (uint)1 << bitPos; bytePos++; } result.dataLength = (int)bytePos; for (int i = (int)bytePos - 1; i >= 0; i--) { while (mask != 0) { // guess result.data[i] ^= mask; // undo the guess if its square is larger than this if ((result.Pow(order)) > this) result.data[i] ^= mask; mask >>= 1; } mask = 0x80000000; } return result; }
/// <summary> /// Raises the current number to the power specified. /// </summary> /// <param name="number">The number to be raised.</param> /// <param name="raisedTo">The power to be raised to.</param> /// <returns> /// A BigInteger representing this raised to a power /// </returns> public static BigInteger Pow(BigInteger number, BigInteger raisedTo) { return number.Pow(raisedTo); }