mirror of
https://github.com/vlang/v.git
synced 2025-09-15 07:22:27 +03:00
math.big: fix toom-cook 3-way multiplication (#24888)
This commit is contained in:
parent
54fec7b772
commit
f06def7d6d
3 changed files with 34 additions and 14 deletions
|
@ -164,12 +164,20 @@ fn toom3_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage []u3
|
|||
|
||||
// Slices of a and b
|
||||
a0 := Integer{
|
||||
digits: unsafe { operand_a[0..k] }
|
||||
signum: 1
|
||||
digits: unsafe { operand_a[..k] }
|
||||
signum: if operand_a[..k].all(it == 0) {
|
||||
0
|
||||
} else {
|
||||
1
|
||||
}
|
||||
}
|
||||
a1 := Integer{
|
||||
digits: unsafe { operand_a[k..k2] }
|
||||
signum: 1
|
||||
signum: if operand_a[k..k2].all(it == 0) {
|
||||
0
|
||||
} else {
|
||||
1
|
||||
}
|
||||
}
|
||||
a2 := Integer{
|
||||
digits: unsafe { operand_a[k2..] }
|
||||
|
@ -187,22 +195,28 @@ fn toom3_multiply_digit_array(operand_a []u32, operand_b []u32, mut storage []u3
|
|||
signum: 1
|
||||
}
|
||||
} else if operand_b.len < k2 {
|
||||
b0 = Integer{
|
||||
digits: operand_b[0..k]
|
||||
signum: 1
|
||||
if !operand_b[..k].all(it == 0) {
|
||||
b0 = Integer{
|
||||
digits: operand_b[..k]
|
||||
signum: 1
|
||||
}
|
||||
}
|
||||
b1 = Integer{
|
||||
digits: operand_b[k..]
|
||||
signum: 1
|
||||
}
|
||||
} else {
|
||||
b0 = Integer{
|
||||
digits: operand_b[0..k]
|
||||
signum: 1
|
||||
if !operand_b[..k].all(it == 0) {
|
||||
b0 = Integer{
|
||||
digits: operand_b[..k]
|
||||
signum: 1
|
||||
}
|
||||
}
|
||||
b1 = Integer{
|
||||
digits: operand_b[k..k2]
|
||||
signum: 1
|
||||
if !operand_b[k..k2].all(it == 0) {
|
||||
b1 = Integer{
|
||||
digits: operand_b[k..k2]
|
||||
signum: 1
|
||||
}
|
||||
}
|
||||
b2 = Integer{
|
||||
digits: operand_b[k2..]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue