golang - 使用数学大包的模数

时间:2014-06-07 15:53:05

标签: go

阅读文档 - http://golang.org/pkg/math/big/

Mod将z设置为y!= 0的模数x%y并返回z。如果y == 0,则发生逐个零的运行时恐慌。 Mod实现欧氏模数(与Go不同);有关详细信息,请参阅DivMod。

10%4 = 2但我得到8(使用数学/大包来做同样的事情) - http://play.golang.org/p/_86etDvLYq

package main

import "fmt"
import "math/big"
import "strconv"

func main() {
    ten := new(big.Int)
    ten.SetBytes([]byte(strconv.Itoa(10)))

    four := new(big.Int)
    four.SetBytes([]byte(strconv.Itoa(4)))

    tenmodfour := new(big.Int)
    tenmodfour = tenmodfour.Mod(ten, four)

    fmt.Println("mod", tenmodfour)

}

我很可能出了点问题。错误在哪里?

2 个答案:

答案 0 :(得分:4)

这是因为SetBytes没有按照你的想法行事!请改用SetInt64

ten := new(big.Int)
ten.SetBytes([]byte(strconv.Itoa(10)))

four := new(big.Int)
four.SetBytes([]byte(strconv.Itoa(4)))

fmt.Println(ten, four)

结果:

12592 52

确实,12592%52 == 8

如果您想使用大于int64允许操作的数字,您还可以使用SetString函数:

n := new(big.Int)
n.SetString("456135478645413786350", 10)

答案 1 :(得分:2)

只需添加julienc的答案,如果您使用SetBytes,则必须将数字转换为this之类的字节:

func int2bytes(num int) (b []byte) {
    b = make([]byte, 4)
    binary.BigEndian.PutUint32(b, uint32(num))
    return
}
func main() {
    ten := new(big.Int)
    ten.SetBytes(int2bytes(10))

    four := new(big.Int)
    four.SetBytes(int2bytes(4))

    fmt.Println(ten, four)

    tenmodfour := new(big.Int)
    tenmodfour = tenmodfour.Mod(ten, four)

    fmt.Println("mod", tenmodfour)
}