@@ -13,6 +13,17 @@ fn shrink_tail_zeros(mut a []u32) {
1313 }
1414}
1515
16+ @[direct_array_access; inline]
17+ fn (i &Integer) shrink_tail_zeros () {
18+ mut alen := i.digits.len
19+ for alen > 0 && i.digits[alen - 1 ] == 0 {
20+ alen--
21+ }
22+ unsafe {
23+ i.digits.len = alen
24+ }
25+ }
26+
1627// suppose operand_a bigger than operand_b and both not null.
1728// Both quotient and remaider are already allocated but of length 0
1829// TODO: the manualfree tag here is a workaround for compilation with -autofree. Remove it, when the -autofree bug is fixed.
@@ -108,8 +119,8 @@ fn karatsuba_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage
108119
109120 // thanks to the base cases we can pass zero-length arrays to the mult func
110121 half := imax (operand_a.len, operand_b.len) / 2
111- a_l := unsafe { operand_a[0 ..half] }
112- a_h := unsafe { operand_a[half..] }
122+ mut a_l := unsafe { operand_a[0 ..half] }
123+ mut a_h := unsafe { operand_a[half..] }
113124 mut b_l := []u32 {}
114125 mut b_h := []u32 {}
115126 if half < = operand_b.len {
@@ -119,6 +130,10 @@ fn karatsuba_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage
119130 b_l = unsafe { operand_b }
120131 // b_h = []u32{}
121132 }
133+ shrink_tail_zeros (mut a_l)
134+ shrink_tail_zeros (mut a_h)
135+ shrink_tail_zeros (mut b_l)
136+ shrink_tail_zeros (mut b_h)
122137
123138 // use storage for p_1 to avoid allocation and copy later
124139 multiply_digit_array (a_h, b_h, mut storage)
@@ -171,6 +186,7 @@ fn toom3_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage []u3
171186 1
172187 }
173188 }
189+ a0 .shrink_tail_zeros ()
174190 a1 := Integer{
175191 digits: unsafe { operand_a[k..k2 ] }
176192 signum: if operand_a[k..k2 ].all (it == 0 ) {
@@ -179,6 +195,7 @@ fn toom3_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage []u3
179195 1
180196 }
181197 }
198+ a1 .shrink_tail_zeros ()
182199 a2 := Integer{
183200 digits: unsafe { operand_a[k2 ..] }
184201 signum: 1
@@ -201,6 +218,7 @@ fn toom3_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage []u3
201218 signum: 1
202219 }
203220 }
221+ b0 .shrink_tail_zeros ()
204222 b1 = Integer{
205223 digits: operand_b[k..]
206224 signum: 1
@@ -212,12 +230,14 @@ fn toom3_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage []u3
212230 signum: 1
213231 }
214232 }
233+ b0 .shrink_tail_zeros ()
215234 if ! operand_b[k..k2 ].all (it == 0 ) {
216235 b1 = Integer{
217236 digits: operand_b[k..k2 ]
218237 signum: 1
219238 }
220239 }
240+ b1 .shrink_tail_zeros ()
221241 b2 = Integer{
222242 digits: operand_b[k2 ..]
223243 signum: 1
0 commit comments