public static class MathExt
public static BigInteger Sqrt(this BigInteger n)
int bitLength = Convert.ToInt32(Math.Ceiling(BigInteger.Log(n, 2)));
BigInteger root = BigInteger.One << (bitLength / 2);
throw new ArithmeticException("NaN");
private static Boolean isSqrt(BigInteger n, BigInteger root)
BigInteger lowerBound = root*root;
BigInteger upperBound = (root + 1)*(root + 1);
return (n >= lowerBound && n < upperBound);
private BigInteger m_Base = 0;
private BigInteger m_Value = 0;
private int m_Elements = 0;
private BigInteger[] m_BaseElements = null;
public BaseX(BigInteger baseValue)
set { m_Value =value; Eval(); }
public BigInteger[] Elements
get { return m_BaseElements; }
BigInteger Remainder = 0;
Console.WriteLine("Finding Limit");
BigInteger powBase = BigInteger.Pow(m_Base, m_Elements);
Limit = BigInteger.DivRem(m_Value, powBase, out Remainder);
Console.WriteLine("Limit:{0} Remainder:{1} PowBase:{2} Elements: {3}", Limit, Remainder, powBase, m_Elements);
Console.WriteLine("Total Elements needed: {0}", m_Elements);
m_BaseElements = new BigInteger[m_Elements];
Console.WriteLine("Evaluating {0} to base {1}", m_Value, m_Base);
for(int exponent = m_Elements - 1; exponent != -1; exponent--)
m_BaseElements[exponent] = BigInteger.DivRem(Remainder, BigInteger.Pow(m_Base, exp), out Remainder);
if( m_BaseElements[exponent] == 0 && exponent == 0)
m_BaseElements[exponent] = Remainder;
Console.WriteLine("Remainder: {0} BaseValue[{1}]: {2}", Remainder, exponent, m_BaseElements[exponent]);
public static void Main()
BigInteger P = 251, Q = 151;
BaseX basis = new BaseX(50);
foreach(BigInteger element in basis.Elements)
Console.WriteLine("Total:{0} P1:{1} Q:{2}", total, P, Q);