Я разработал пакет Golang BESON для выполнения операций с большим числом.
Код операции Умножение :
func Multiply(a []byte, b []byte) {
ans := make([]byte, len(a) + len(b))
bits := nbits(b)
var i uint
for i = bits - 1; int(i) >= 0; i-- {
byteNum := i >> 3
bitNum := i & 7
LeftShift(ans, 1, 0)
if (b[byteNum] & (1 << bitNum)) > 0 {
Add(ans, a)
}
}
copy(a, ans)
}
Мой способ - добавить каждое a
умножение бит из b
.
Есть ли более эффективный способ реализации Multiply
?
Редактировать
Пакет BESON представляет большое число в байтовом массиве. Например, он представляет 128-разрядное беззнаковое целое число в байтовом массиве размером 16. Следовательно, при выполнении двух 128-разрядного умножения беззнакового целого числа оно фактически умножает двухбайтовый массив.
Пример: * * тысяча двадцать-пять
a = []byte{ 204, 19, 46, 255, 0, 0, 0, 0 }
b = []byte{ 117, 10, 68, 47, 0, 0, 0, 0 }
Multiply(a, b)
fmt.Println(a)
- вывод:
a
(результат будет записан обратно в a
)
[60 4 5 35 76 72 29 47]