import "bignum"

任意精度演算のパッケージです。以下の数値型を実装しています。

- Natural	符号無し整数
- Integer	符号付き整数
- Rational	有理数

このパッケージは使いやすいように設計されていますが、提供している関数はかなり実行速度が遅いため、使用を推奨されなくなる可できればbigパッケージを利用してください。

パッケージファイル

arith.go bignum.go integer.go rational.go

Div128関数

func Div128(x1, x0, y uint64) (q, r uint64)

q = (x1<<64 + x0)/y + r

Iadd関数

func Iadd(z, x, y *Integer)

Iaddはzへx + yの合計をセットします。xまたはyがzと同値でも処理可能です。

Iscale関数

func Iscale(z *Integer, d int64)

Nscaleは*zへ(*z) * dした値をセットします。

Isub関数

func Isub(z, x, y *Integer)

Mul128関数

func Mul128(x, y uint64) (z1, z0 uint64)

z1<<64 + z0 = x*y

MulAdd128関数

func MulAdd128(x, y, c uint64) (z1, z0 uint64)

z1<<64 + z0 = x*y + c

Nadd関数

func Nadd(zp *Natural, x, y Natural)

Naddは*zpへx + yの合計をセットします。xまたはyが*zpと同値でも処理可能です。

Nscale関数

func Nscale(z *Natural, d uint64)

Nscaleは*zへ(*z) * dした値をセットします。

Nsub関数

func Nsub(zp *Natural, x, y Natural)

Nsubはx >= yの場合、*zpへx – yの差をセットします。x < yの場合はアンダーフローランタイムエラーが発生します。Cmp関数を使用し、x >= yであることを前もって確認してください。xまたはyが*zpと同値でも処理可能です。

Integer型

Integerは任意精度の符号付き整数値を表します。

type Integer struct {
    // contains unexported fields
}

Int関数

func Int(x int64) *Integer

Intは値xからIntegerを作成します。

IntFromString関数

func IntFromString(s string, base uint) (*Integer, uint, int)

IntFromStringは次の3つの値を返します。ひとつ目はsで与えられた整数に可能な限り一致しているInteger、2番目は実際に使用された基数、3番目はプレフィックス長です。整数の構文はGo言語の符号付き整数リテラルの構文に従います。

baseパラメータが0の場合、文字列のプレフィックスから変換に使用する基数を決定します。プレフィックスが”0x”または”0X”の場合は16進数、”0″の場合は8進数、それ以外の場合は10進数とみなします。

MakeInt関数

func MakeInt(sign bool, mant Natural) *Integer

MakeIntは符号(sign)と仮数(mant)から整数を作成します。
mantパラメータの値が、ゼロまたは正の数(>=0)のときはsignにfalseを、負の数のときはtrueをセットしてください。

(*Integer) Abs関数

func (x *Integer) Abs() Natural

Absはxの絶対値を返します。

(*Integer) Add関数

func (x *Integer) Add(y *Integer) *Integer

Addはx + yの合計を返します。

(*Integer) And関数

func (x *Integer) And(y *Integer) *Integer

Andはxとyの2の補数表現を考慮したAND演算 x & yを返します。

(*Integer) AndNot関数

func (x *Integer) AndNot(y *Integer) *Integer

AndNotはxとyの2の補数表現を考慮したビットのクリア( x &^ y)を返します。

(*Integer) Cmp関数

func (x *Integer) Cmp(y *Integer) int

Cmpはxとyを比較し、int値を返します。

<  0 if x <  y
== 0 if x == y
>  0 if x >  y

(*Integer) Div関数

func (x *Integer) Div(y *Integer) *Integer

Divはy != 0の場合、q = x / yの商を返します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

DivとModはユークリッド法を実装しています。

(Raymond T. Boute著 「The Euclidian definition of the functions div and mod」 ACM Transactions on Programming Languages and Systems (TOPLAS) 14(2):127-144 出版:1992/4 ACM New York, NY, USA)

(*Integer) DivMod関数

func (x *Integer) DivMod(y *Integer) (*Integer, *Integer)

DivModは(x.Div(y), x.Mod(y))のペアを返します。

