プログラミング
記事内に商品プロモーションを含む場合があります

Go言語で64bitを超えるの多倍長整数を使う方法【big.Int】

tadanori

Go言語で64bitを超える整数値を扱う場合、math/bigパッケージを利用します。少し癖のあるパッケージなので、ここで使い方を解説しておきます。

Go言語のmath/bigパッケージ

Go言語では、整数型では64bitを超える値を扱えることができません(だいたい、10の19乗くらい。具体的な最大値は、math.MaxIntで定義されています。これ以上大きな値を扱う場合には、bigというパッケージを利用することになります。このパッケージを利用することで多倍長整数を扱うことができます。

パッケージを利用する場合には、以下のようにしてパッケージをインポートしておきます。

import "math/big"

big.Intを生成する

多倍長整数を扱う場合は、big.NewIntまたは、new(big.Int)を使って初期化する必要があります。

big.NewIntの場合は、int64の範囲の値で初期化できます。new(big.Int)の場合は0に初期化されます。

a := big.NewInt(100)
b := new(big.Int)

文字列で値を設定

int64を超える値を代入する場合には、Set_stringを利用します。

以下のように、一度、big.Intを生成してから、設定しても良いです。

n := new(big.Int)
n, _ = n.SetString(s, 10)

また、以下のようにして生成することも可能です。

c, _ := (&big.Int{}).SetString("1234567890123456789012345678901234567890", 10)

演算は関数で

big.Intを使う場合は、四則演算を含めて演算は関数を呼び出して行うことになります。

Add

a := big.NewInt(1000)
b := big.NewInt(2000)
c := b.Add(b, a)
fmt.Println(a, b, c)
1000 3000 3000

bも3000になっている点に注意しましょう。

Sub

a := big.NewInt(1000)
b := big.NewInt(2000)
c := b.Sub(b, a)
fmt.Println(a, b, c)

Mul

a := big.NewInt(1000)
b := big.NewInt(2000)
c := b.Mul(b, a)
fmt.Println(a, b, c)

Div

a := big.NewInt(1000)
b := big.NewInt(2000)
c := b.Div(b, a)
fmt.Println(a, b, c)

Mod

a := big.NewInt(1000)
b := big.NewInt(2000)
c := b.Mod(b, a)
fmt.Println(a, b, c)

その他

その他の演算については、こちらのサイトを確認してください。

結果を文字列に変換

結果を文字列に変換したい場合は、String()を呼び出します。

s := c.String()

注意点(利用時にハマる点)

定数も含めbig.Intに変換しておく

多くの関数がbig.Intしか入力できないので、計算を行う場合は、定数を含めてbig.Intに変換しておく必要があります(一部、例外あり)。

これが結構面倒です。特に、桁数が非常に大きな値を何度も参照する場合は、変換処理を何度も行わないようにコーディングしましょう。

演算を行うと値が上書きされる

Addの部分に書きましたが、演算はc = b.Add(x, y)の記載することができます。この時、bの値はx+yに上書きされてしまうことに注意します。

このあたり、慣れないとバグの原因になります。

オブジェクトの再利用を考えるのであれば、演算用のbig.Intの変数を用意するのも良いかもしれません。

たとえば、calcのような計算専用の変数を用意しておくなどです

calc = new(big.Int)
c = calc.Add(a, b)

自分だけかもしれませんが、big.Intを使う場合に毎回ミスする部分です。a.Add(a, b)だと、明示的にaに計算結果が代入されるイメージはないですよね

まとめ

Go言語で多倍長整数を扱う方法について説明しました。そんなに使うことはないですが、とりあえず覚えておくと良いかもしれません。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました