4545int
4646bc_raisemod (bc_num base , bc_num expo , bc_num mod , bc_num * result , int scale )
4747{
48- bc_num power , exponent , parity , temp ;
48+ bc_num power , exponent , modulus , parity , temp ;
4949 int rscale ;
5050
5151 /* Check for correct numbers. */
@@ -55,12 +55,16 @@ bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale)
5555 /* Set initial values. */
5656 power = bc_copy_num (base );
5757 exponent = bc_copy_num (expo );
58+ modulus = bc_copy_num (mod );
5859 temp = bc_copy_num (BCG (_one_ ));
5960 bc_init_num (& parity );
6061
6162 /* Check the base for scale digits. */
62- if (base -> n_scale != 0 )
63+ if (power -> n_scale != 0 )
64+ {
6365 bc_rt_warn ("non-zero scale in base" );
66+ bc_divide (power , BCG (_one_ ), & power , 0 ); /*truncate */
67+ }
6468
6569 /* Check the exponent for scale digits. */
6670 if (exponent -> n_scale != 0 )
@@ -70,12 +74,15 @@ bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale)
7074 }
7175
7276 /* Check the modulus for scale digits. */
73- if (mod -> n_scale != 0 )
77+ if (modulus -> n_scale != 0 )
78+ {
7479 bc_rt_warn ("non-zero scale in modulus" );
80+ bc_divide (modulus , BCG (_one_ ), & modulus , 0 ); /*truncate */
81+ }
7582
7683 /* Do the calculation. */
77- rscale = MAX (scale , base -> n_scale );
78- if ( !bc_compare (mod , BCG (_one_ )) )
84+ rscale = MAX (scale , power -> n_scale );
85+ if ( !bc_compare (modulus , BCG (_one_ )) )
7986 {
8087 temp = bc_new_num (1 , scale );
8188 }
@@ -87,17 +94,18 @@ bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale)
8794 if ( !bc_is_zero (parity ) )
8895 {
8996 bc_multiply (temp , power , & temp , rscale );
90- (void ) bc_modulo (temp , mod , & temp , scale );
97+ (void ) bc_modulo (temp , modulus , & temp , scale );
9198 }
9299
93100 bc_multiply (power , power , & power , rscale );
94- (void ) bc_modulo (power , mod , & power , scale );
101+ (void ) bc_modulo (power , modulus , & power , scale );
95102 }
96103 }
97104
98105 /* Assign the value. */
99106 bc_free_num (& power );
100107 bc_free_num (& exponent );
108+ bc_free_num (& modulus );
101109 bc_free_num (result );
102110 bc_free_num (& parity );
103111 * result = temp ;
0 commit comments