예제 #1
0
 internal static void Divide(System.Security.Cryptography.BigInt numerator, System.Security.Cryptography.BigInt denominator, ref System.Security.Cryptography.BigInt quotient, ref System.Security.Cryptography.BigInt remainder)
 {
     if (numerator < denominator)
     {
         quotient.Clear();
         remainder.CopyFrom(numerator);
     }
     else if (numerator == denominator)
     {
         quotient.Clear();
         quotient.SetDigit(0, 1);
         remainder.Clear();
     }
     else
     {
         System.Security.Cryptography.BigInt a = new System.Security.Cryptography.BigInt();
         a.CopyFrom(numerator);
         System.Security.Cryptography.BigInt num2 = new System.Security.Cryptography.BigInt();
         num2.CopyFrom(denominator);
         uint num3 = 0;
         while (num2.Size < a.Size)
         {
             num2.Multiply(0x100);
             num3++;
         }
         if (num2 > a)
         {
             num2.Divide(0x100);
             num3--;
         }
         int num4  = 0;
         int digit = 0;
         int b     = 0;
         System.Security.Cryptography.BigInt c = new System.Security.Cryptography.BigInt();
         quotient.Clear();
         for (int i = 0; i <= num3; i++)
         {
             num4  = (a.Size == num2.Size) ? a.GetDigit(a.Size - 1) : ((0x100 * a.GetDigit(a.Size - 1)) + a.GetDigit(a.Size - 2));
             digit = num2.GetDigit(num2.Size - 1);
             b     = num4 / digit;
             if (b >= 0x100)
             {
                 b = 0xff;
             }
             Multiply(num2, b, ref c);
             while (c > a)
             {
                 b--;
                 Multiply(num2, b, ref c);
             }
             quotient.Multiply(0x100);
             Add(quotient, (byte)b, ref quotient);
             Subtract(a, c, ref a);
             num2.Divide(0x100);
         }
         remainder.CopyFrom(a);
     }
 }
예제 #2
0
        internal string ToDecimal()
        {
            if (this.IsZero())
            {
                return("0");
            }
            System.Security.Cryptography.BigInt denominator = new System.Security.Cryptography.BigInt(10);
            System.Security.Cryptography.BigInt numerator   = new System.Security.Cryptography.BigInt();
            System.Security.Cryptography.BigInt quotient    = new System.Security.Cryptography.BigInt();
            System.Security.Cryptography.BigInt remainder   = new System.Security.Cryptography.BigInt();
            numerator.CopyFrom(this);
            char[] array  = new char[(int)Math.Ceiling((double)((this.m_size * 2) * 1.21))];
            int    length = 0;

            do
            {
                Divide(numerator, denominator, ref quotient, ref remainder);
                array[length++] = decValues[remainder.IsZero() ? 0 : remainder.m_elements[0]];
                numerator.CopyFrom(quotient);
            }while (!quotient.IsZero());
            Array.Reverse(array, 0, length);
            return(new string(array, 0, length));
        }