golang 的 math/big 進行


進行高進度運算的時候unint64已經無法滿足需求,這個時候大家可以采用math.big庫來進行高進度計算,下面以計算第10000位的菲波納切數來展示big的用法,代碼如下:

package main

import (
        "fmt"
        "math/big"
        "time"
)

const LIM = 10000 //求第10000位的費布拉切數

var fibs [LIM]*big.Int //使用數組保存計算出來的費布拉切數的指針

func main() {
        result := big.NewInt(0)
        start := time.Now()
        for i := 0; i < LIM; i++ {
                result = fibonacci(i)
                if i == LIM-1 {
                        fmt.Printf("fibonacci(%d) is: %d\n", i, result)
                }
        }

        fmt.Println(result)
        fmt.Printf("%T\n", result)
        end := time.Now()
        delta := end.Sub(start)
        fmt.Printf("longCalculation took this amount of time: %s\n", delta)
}

func fibonacci(n int) (res *big.Int) {
        if n <= 1 {
                res = big.NewInt(1)
        } else {
                temp := new(big.Int)
                res = temp.Add(fibs[n-1], fibs[n-2])
        }
        fibs[n] = res
        return
}

計算結果正確,但是使用這個方法計算費布拉切不僅耗時而且占用太多的內存,可以定義兩個變量去保存最近的前兩個結果,這個就不用占用太多的內存,這樣的話求第10000的費布拉切數的耗時可以降很多,如果還想將耗時降低的話,可以使用矩陣和快遞冪運算,這樣就可以將耗時降到us級別!

 

Go語言的big包實現大整數運算
    // bigint project main.go  
    package main  
      
    import (  
        "fmt"  
        "math"  
        "math/big"  
    )  
      
    func main() {  
        // Here are some calculations with bigInts:  
        im := big.NewInt(math.MaxInt64)  
        in := im  
        io := big.NewInt(1956)  
        ip := big.NewInt(1)  
        ip.Mul(im, in).Add(ip, im).Div(ip, io)  
        fmt.Printf("Big Int: %v\n", ip)  
        iq := big.NewInt(10000)  
        ip.Mod(ip, iq)  
        fmt.Printf("Big Int: %v\n", ip)  
    }  

程序說明:

1.math包中包含有各種功能函數,包括最大的整數math.MaxInt64

2.math/big包可以用於大整數計算

3.大整數可以使用"%v"格式輸出

 

另外,顯式初始化一個大數只能到上限math.MaxInt64,如果想設置比這還大的數,則只能使用如下方法,即從byte到big int:

Convert byte array to big.Int

import "math/big"

z := new(big.Int)
z.SetBytes(byteSliceHere)

or:

func Base64ToInt(s string) (*big.Int, error) {
    data, err := base64.StdEncoding.DecodeString(s)
    if err != nil {
        return nil, err
    }
    i := new(big.Int)
    i.SetBytes(data)
    return i, nil
}

 

Convert String to big.Int

使用 math/big 的內置函數:

func (z *Int) SetString(s string, base int) (*Int, bool)

示例:

package main

import (
    "fmt"
    "math/big"
)

func main() {
    n := new(big.Int)
    n, ok := n.SetString("314159265358979323846264338327950288419716939937510582097494459", 10)
    if !ok {
        fmt.Println("SetString: error")
        return
    }
    fmt.Println(n)
}

Convert a bigint to a string in Go :

bigint := big.NewInt(123)
bigstr := bigint.String()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM