19 for (
int i = 1;
i < Z.
len();
i++) Z[
i] = 0;
24 if (num_stack_parts == 1)
return;
25 const std::vector<digit_t>& heap_parts = accumulator->
heap_parts_;
26 int num_heap_parts =
static_cast<int>(heap_parts.size());
30 if (num_heap_parts == 0) {
31 for (
int i = 1;
i < num_stack_parts - 1;
i++) {
41 for (
int i = 1;
i < num_heap_parts - 1;
i++) {
91 int num_parts =
static_cast<int>(accumulator->
heap_parts_.size());
95 Storage multipliers_storage(num_parts);
96 RWDigits multipliers(multipliers_storage.
get(), num_parts);
107 for (;
i + 1 < num_parts;
i += 2) {
111 digit_t m_in2 =
i == num_parts - 2 ? last_multiplier : max_multiplier;
117 new_parts[
i + 1] = p_high + carry;
120 if (
i > 2 && m_in2 != last_multiplier) {
121 new_multipliers[
i] = new_multipliers[
i - 2];
122 new_multipliers[
i + 1] = new_multipliers[
i - 1];
125 new_multipliers[
i] =
digit_mul(m_in, m_in2, &m_high);
126 new_multipliers[
i + 1] = m_high;
132 new_parts[
i] = parts[
i];
133 new_multipliers[
i] = last_multiplier;
139 multipliers = new_multipliers;
146 while (num_parts > 1) {
149 int new_part_len = part_len * 2;
151 for (;
i + 1 < num_parts;
i += 2) {
156 Digits m_in2(multipliers,
start + part_len, part_len);
169 int prev_start = (
i - 2) * part_len;
170 Digits m_in_prev(multipliers, prev_start, part_len);
171 Digits m_in2_prev(multipliers, prev_start + part_len, part_len);
172 if (
Compare(m_in, m_in_prev) == 0 &&
173 Compare(m_in2, m_in2_prev) == 0) {
175 Digits m_out_prev(new_multipliers, prev_start, new_part_len);
176 for (
int k = 0; k < new_part_len; k++) m_out[k] = m_out_prev[k];
187 Digits p_in(parts,
i * part_len, part_len);
188 Digits m_in(multipliers,
i * part_len, part_len);
189 RWDigits p_out(new_parts,
i * part_len, new_part_len);
190 RWDigits m_out(new_multipliers,
i * part_len, new_part_len);
192 for (; k < p_in.
len(); k++) p_out[k] = p_in[k];
193 for (; k < p_out.
len(); k++) p_out[k] = 0;
195 for (; k < m_in.
len(); k++) m_out[k] = m_in[k];
196 for (; k < m_out.
len(); k++) m_out[k] = 0;
200 part_len = new_part_len;
203 multipliers = new_multipliers;
209 for (;
i < parts.
len();
i++) Z[
i] = parts[
i];
211 for (;
i < Z.
len();
i++) Z[
i] = 0;
249 uint8_t radix = accumulator->
radix_;
250 DCHECK(radix == 2 || radix == 4 || radix == 8 || radix == 16 || radix == 32);
251 const int char_bits =
BitLength(radix - 1);
252 const int unused_last_part_bits =
254 const int unused_part_bits =
kDigitBits % char_bits;
255 const int max_part_bits =
kDigitBits - unused_part_bits;
257 int part_index = num_parts - 1;
261 if (unused_last_part_bits == 0) {
263 while (part_index >= 0) {
264 Z[z_index++] = parts[part_index--];
266 for (; z_index < Z.
len(); z_index++) Z[z_index] = 0;
272 digit_t digit = parts[part_index--];
274 int digit_bits =
kDigitBits - unused_last_part_bits;
275 while (part_index >= 0) {
281 part = parts[part_index--];
282 part_bits = max_part_bits;
283 digit |= part << digit_bits;
285 if (part_shift > part_bits) {
286 digit_bits += part_bits;
289 if (part_index < 0)
break;
293 part_bits -= part_shift;
296 Z[z_index++] = digit;
298 digit_bits = part_bits;
300 if (digit_bits > 0) {
301 Z[z_index++] = digit;
303 for (; z_index < Z.
len(); z_index++) Z[z_index] = 0;