예제 #1
0
        public BigNumber Exp(int places)
        {
            BigNumber res = 0;

            BigNumber.Exp(this, res, places);
            return(res);
        }
예제 #2
0
        public BigNumber Exp()
        {
            BigNumber res = 0;

            BigNumber.Exp(this, res, numDefaultPlaces);
            return(res);
        }
예제 #3
0
        static void M_log_basic_iteration(BigNumber nn, BigNumber rr, int places)
        {
            BigNumber tmp0, tmp1, tmp2, tmpX;

            if (places < 360)
            {
                BigNumber.M_log_solve_cubic(nn, rr, places);
            }
            else
            {
                tmp0 = new BigNumber();
                tmp1 = new BigNumber();
                tmp2 = new BigNumber();
                tmpX = new BigNumber();

                BigNumber.M_log_solve_cubic(nn, tmpX, 110);
                BigNumber.Neg(tmpX, tmp0);
                BigNumber.Exp(tmp0, tmp1, (places + 8));
                BigNumber.Mul(tmp1, nn, tmp2);
                BigNumber.Sub(tmp2, BigNumber.One, tmp1);

                BigNumber.M_log_near_1(tmp1, tmp0, (places - 104));

                BigNumber.Add(tmpX, tmp0, tmp1);
                BigNumber.Round(tmp1, rr, places);
            }
        }
예제 #4
0
        static public void Power(BigNumber xx, BigNumber yy, BigNumber rr, int places)
        {
            int       iflag;
            BigNumber tmp8        = new BigNumber();
            BigNumber tmp9        = new BigNumber();
            int       M_size_flag = BigNumber.GetSizeofInt();

            if (yy.signum == 0)
            {
                BigNumber.Copy(BigNumber.One, rr);
                return;
            }

            if (xx.signum == 0)
            {
                BigNumber.SetZero(rr);
                return;
            }

            if (BigNumber.IsInteger(yy) > 0)
            {
                iflag = 0;

                if (M_size_flag == 2)            /* 16 bit compilers */
                {
                    if (yy.exponent <= 4)
                    {
                        iflag = 1;
                    }
                }
                else                             /* >= 32 bit compilers */
                {
                    if (yy.exponent <= 7)
                    {
                        iflag = 1;
                    }
                }

                if (iflag > 0)
                {
                    String sbuf = BigNumber.ToIntString(yy);
                    int    Exp  = Convert.ToInt32(sbuf);
                    BigNumber.IntPow(places, xx, Exp, rr);
                    return;
                }
            }

            tmp8 = new BigNumber();
            tmp9 = new BigNumber();

            BigNumber.Log(xx, tmp9, (places + 8));
            BigNumber.Mul(tmp9, yy, tmp8);
            BigNumber.Exp(tmp8, rr, places);
        }
예제 #5
0
        static void M_log_solve_cubic(BigNumber nn, BigNumber rr, int places)
        {
            BigNumber tmp0, tmp1, tmp2, tmp3, guess;
            int       ii, maxp, tolerance, local_precision;

            guess = new BigNumber();
            tmp0  = new BigNumber();
            tmp1  = new BigNumber();
            tmp2  = new BigNumber();
            tmp3  = new BigNumber();

            BigNumber.M_get_log_guess(nn, guess);

            tolerance       = -(places + 4);
            maxp            = places + 16;
            local_precision = 18;

            ii = 0;

            while (true)
            {
                BigNumber.Exp(guess, tmp1, local_precision);

                BigNumber.Sub(tmp1, nn, tmp3);
                BigNumber.Add(tmp1, nn, tmp2);

                BigNumber.Div(tmp3, tmp2, tmp1, local_precision);
                BigNumber.Mul(BigNumber.Two, tmp1, tmp0);
                BigNumber.Sub(guess, tmp0, tmp3);

                if (ii != 0)
                {
                    if (((3 * tmp0.exponent) < tolerance) || (tmp0.signum == 0))
                    {
                        break;
                    }
                }

                BigNumber.Round(tmp3, guess, local_precision);

                local_precision *= 3;

                if (local_precision > maxp)
                {
                    local_precision = maxp;
                }

                ii = 1;
            }

            BigNumber.Round(tmp3, rr, places);
        }