Patch 20110424bcpowmod_okano for BC math related Bug #54598
Patch version 2011-04-24 14:18 UTC
Return to Bug #54598 |
Download this patch
Patch Revisions:
Developer: okano1220@gmail.com
Index: raisemod.c
===================================================================
--- raisemod.c (revision 1)
+++ raisemod.c (working copy)
@@ -74,20 +74,23 @@
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);
- }
+ if (!bc_compare(mod, BCG(_one_))) {
+ temp = bc_copy_num (BCG(_zero_));
+ } else {
+ 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);
- }
-
+ 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);
|