gpt4 book ai didi

go - 如何在golang中将int转换为bigint?

转载 作者:IT老高 更新时间:2023-10-28 13:10:53 25 4
gpt4 key购买 nike

我正在尝试按照 here 的描述实现快速双斐波那契算法:

// 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))
}

这适用于小数字;但是,当输入的数字变大时,程序会返回错误的结果。所以我尝试使用 math/big 包中的 bigInt:

// 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

如何缓解这个问题?

最佳答案

使用 big.NewInt() 代替 big.Int()big.Int() 只是类型转换。您需要查看 documentation of big package
您应该主要使用 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 playground 上尝试工作示例

您还可以创建扩展功能,例如:

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)
}

Go playground 上试试

关于go - 如何在golang中将int转换为bigint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33664041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com