public BigNumber Pow(int exp) { BigNumber res = 0; BigNumber.IntPow(numDefaultPlaces, this, exp, res); return(res); }
public BigNumber Pow(int exp, int places) { BigNumber res = 0; BigNumber.IntPow(places, this, exp, res); return(res); }
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 private void Exp(BigNumber src, BigNumber dst, int places) { BigNumber A = 0, B = 0, C = 0; int dplaces, nn = 0, ii = 0; if (src.signum == 0) { BigNumber.Copy(BigNumber.One, dst); return; } if (src.exponent <= -3) { M_raw_exp(src, C, (places + 6)); BigNumber.Round(C, dst, places); return; } if (M_exp_compute_nn(ref nn, A, src) != 0) { throw new BigNumberException("'Exp', Input too large, Overflow"); } dplaces = places + 8; BigNumber.CheckLogPlaces(dplaces); BigNumber.Mul(A, BN_lc_log2, B); BigNumber.Sub(src, B, A); while (true) { if (A.signum != 0) { if (A.exponent == 0) { break; } } if (A.signum >= 0) { nn++; BigNumber.Sub(A, BN_lc_log2, B); BigNumber.Copy(B, A); } else { nn--; BigNumber.Add(A, BN_lc_log2, B); BigNumber.Copy(B, A); } } BigNumber.Mul(A, BN_exp_512R, C); M_raw_exp(C, B, dplaces); ii = 9; while (true) { BigNumber.Mul(B, B, C); BigNumber.Round(C, B, dplaces); if (--ii == 0) { break; } } BigNumber.IntPow(dplaces, BigNumber.Two, nn, A); BigNumber.Mul(A, B, C); BigNumber.Round(C, dst, places); }