/// <summary>
        /// /重载:一个高精度数除以一个高精度数
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static BigNumber operator /(BigNumber a, BigNumber b)
        {
            BigNumber c    = new BigNumber();
            BigNumber temp = new BigNumber();

            if (Comparer(a, Trans(0)))
            {
                return(c);
            }
            c.positive = a.positive * b.positive;
            a.positive = 1;
            b.positive = 1;
            temp       = a;
            int times = 0, add = 0;
            int i, t, s, p;

            for (s = 0; a.value[s] == 0; s++)
            {
                ;
            }
            for (t = 0; b.value[t] == 0; t++)
            {
                ;
            }
            if (t - s > 0)
            {
                times = t - s;
                for (i = 59 - times; i >= 0; i--)
                {
                    temp.value[i + times] = temp.value[i];
                }
                for (i = 0; i < times; i++)
                {
                    temp.value[i] = 0;
                }
            }
            p = 19 - t;
            for (i = t; p + i < 60; i++)
            {
                int k = 9;
                while ((temp - b * k).positive == -1 && k >= 0)
                {
                    k--;
                }
                c.value[p + i] = k;
                temp           = (temp - b * k) * 10;
            }
            c = (c + Trans(add)) * Math.Pow(10.0, times);
            if (c.zero(c))
            {
                c.positive = 1;
            }
            return(c);
        }
        /// <summary>
        /// 减半Taylor
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        public BigNumber Taylor(BigNumber a)
        {
            int       i = 0, count = 0;
            BigNumber two = new BigNumber();

            //Trans(2);
            two.value[19] = 2;
            BigNumber ln2 = new BigNumber();

            //0.69314 71805 59945 30941 72321 21458 17656 80718
            //  20 24 25 29 30 34 35 39 40 44 45 49 50 54 55 59
            ln2.value[23] = ln2.value[26] = ln2.value[39] = ln2.value[44] = ln2.value[46] = ln2.value[50] = ln2.value[58] = 1;
            ln2.value[41] = ln2.value[43] = ln2.value[45] = 2;
            ln2.value[22] = ln2.value[35] = ln2.value[42] = 3;
            ln2.value[24] = ln2.value[33] = ln2.value[38] = ln2.value[47] = 4;
            ln2.value[29] = ln2.value[30] = ln2.value[34] = ln2.value[48] = ln2.value[53] = 5;
            ln2.value[20] = ln2.value[52] = ln2.value[54] = 6;
            ln2.value[25] = ln2.value[40] = ln2.value[51] = ln2.value[57] = 7;
            ln2.value[27] = ln2.value[49] = ln2.value[55] = ln2.value[59] = 8;
            ln2.value[21] = ln2.value[31] = ln2.value[32] = ln2.value[37] = 9;
            if (!(a < two))
            {
                do
                {
                    a = a / 2;
                    i++;
                } while (!(a < two));
            }
            a = a - 1;
            BigNumber x     = copy(a);
            BigNumber lnx   = new BigNumber();
            BigNumber temp1 = new BigNumber();
            int       n     = 1;
            BigNumber temp  = x / n;

            do
            {
                lnx = lnx + temp;
                count++;
                temp1 = x * a;
                x     = invert(temp1);
                n++;
                temp = x / n;
            } while (!(temp.zero(temp)));
            BigNumber result = new BigNumber();

            result = lnx + (ln2 * i);
            return(result);
        }
        /// <summary>
        /// *重载:两个高精度数相乘
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static BigNumber operator *(BigNumber a, BigNumber b)
        {
            BigNumber c = new BigNumber();

            if (a.zero(a) || b.zero(b))
            {
                return(c);
            }
            int positive = a.positive * b.positive;

            a.positive = 1;
            b.positive = 1;
            BigNumber d = copy(b);
            int       i, j;

            for (i = 59; i >= 0; i--)
            {
                if (i >= 20)                       //处理小数部分
                {
                    for (j = 0; j < i - 19; j++)
                    {
                        d.value[j] = 0;
                    }
                    for (j = i - 19; j < 60; j++)
                    {
                        d.value[j] = b.value[j - i + 19];
                    }
                    c = c + (d * a.value[i]);
                }
                else                                //处理整数部分
                {
                    for (j = 0; j < 60 - 19 + i; j++)
                    {
                        d.value[j] = b.value[j + 19 - i];
                    }
                    c = c + (d * a.value[i]);
                }
            }
            c.positive = positive;
            if (c.zero(c))
            {
                c.positive = 1;
            }
            return(c);
        }
        /// <summary>
        /// 迭代开根号
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        public BigNumber sqrt(BigNumber a)
        {
            BigNumber one = new BigNumber();

            one.value[19] = 1;
            BigNumber x1 = new BigNumber();
            BigNumber x2 = new BigNumber();

            if (a.zero(a))
            {
                return(a);
            }
            else
            {
                if (a > one)
                {
                    x2 = a / 2;
                }
                else
                {
                    x2 = a * 2;
                }
                do
                {
                    x1 = copy(x2);
                    x2 = (x1 + (a / x1)) / 2;
                } while (!(x2 - x1).zero(x2 - x1));
                for (int i = 0; i < 60; i++)
                {
                    if (x2.value[i] > 9)
                    {
                        x2.value[i]     -= 10;
                        x2.value[i + 1] += 1;
                    }
                }
                return(x2);
            }
        }
        /// <summary>
        /// +重载:两个高精度数相加
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static BigNumber operator +(BigNumber a, BigNumber b)
        {
            BigNumber c    = new BigNumber();
            int       flag = a.positive * b.positive;

            if (flag == 1)
            {
                c.positive = a.positive;
                int carry = 0;
                for (int i = 59; i >= 0; i--)
                {
                    c.value[i] = a.value[i] + b.value[i] + carry;
                    if (c.value[i] > 9)
                    {
                        c.value[i] = c.value[i] - 10;
                        carry      = 1;
                    }
                    else
                    {
                        carry = 0;
                    }
                }
            }
            else
            {
                if (abs(a) > abs(b))
                {
                    c.positive = a.positive;
                    int borrow = 0;
                    for (int i = 59; i >= 0; i--)
                    {
                        c.value[i] = a.value[i] - b.value[i] - borrow;
                        if (c.value[i] >= 0)
                        {
                            borrow = 0;
                        }
                        else
                        {
                            c.value[i] += 10;
                            borrow      = 1;
                        }
                    }
                }
                else
                {
                    c.positive = b.positive;
                    int borrow = 0;
                    for (int i = 59; i >= 0; i--)
                    {
                        c.value[i] = b.value[i] - a.value[i] - borrow;
                        if (c.value[i] >= 0)
                        {
                            borrow = 0;
                        }
                        else
                        {
                            c.value[i] += 10;
                            borrow      = 1;
                        }
                    }
                }
            }
            if (c.zero(c))
            {
                c.positive = 1;
            }
            return(c);
        }
        /// <summary>
        /// e^x高精度运算
        /// </summary>
        /// <param name="a"></param>
        /// <returns></returns>
        public BigNumber exp(BigNumber a)
        {
            BigNumber e = new BigNumber();
            int       i;

            for (i = 0; i < 18; i++)
            {
                e.value[i] = 0;
            }
            e.value[32] = e.value[40] = 0;
            e.value[21] = e.value[25] = e.value[46] = 1;
            e.value[19] = e.value[23] = e.value[27] = e.value[35] = e.value[41] = e.value[49] = e.value[52] = e.value[59] = 2;
            e.value[36] = e.value[38] = e.value[47] = 3;
            e.value[29] = e.value[33] = e.value[44] = e.value[53] = 4;
            e.value[30] = e.value[34] = e.value[37] = e.value[48] = e.value[57] = 5;
            e.value[39] = e.value[50] = e.value[51] = 6;
            e.value[20] = e.value[43] = e.value[45] = e.value[55] = e.value[56] = e.value[58] = 7;
            e.value[22] = e.value[24] = e.value[26] = e.value[28] = e.value[42] = 8;
            e.value[31] = e.value[54] = 9;
            //Trans(2.7182818284590452353602874713526624977572);
            BigNumber Integer = new BigNumber();
            BigNumber Decimal = new BigNumber();

            for (i = 0; i < 20; i++)
            {
                Integer.value[i] = a.value[i];
            }
            for (i = 20; i < 60; i++)
            {
                Decimal.value[i] = a.value[i];
            }
            BigNumber temp   = Trans(1);
            BigNumber temp1  = copy(Decimal);
            BigNumber result = Trans(1);

            i = 1;

            if (a.zero(a))
            {
                return(Trans(1));
            }
            else if (a.positive == 1)
            {
                while (!Integer.zero(Integer))
                {
                    temp    = temp * e;
                    Integer = Integer - 1;
                }
                while (!temp1.zero(temp1))
                {
                    result = result + temp1;
                    i++;
                    temp1 = temp1 * Decimal / i;
                }
                result = result * temp;
                return(result);
            }
            else
            {
                while (!Integer.zero(Integer))
                {
                    temp    = temp * e;
                    Integer = Integer - 1;
                }
                while (!temp1.zero(temp1))
                {
                    result = result + temp1;
                    i++;
                    temp1 = temp1 * Decimal / i;
                }
                result = 1 / (temp * result);
                return(result);
            }
        }