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の分子と分母を返します。
Trackback URL
Leave a comment
Comments