hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - 巨大な数を扱う

math/bigライブラリを使用することで巨大な整数や有理数を扱うことができます。

フィボナッチ数列を表示するプログラム。

package main
import (
	"fmt"
)

func main() {

	var f0 uint64 = 1
	var f1 uint64 = 1

	for i := 1; i < 100; i++ {
		fmt.Println(i,f0)
		f0, f1 = f1, f0+f1
		if f1 < f0 {
			fmt.Println("Out of Range")
			break
		}
	}
}

結果

uint64型でも93項目でオーバーフローを起こします。

1 1
2 1
3 2
4 3
5 5


91 4660046610375530309
92 7540113804746346429
Out of Range

math/bigを使用したフィボナッチ数列プログラム

package main
import (
	"fmt"
	"math/big"
)

func main() {

	f0 := big.NewInt(1)
	f1 := big.NewInt(1)
	tmp := big.NewInt(0)

	for i := 1; i < 1001; i++ {
		fmt.Println(i,f0.String())
		tmp.Add(f0, f1)
		f0, f1 = f1, tmp
		if f1.Cmp(f0) == -1 {
			fmt.Println("Out of Range")
			break
		}
	}
}

結果

どこまででも?計算できる。
とりあえず1000項まで。

999 2009078638474251226778296966987503394802634021947875513957031978194408220859
25522967474696027942973398924001172041215029722589741067308883174710829525598277
57377314577795433097664514884491945891021164091536962140594216139876372689173435
39489889449296482099339566226656436330593434867072531976062763008
1000 401815727694850245355659393397500678960526804389575102791406395638881644171
85104593494939205588594679784800234408243005944517948213461776634942165905119655
51475462915559086619532902976898389178204232818307392428118843227975274537834687
078979778898592964198679132453312872661186869734145063952125526016