[ruby/prism] Fix recursive multiply when values are switched in karatsuba_multiply

https://github.com/ruby/prism/commit/4dc6ea960d
This commit is contained in:
Kevin Newton 2024-04-23 14:05:04 -04:00 committed by git
parent 4f57262338
commit 0defbc11a5

View File

@ -135,12 +135,19 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
}
if (left_length * 2 <= right_length) {
uint32_t *values = (uint32_t*) xcalloc(left_length + right_length, sizeof(uint32_t));
uint32_t *values = (uint32_t *) xcalloc(left_length + right_length, sizeof(uint32_t));
for (size_t start_offset = 0; start_offset < right_length; start_offset += left_length) {
size_t end_offset = start_offset + left_length;
if (end_offset > right_length) end_offset = right_length;
pm_integer_t sliced_left = {
.value = 0,
.length = left_length,
.values = left_values,
.negative = false
};
pm_integer_t sliced_right = {
.value = 0,
.length = end_offset - start_offset,
@ -149,7 +156,7 @@ karatsuba_multiply(pm_integer_t *destination, pm_integer_t *left, pm_integer_t *
};
pm_integer_t product;
karatsuba_multiply(&product, left, &sliced_right, base);
karatsuba_multiply(&product, &sliced_left, &sliced_right, base);
uint32_t carry = 0;
for (size_t index = 0; index < product.length; index++) {