(*Integer) Format関数

func (x *Integer) Format(h fmt.State, c int)

Formatはfmt.Formatterのサポートルーチンです。

(*Integer) IsEven関数

func (x *Integer) IsEven() bool

IsEvenはxが2で割り切れる場合にtrueを返します。

(*Integer) IsNeg関数

func (x *Integer) IsNeg() bool

IsNegはx < 0の場合にtrueを返します。

(*Integer) IsOdd関数

func (x *Integer) IsOdd() bool

IsOddはxが2で割り切れない場合にtrueを返します。

(*Integer) IsPos関数

func (x *Integer) IsPos() bool

IsPosはx >= 0の場合にtrueを返します。

(*Integer) IsZero関数

func (x *Integer) IsZero() bool

IsZeroはx == 0の場合にtrueを返します。

(*Integer) Mod関数

func (x *Integer) Mod(y *Integer) *Integer

Modはy != 0の場合、除算x / yの係数r(r = x – y*x.Div(y))を返します。rは常に正です。y == 0の場合はゼロ除算ランタイムエラーが発生します。

(*Integer) Mul関数

func (x *Integer) Mul(y *Integer) *Integer

Mulはx * yの積を返します。

(*Integer) Mul1関数

func (x *Integer) Mul1(d int64) *Integer

Mul1はx * dの積を返します。

(*Integer) MulNat関数

func (x *Integer) MulNat(y Natural) *Integer

MulNatはx * yの積を返します。yは符号無しの自然数です。

(*Integer) Neg関数

func (x *Integer) Neg() *Integer

Negはxの否定値を返します。

(*Integer) Not関数

func (x *Integer) Not() *Integer

Notはxの2の補数表現を考慮したNOT演算 ^xを返します。

(*Integer) Or関数

func (x *Integer) Or(y *Integer) *Integer

Orはxとyの2の補数表現を考慮したOR演算 x | yを返します。

(*Integer) Quo関数

func (x *Integer) Quo(y *Integer) *Integer

Quoはy != 0の場合、q = x / yの商を返します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

QuoとRemはC99に似たT-division and modulusを実装しています。

q = x.Quo(y) = trunc(x/y)  (0方向に切り捨て)
r = x.Rem(y) = x - y*q

(Daan Leijen著 「Division and Modulus for Computer Scientists」)

(*Integer) QuoRem関数

func (x *Integer) QuoRem(y *Integer) (*Integer, *Integer)

QuoRemはy != 0の場合、(x.Quo(y), x.Rem(y))のペアを返します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

(*Integer) Rem関数

func (x *Integer) Rem(y *Integer) *Integer

Remはy != 0の場合、除算x / yの余りr(r = x – y*x.Quo(y))を返します。rがゼロでない場合はxの符号と一致します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

(*Integer) Shl関数

func (x *Integer) Shl(s uint) *Integer

Shlは左シフトx << sを実装しており、x * 2^sを返します。

(*Integer) Shr関数

func (x *Integer) Shr(s uint) *Integer

Shrは右シフトx >> sを実装しており、x / 2^sを返します。

(*Integer) String関数

func (x *Integer) String() string

Stringはxを10進数の文字列表現に変換します。

(*Integer) Sub関数

func (x *Integer) Sub(y *Integer) *Integer

Subはx – yの差を返します。

(*Integer) ToString関数

func (x *Integer) ToString(base uint) string

ToStringはxを特定の基数(2 <= 基数 <= 16)文字列に変換します。

(*Integer) Value関数

func (x *Integer) Value() int64

Valueはxがint64に収まる場合、xの値を返します。それ以外の場合は未定義です。

(*Integer) Xor関数

func (x *Integer) Xor(y *Integer) *Integer

Xorはxとyの2の補数表現を考慮したXOR演算 x | yを返します。

Natural型

Naturalは任意精度の符号無し整数値を表します。

type Natural []digit

Binomial関数

func Binomial(n, k uint) Natural

Binomialは(n, k)の二項係数を計算します。

Fact関数

func Fact(n uint) Natural

Factはn (Fact(n) == MulRange(2, n))の階乗を計算します。

