Beispiel #1
0
        internal string ToDecimal()
        {
            if (IsZero())
            {
                return("0");
            }

            BigInt ten       = new BigInt(0xA);
            BigInt numerator = new BigInt();
            BigInt quotient  = new BigInt();
            BigInt remainder = new BigInt();

            numerator.CopyFrom(this);

            // Each hex digit can account for log(16) = 1.21 decimal digits. Times two hex digits in a byte
            // and m_size bytes used in this BigInt, yields the maximum number of characters for the decimal
            // representation of the BigInt.
            char[] dec = new char[(int)Math.Ceiling(m_size * 2 * 1.21)];

            int index = 0;

            do
            {
                Divide(numerator, ten, ref quotient, ref remainder);
                dec[index++] = decValues[remainder.IsZero() ? 0 : (int)remainder.m_elements[0]];
                numerator.CopyFrom(quotient);
            } while (quotient.IsZero() == false);

            Array.Reverse(dec, 0, index);
            return(new String(dec, 0, index));
        }
        internal string ToDecimal()
        {
            if (this.IsZero())
            {
                return("0");
            }
            BigInt denominator = new BigInt(10);
            BigInt numerator   = new BigInt();
            BigInt quotient    = new BigInt();
            BigInt remainder   = new 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));
        }
Beispiel #3
0
        public Projective EcMult(BigInt d, Projective s)
        {
            var size = s.x.Length;

            if (d.IsZero() || s.z.IsZero())
            {
                return new Projective() { x = new BigInt(1, size), y = new BigInt(1, size), z = new BigInt(0, size) };
            }
            if (d.IsOne())
            {
                return s.Clone();
            }
            if (!s.z.IsOne())
            {
                var affine = EcAffinify(s);
                s = EcProjectify(affine);
                affine.Clear();
            }
            else
            {
                s = s.Clone();
            }
            var r = s.Clone();
            var h = d.Mul3();

            for (var i = h.BitCount() - 2; i >= 1; i--)
            {
                var rTmp = r;
                r = EcDouble(r);
                rTmp.Clear();

                if (h.BitAt(i) && !d.BitAt(i))
                {
                    var u = EcFullAdd(r, s);
                    r.Clear();
                    r = u;
                }
                else if (!h.BitAt(i) && d.BitAt(i))
                {
                    var u = EcFullSub(r, s);
                    r.Clear();
                    r = u;
                }
            }
            h.Clear();

            return r;
        }
Beispiel #4
0
        internal string ToDecimal ()
        {
            if (IsZero())
                return "0";

            BigInt ten = new BigInt(0xA);
            BigInt numerator = new BigInt();
            BigInt quotient = new BigInt();
            BigInt remainder = new BigInt();

            numerator.CopyFrom(this);

            // Each hex digit can account for log(16) = 1.21 decimal digits. Times two hex digits in a byte
            // and m_size bytes used in this BigInt, yields the maximum number of characters for the decimal
            // representation of the BigInt.
            char[] dec = new char[(int)Math.Ceiling(m_size * 2 * 1.21)];

            int index = 0;
            do
            {
                Divide(numerator, ten, ref quotient, ref remainder);
                dec[index++] = decValues[remainder.IsZero() ? 0 : (int)remainder.m_elements[0]];
                numerator.CopyFrom(quotient);
            } while (quotient.IsZero() == false);

            Array.Reverse(dec, 0, index);
            return new String(dec, 0, index);
        }
 internal string ToDecimal()
 {
     if (this.IsZero())
     {
         return "0";
     }
     BigInt denominator = new BigInt(10);
     BigInt numerator = new BigInt();
     BigInt quotient = new BigInt();
     BigInt remainder = new 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);
 }