Как конвертировать int в bigint в golang?
Я пытаюсь реализовать быстрый двойной алгоритм Фибоначчи, как описано здесь:
// Fast doubling Fibonacci algorithm
package main
import "fmt"
// (Public) Returns F(n).
func fibonacci(n int) int {
if n < 0 {
panic("Negative arguments not implemented")
}
fst, _ := fib(n)
return fst
}
// (Private) Returns the tuple (F(n), F(n+1)).
func fib(n int) (int, int) {
if n == 0 {
return 0, 1
}
a, b := fib(n / 2)
c := a * (b*2 - a)
d := a*a + b*b
if n%2 == 0 {
return c, d
} else {
return d, c + d
}
}
func main() {
fmt.Println(fibonacci(13))
fmt.Println(fibonacci(14))
}
это отлично работает для небольших чисел; однако, когда входной номер становится больше, программа возвращает неправильный результат. Поэтому я попытался использовать bigInt
С math/big
пакет:
// Fast doubling Fibonacci algorithm
package main
import (
"fmt"
"math/big"
)
// (Public) Returns F(n).
func fibonacci(n int) big.Int {
if n < 0 {
panic("Negative arguments not implemented")
}
fst, _ := fib(n)
return fst
}
// (Private) Returns the tuple (F(n), F(n+1)).
func fib(n int) (big.Int, big.Int) {
if n == 0 {
return big.Int(0), big.Int(1)
}
a, b := fib(n / 2)
c := a * (b*2 - a)
d := a*a + b*b
if n%2 == 0 {
return c, d
} else {
return d, c + d
}
}
func main() {
fmt.Println(fibonacci(123))
fmt.Println(fibonacci(124))
}
однако, go build жалуется, что
cannot convert 0 (type int) to type big.Int
как смягчить эту проблему?
1 ответов
использовать big.NewInt()
вместо big.Int()
. big.Int()
- это просто тип литья.
Вам нужно проверить документация big
пакета
Вы должны в основном использовать методы с формой func (z *T) Binary(x, y *T) *T // z = x op y
Чтобы умножить 2 аргумента, вам нужно предоставить переменную результата, после ее вызова Mul
метод. Так, например, чтобы получить результат 2*2 вам нужно:big.NewInt(0).Mul(big.NewInt(2), big.NewInt(2))
вы можете попробовать рабочий пример на Go площадка
также вы можете создавать функции расширения, такие как:
func Mul(x, y *big.Int) *big.Int {
return big.NewInt(0).Mul(x, y)
}
чтобы сделать код более читабельным:
// Fast doubling Fibonacci algorithm
package main
import (
"fmt"
"math/big"
)
// (Public) Returns F(n).
func fibonacci(n int) *big.Int {
if n < 0 {
panic("Negative arguments not implemented")
}
fst, _ := fib(n)
return fst
}
// (Private) Returns the tuple (F(n), F(n+1)).
func fib(n int) (*big.Int, *big.Int) {
if n == 0 {
return big.NewInt(0), big.NewInt(1)
}
a, b := fib(n / 2)
c := Mul(a, Sub(Mul(b, big.NewInt(2)), a))
d := Add(Mul(a, a), Mul(b, b))
if n%2 == 0 {
return c, d
} else {
return d, Add(c, d)
}
}
func main() {
fmt.Println(fibonacci(123))
fmt.Println(fibonacci(124))
}
func Mul(x, y *big.Int) *big.Int {
return big.NewInt(0).Mul(x, y)
}
func Sub(x, y *big.Int) *big.Int {
return big.NewInt(0).Sub(x, y)
}
func Add(x, y *big.Int) *big.Int {
return big.NewInt(0).Add(x, y)
}