public BigNumber Exp(int places) { BigNumber res = 0; BigNumber.Exp(this, res, places); return(res); }
public BigNumber Exp() { BigNumber res = 0; BigNumber.Exp(this, res, numDefaultPlaces); return(res); }
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); } }
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); }
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); }