MulRange関数

func MulRange(a, b uint) Natural

MulRangeは[a, b]の範囲内の全ての符号無し整数値の積を計算します。

Nat関数

func Nat(x uint64) Natural

Natは値xで自然数を作成します。

NatFromString関数

func NatFromString(s string, base uint) (Natural, uint, int)

NatFromStringは次の3つの値を返します。ひとつ目はsで与えられた自然数に可能な限り一致しているNatural、2番目は実際に使用された基数、3番目はプレフィックス長です。自然数の構文はGo言語の符号なし整数リテラルの構文に従います。

base引数が0の場合、文字列プレフィックスから実際の変換基数を決定します。プレフィックスが”0x”または”0X”の場合は16進数、”0″の場合は8進数、それ以外の場合は10進数とみなします。

(Natural) Add関数

func (x Natural) Add(y Natural) Natural

Addはx + yの合計を返します。

(Natural) And関数

func (x Natural) And(y Natural) Natural

Andはxとyの2の補数表現を考慮したAND演算 x & yを返します。

(Natural) AndNot関数

func (x Natural) AndNot(y Natural) Natural

AndNotはxとyの2の補数表現を考慮したビットのクリア( x &^ y)を返します。

(Natural) Cmp関数

func (x Natural) Cmp(y Natural) int

Cmpはxとyを比較し、int値を返します。

<  0 if x <  y
== 0 if x == y
>  0 if x >  y

(Natural) Div関数

func (x Natural) Div(y Natural) Natural

Divはy != 0の場合、q = x / yの商を返します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

(Natural) DivMod関数

func (x Natural) DivMod(y Natural) (Natural, Natural)

DivModはy > 0の場合、(x.Div(y), x.Mod(y))のペアを返します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

(Natural) Format関数

func (x Natural) Format(h fmt.State, c int)

Formatはfmt.Formatterのサポートルーチンです。フォーマットは’b'(2進)、’o'(8進)、’x'(16進)を受け入れます。

(Natural) Gcd関数

func (x Natural) Gcd(y Natural) Natural

Gcdはxとyの最大公約数を計算します。

(Natural) IsEven関数

func (x Natural) IsEven() bool

IsEvenはxが2で割り切れる場合にtrueを返します。

(Natural) IsOdd関数

func (x Natural) IsOdd() bool

IsOddはxが2で割り切れない場合にtrueを返します。

(Natural) IsZero関数

func (x Natural) IsZero() bool

IsZeroはx == 0の場合にtrueを返します。

(Natural) Log2関数

func (x Natural) Log2() uint

Log2はx > 0の場合、xの2進対数を計算します。結果は2^n <= x < 2^(n+1)の整数nとなります。x == 0の場合はランタイムエラーが発生します。

(Natural) Mod関数

func (x Natural) Mod(y Natural) Natural

Modはy != 0の場合、除算x / yの係数r(x = y*q + r 且つ0 <= r < y)を返します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

(Natural) Mul関数

func (x Natural) Mul(y Natural) Natural

Mulはx * yの積を返します。

(Natural) Mul1関数

func (x Natural) Mul1(d uint64) Natural

Mul1はx * dの積を返します。

(Natural) Or関数

func (x Natural) Or(y Natural) Natural

Orはxとyの2の補数表現を考慮したOR演算 x | yを返します。

(Natural) Pop関数

func (x Natural) Pop() uint

Popはxの”population count”(1になっているビット数)を計算します。

(Natural) Pow関数

func (xp Natural) Pow(n uint) Natural

Powはnの累乗xを計算します。

(Natural) Shl関数

func (x Natural) Shl(s uint) Natural

Shlは左シフトx << sを実装しており、x * 2^sを返します。

(Natural) Shr関数

func (x Natural) Shr(s uint) Natural

Shrは右シフトx >> sを実装しており、x / 2^sを返します。

(Natural) String関数

func (x Natural) String() string

Stringはxを10進数の文字列表現に変換します。x.String()はx.ToString(10)と同じです。

(Natural) Sub関数

func (x Natural) Sub(y Natural) Natural

