加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 19:04:45 所属栏目:大数据 来源:网络整理
导读:我正在尝试实现快速双斐波纳契算法,如 here所述: // Fast doubling Fibonacci algorithmpackage mainimport "fmt"// (Public) Returns F(n).func fibonacci(n int) int { if n 0 { panic("Negative arguments not implemented") } fst,_ := fib(n) return f
我正在尝试实现快速双斐波纳契算法,如 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,F(n+1)).
func fib(n int) (big.Int,big.Int) {
    if n == 0 {
        return big.Int(0),big.Int(1)
    }
    a,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
在调用Mul方法之后,要将2个参数相乘,需要提供结果变量.因此,例如,要获得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,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,Add(c,d)
    }
}

func main() {
    fmt.Println(fibonacci(123))
    fmt.Println(fibonacci(124))
}

func 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读