読者です 読者をやめる 読者になる 読者になる

Golangのmath/bigでIntを直接入力したい

背景

Golangの基本型であるint64では 64 \times log_{10} 2 \approx 64 \times 0.3 = 19.2のため20桁程度(※)でoverflowを起こします。そのため、math/bigパッケージのNewIntを使おうとするとoverflowのコンパイルエラーになります。

※正確には、符号付き64bit整数の最大値9223372036854775807(ギリギリ19桁)を超えるとoverflowします。

例えば、20桁の数16329805957987392833で試してみると、以下のようにconstant 16329805957987392833 overflows int64コンパイルエラーとなります。

package main

import (
    "fmt"
    "math/big"
)

func main()  {
    n := big.NewInt(16329805957987392833) // constant 16329805957987392833 overflows int64
    fmt.Println(n)
}

int64の最大値を超えるような大きな数をbig.Int型として扱いたいときは以下のようにすれば直接入力可能です。

package main

import (
    "fmt"
    "math/big"
)

const (
    DECIMAL int = 10
)

func main()  {
    
    n, _ := new(big.Int).SetString("16329805957987392833", DECIMAL)
    fmt.Println(n)
    
}

使った素数について

素数生成機をお借りして10桁の素数を2つ(7508269669,2174909357)生成し、積を計算したのが16329805957987392833です。

Reference