Answers
在PHP中有这方面的函数bcpowmod,可以把PHP的source code下载下来,摘出这部分代码。下面是部分代码:
/* Raise BASE to the EXPO power, reduced modulo MOD. The result is
placed in RESULT. If a EXPO is not an integer,
only the integer part is used. */
int
bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale TSRMLS_DC)
{
bc_num power, exponent, parity, temp;
int rscale;
/* Check for correct numbers. */
if (bc_is_zero(mod TSRMLS_CC)) return -1;
if (bc_is_neg(expo)) return -1;
/* Set initial values. */
power = bc_copy_num (base);
exponent = bc_copy_num (expo);
temp = bc_copy_num (BCG(_one_));
bc_init_num(&parity TSRMLS_CC);
/* Check the base for scale digits. */
if (base->n_scale != 0)
<coding-2 lang="other">
bc_rt_warn ("non-zero scale in base");
/* Check the exponent for scale digits. */
if (exponent->n_scale != 0)
{
bc_rt_warn ("non-zero scale in exponent");
bc_divide (exponent, BCG(_one_), &exponent, 0 TSRMLS_CC); /*truncate */
}
/* Check the modulus for scale digits. */
if (mod->n_scale != 0)
bc_rt_warn ("non-zero scale in modulus");
/* Do the calculation. */
rscale = MAX(scale, base->n_scale);
while ( !bc_is_zero(exponent TSRMLS_CC) )
{
(void) bc_divmod (exponent, BCG(_two_), &exponent, &parity, 0 TSRMLS_CC);
if ( !bc_is_zero(parity TSRMLS_CC) )
{
bc_multiply (temp, power, &temp, rscale TSRMLS_CC);
(void) bc_modulo (temp, mod, &temp, scale TSRMLS_CC);
}
bc_multiply (power, power, &power, rscale TSRMLS_CC);
(void) bc_modulo (power, mod, &power, scale TSRMLS_CC);
}
/* Assign the value */
bc_free_num (&power);
bc_free_num (&exponent);
bc_free_num (result);
bc_free_num (&parity);
*result = temp;
return 0; /* Everything is OK. */
}
寂寞笑处男
answered 12 years, 4 months ago