Subはx >= yの場合、x – yの差を返します。x < yの場合はアンダーフローランタイムエラーが発生します。Cmp関数を使用し、x >= yであることを前もって確認してください。

(Natural) ToString関数

func (x Natural) ToString(base uint) string

ToStringはxを特定の基数(2 <= 基数 <= 16)文字列に変換します。

(Natural) Value関数

func (x Natural) Value() uint64

Valueはxの下位64ビットの値を返します。

(Natural) Xor関数

func (x Natural) Xor(y Natural) Natural

Xorはxとyの2の補数表現を考慮したXOR演算x ^ yを返します。

Rational型

Rationalは任意精度のa/bの商を表します。

type Rational struct {
    // contains unexported fields
}

MakeRat関数

func MakeRat(a *Integer, b Natural) *Rational

MakeRatは与えられた分子aと分母bから成る有理数を作成します。

Rat関数

func Rat(a0 int64, b0 int64) *Rational

Ratは値a0/b0での有理数を作成します。

RatFromString関数

func RatFromString(s string, base uint) (*Rational, uint, int)

RatFromStringは特定の変換基数(実際に使われている変換基数)をプレフィックスにて表しているsから可能な限り一致している有理数を返します。有理数の構文は

rational = mantissa [exponent] .
mantissa = integer ('/' natural | '.' natural) .
exponent = ('e'|'E') integer .

base引数が0の場合、文字列プレフィックスから実際の変換基数を決定します。プレフィックスが”0x”または”0X”の場合は16進数、”0″の場合は8進数、それ以外の場合は10進数とみなします。
mantissaが除算により表される(integer/natural形式)場合、分子と分母の基数が一致していなければ分子の基数を使用します。mantissaが小数点を含む(integer.natlral形式)場合は、小数部に基数プレフィックスは記述できないため小数部の基数は整数部の基数と同じになります。
exponentの基数は常に10です。

(*Rational) Add関数

func (x *Rational) Add(y *Rational) *Rational

Addはx + yの合計を返します。

(*Rational) Cmp関数

func (x *Rational) Cmp(y *Rational) int

Cmpはxとyを比較し、int値を返します。

<  0 if x <  y
== 0 if x == y
>  0 if x >  y

(*Rational) Format関数

func (x *Rational) Format(h fmt.State, c int)

Formatはfmt.Formatterのサポートルーチンです。フォーマットは’b'(2進)、’o'(8進)、’x'(16進)を受け入れます。

(*Rational) IsInt関数

func (x *Rational) IsInt() bool

IsIntはxに分母1(x == x’/1)と書き込むことが出来る場合、すなわちxが整数値である場合にtrueを返します。

(*Rational) IsNeg関数

func (x *Rational) IsNeg() bool

IsNegはx < 0の場合にtrueを返します。

(*Rational) IsPos関数

func (x *Rational) IsPos() bool

IsPosはx > 0の場合にtrueを返します。

(*Rational) IsZero関数

func (x *Rational) IsZero() bool

IsZeroはx == 0の場合にtrueを返します。

(*Rational) Mul関数

func (x *Rational) Mul(y *Rational) *Rational

Mulはx * yの積を返します。

(*Rational) Neg関数

func (x *Rational) Neg() *Rational

Negはxの否定値を返します。

(*Rational) Quo関数

func (x *Rational) Quo(y *Rational) *Rational

Quoはy != 0の場合、q = x / yの商を返します。y == 0の場合はゼロ除算ランタイムエラーが発生します。

(*Rational) String関数

func (x *Rational) String() string

Stringはxを10進数の文字列表現に変換します。x.String()とx.ToString(10)は同じです。

(*Rational) Sub関数

func (x *Rational) Sub(y *Rational) *Rational

Subはx – yの差を返します。

(*Rational) ToString関数

func (x *Rational) ToString(base uint) string

ToStringはxを特定の基数(2 <= 基数 <= 16)の文字列に変換します。文字列はxが整数の場合、”n”で表されます。それ以外の場合は”n/d”で表されます。

(*Rational) Value関数

func (x *Rational) Value() (numerator *Integer, denominator Natural)

Valueはxの分子と分母を返します。