@@ -62,7 +62,7 @@ _bc_truncate (bc_num *num)
62
62
int
63
63
bc_raisemod (bc_num base , bc_num expo , bc_num mod , bc_num * result , int scale )
64
64
{
65
- bc_num parity , temp ;
65
+ bc_num power , exponent , modulus , parity , temp ;
66
66
int rscale ;
67
67
68
68
/* Check for correct numbers. */
@@ -88,33 +88,39 @@ bc_raisemod (bc_num base, bc_num expo, bc_num mod, bc_num *result, int scale)
88
88
}
89
89
90
90
/* Set initial values. */
91
+ power = bc_copy_num (base );
92
+ exponent = bc_copy_num (expo );
93
+ modulus = bc_copy_num (mod );
91
94
temp = bc_copy_num (BCG (_one_ ));
92
95
bc_init_num (& parity );
93
96
94
97
/* Do the calculation. */
95
- rscale = MAX (scale , base -> n_scale );
96
- if ( !bc_compare (mod , BCG (_one_ )) )
98
+ rscale = MAX (scale , power -> n_scale );
99
+ if ( !bc_compare (modulus , BCG (_one_ )) )
97
100
{
98
101
bc_free_num (& temp );
99
102
temp = bc_new_num (1 , scale );
100
103
}
101
104
else
102
105
{
103
- while ( !bc_is_zero (expo ) )
106
+ while ( !bc_is_zero (exponent ) )
104
107
{
105
- (void ) bc_divmod (expo , BCG (_two_ ), & expo , & parity , 0 );
108
+ (void ) bc_divmod (exponent , BCG (_two_ ), & exponent , & parity , 0 );
106
109
if ( !bc_is_zero (parity ) )
107
110
{
108
- bc_multiply (temp , base , & temp , rscale );
109
- (void ) bc_modulo (temp , mod , & temp , scale );
111
+ bc_multiply (temp , power , & temp , rscale );
112
+ (void ) bc_modulo (temp , modulus , & temp , scale );
110
113
}
111
114
112
- bc_multiply (base , base , & base , rscale );
113
- (void ) bc_modulo (base , mod , & base , scale );
115
+ bc_multiply (power , power , & power , rscale );
116
+ (void ) bc_modulo (power , modulus , & power , scale );
114
117
}
115
118
}
116
119
117
120
/* Assign the value. */
121
+ bc_free_num (& power );
122
+ bc_free_num (& exponent );
123
+ bc_free_num (& modulus );
118
124
bc_free_num (result );
119
125
bc_free_num (& parity );
120
126
* result = temp ;
0 commit comments