package big

import "math/big"

big包实现了大数字的多精度计算。 支持如下数字类型:

- Int    有符号整数
- Rat    有理数

方法一般为如下格式:

func (z *Int) Op(x, y *Int) *Int    (similar for *Rat)

该方法实现了操作z = x Op y:计算并将结果写入z。如果结果是操作数之一,可能会重写该参数(重用其内存);为了实现链式的计算,计算结果同时会作为返回值。方法返回一个结果而不是让*Int/*Rat调用方法获取另一个操作数。

Index

Examples

Constants

const MaxBase = 'z' - 'a' + 10 + 1 // = hexValue('z') + 1

MaxBase是字符串转换函数接受的最大进制。

type Word

type Word uintptr

Word代表一个多精度无符号整数的单个数字。

type Int

type Int struct {
    // 内含隐藏或非导出字段
}

Int类型代表多精度的整数,零值代表数字0。

func NewInt

func NewInt(x int64) *Int

创建一个值为x的*Int。

func (*Int) Int64

func (x *Int) Int64() int64

返回x的int64表示,如果不能用int64表示,结果是未定义的。

func (*Int) Uint64

func (x *Int) Uint64() uint64

返回x的uint64表示,如果不能用uint64表示,结果是未定义的。

func (*Int) Bytes

func (x *Int) Bytes() []byte

返回x的绝对值的大端在前的字节切片表示。

func (*Int) String

func (x *Int) String() string

func (*Int) BitLen

func (x *Int) BitLen() int

返回x的绝对值的字位数,0的字位数为0。

func (*Int) Bits

func (x *Int) Bits() []Word

提供了对x的数据不检查而快速的访问,返回构成x的绝对值的小端在前的word切片。该切片与x的底层是同一个数组,本函数用于支持在包外实现缺少的低水平功能,否则不应被使用。

func (*Int) Bit

func (x *Int) Bit(i int) uint

返回第i个字位的值,即返回(x>>i)&1。i必须不小于0。

func (*Int) SetInt64

func (z *Int) SetInt64(x int64) *Int

将z设为x并返回z。

func (*Int) SetUint64

func (z *Int) SetUint64(x uint64) *Int

将z设为x并返回z。

func (*Int) SetBytes

func (z *Int) SetBytes(buf []byte) *Int

将buf视为一个大端在前的无符号整数,将z设为该值,并返回z。

func (*Int) SetString

func (z *Int) SetString(s string, base int) (*Int, bool)

将z设为s代表的值(base为基数)。返回z并用一个bool来表明成功与否。如果失败,z的值是不确定的,但返回值为nil。基数必须是0或者2到MaxBase之间的整数。如果基数为0,字符串的前缀决定实际的转换基数:"0x"、"0X"表示十六进制;"0b"、"0B"表示二进制;"0"表示八进制;否则为十进制。

Example

i := new(big.Int)
i.SetString("644", 8) // octal
fmt.Println(i)

Output:

420

func (*Int) SetBits

func (z *Int) SetBits(abs []Word) *Int

提供了对z的数据不检查而快速的操作,将abs视为小端在前的word切片并直接赋给z,返回z。会将z的底层设置为abs的同一底层数组,本函数用于支持在包外实现缺少的低水平功能,否则不应被使用。

func (*Int) SetBit

func (z *Int) SetBit(x *Int, i int, b uint) *Int

将z设为x并设置z的第i位为b,返回z。如b为1,z = x | (1 << i);如b为0,z = x & ^(1 << i);否则会panic。

func (*Int) MulRange

func (z *Int) MulRange(a, b int64) *Int

将z设置为区间[a, b]内所有整数的乘积A(a, b),并返回z。如果a>b会将z设为1并返回。

func (*Int) Binomial

func (z *Int) Binomial(n, k int64) *Int

将z设为k次二项式展开第n项的系数C(n, k),并返回z。

func (*Int) Rand

func (z *Int) Rand(rnd *rand.Rand, n *Int) *Int

将z设为一个范围在[0, n)的伪随机值,并返回z。

func (*Int) ProbablyPrime

func (x *Int) ProbablyPrime(n int) bool

对x进行n次Miller-Rabin质数检测。如果方法返回真则x是质数的几率为1-(1/4)**n;否则x不是质数。

func (*Int) Sign

func (x *Int) Sign() int

返回x的正负号。x<0时返回-1;x>0时返回+1;否则返回0。

func (*Int) Cmp

func (x *Int) Cmp(y *Int) (r int)

比较x和y的大小。x<y时返回-1;x>y时返回+1;否则返回0。

func (*Int) Not

func (z *Int) Not(x *Int) *Int

将z设为^x并返回z(按位取反)。

func (*Int) And

func (z *Int) And(x, y *Int) *Int

将z设为x & y并返回z(按位且)。

func (*Int) Or

func (z *Int) Or(x, y *Int) *Int

将z设为x | y并返回z(按位或)。

func (*Int) Xor

func (z *Int) Xor(x, y *Int) *Int

将z设为x ^ y并返回z(按位异或)。

func (*Int) AndNot

func (z *Int) AndNot(x, y *Int) *Int

将z设为x & (^y)并返回z(按位减)。

func (*Int) Lsh

func (z *Int) Lsh(x *Int, n uint) *Int

将z设为x << n并返回z(左位移运算)。

func (*Int) Rsh

func (z *Int) Rsh(x *Int, n uint) *Int

将z设为x >> n并返回z(右位移运算)。

func (*Int) Abs

func (z *Int) Abs(x *Int) *Int

将z设为|x|并返回z。

func (*Int) Neg

func (z *Int) Neg(x *Int) *Int

将z设为-x并返回z。

func (*Int) Set

func (z *Int) Set(x *Int) *Int

将z设为x(生成一个拷贝)并返回z

func (*Int) Add

func (z *Int) Add(x, y *Int) *Int

将z设为x + y并返回z。

func (*Int) Sub

func (z *Int) Sub(x, y *Int) *Int

将z设为x - y并返回z。

func (*Int) Mul

func (z *Int) Mul(x, y *Int) *Int

将z设为x * y并返回z。

func (*Int) Div

func (z *Int) Div(x, y *Int) *Int

如果y != 0会将z设为x/y并返回z;如果y==0会panic。函数采用欧几里德除法(和Go不同),参见DivMod。

func (*Int) Mod

func (z *Int) Mod(x, y *Int) *Int

如果y != 0会将z设为x%y并返回z;如果y==0会panic。函数采用欧几里德除法(和Go不同),参见DivMod。

func (*Int) DivMod

func (z *Int) DivMod(x, y, m *Int) (*Int, *Int)

如果y != 0将z设为x/y,将m设为x%y并返回(z, m);如果y == 0会panic。采用欧几里德除法(和Go不同)

DivMod方法实现了欧几里德带余除法:

q = x div y  满足
m = x - y*q  且 0 <= m < |q|

func (*Int) Quo

func (z *Int) Quo(x, y *Int) *Int

如果y != 0会将z设为x/y并返回z;如果y==0会panic。函数采用截断除法(和Go相同),参见QuoRem。

func (*Int) Rem

func (z *Int) Rem(x, y *Int) *Int

如果y != 0会将z设为x%y并返回z;如果y==0会panic。函数采用截断除法(和Go相同),参见QuoRem。

func (*Int) QuoRem

func (z *Int) QuoRem(x, y, r *Int) (*Int, *Int)

如果y != 0将z设为x/y,将r设为x%y并返回(z, r);如果y == 0会panic。函数采用截断除法(和Go相同)

QuoRem方法实现了截断带余除法:

q = x/y      返回值向零的方向截断
r = x - y*q

func (*Int) ModInverse

func (z *Int) ModInverse(g, p *Int) *Int

将z设为g相对p的模逆(即z、g满足(z * g) % p == 1)。返回值z大于0小于p。

func (*Int) Exp

func (z *Int) Exp(x, y, m *Int) *Int

将z设为x**y mod |m|并返回z;如果y <= 0,返回1;如果m == nil 或 m == 0,z设为x**y。

func (*Int) GCD

func (z *Int) GCD(x, y, a, b *Int) *Int

将z设为a和b的最大公约数并返回z。a或b为nil时会panic;a和b都>0时设置z为最大公约数;如果任一个<=0方法就会设置z = x = y = 0。如果x和y都不是nil,会将x和y设置为满足a*x + b*y==z。

func (*Int) Format

func (x *Int) Format(s fmt.State, ch rune)

Format方法实现了fmt.Formatter接口。本方法接受格式'b'(二进制)、'o'(八进制)、'd'(十进制)、'x'(小写十六进制)、'X'(大写十六进制)。

方法支持全套fmt包对整数类型的动作:包括用于符号控制的'+'、'-'、' ';用于十六进制和八进制前导0的'#';"%#x"和"%#X"会设置前导的"0x"或"0X";指定最小数字精度;输出字段宽度;空格或'0'的补位;左右对齐。

func (*Int) Scan

func (z *Int) Scan(s fmt.ScanState, ch rune) error

Scan实现了fmt.Scanner接口,将z设为读取的数字。方法可以接受接受格式'b'(二进制)、'o'(八进制)、'd'(十进制)、'x'(小写十六进制)、'X'(大写十六进制)。

Example

// The Scan function is rarely used directly;
// the fmt package recognizes it as an implementation of fmt.Scanner.
i := new(big.Int)
_, err := fmt.Sscan("18446744073709551617", i)
if err != nil {
    log.Println("error scanning value:", err)
} else {
    fmt.Println(i)
}

Output:

18446744073709551617

func (*Int) GobEncode

func (x *Int) GobEncode() ([]byte, error)

本方法实现了gob.GobEncoder接口。

func (*Int) GobDecode

func (z *Int) GobDecode(buf []byte) error

本方法实现了gob.GobDecoder接口。

func (*Int) MarshalJSON

func (z *Int) MarshalJSON() ([]byte, error)

本方法实现了json.Marshaler接口。

func (*Int) UnmarshalJSON

func (z *Int) UnmarshalJSON(text []byte) error

本方法实现了json.Unmarshaler接口。

func (*Int) MarshalText

func (z *Int) MarshalText() (text []byte, err error)

本方法实现了encoding.TextMarshaler接口。

func (*Int) UnmarshalText

func (z *Int) UnmarshalText(text []byte) error

本方法实现了encoding.TextUnmarshaler接口。

type Rat

type Rat struct {
    // 内含隐藏或非导出字段
}

Rat类型代表一个任意精度的有理数(底层采用分数表示),Rat的零值代表数字0。

func NewRat

func NewRat(a, b int64) *Rat

NewRat函数使用分子a和分母b创建一个Rat。

func (*Rat) Num

func (x *Rat) Num() *Int

返回x的分子,分子可能<=0。返回的是x分子的指针,因此对返回值的操作可能改变x,反之亦然。x的符号与分子的符号是绑定的。

func (*Rat) Denom

func (x *Rat) Denom() *Int

返回x的分母,分母总是>0。返回的是x分母的指针,因此对返回值的操作可能改变x,反之亦然。

func (*Rat) Float64

func (x *Rat) Float64() (f float64, exact bool)

返回最接近x的值的float64值,exact用于说明f是否精确的表示了x。 如果x的量级太大或太小不能被float64类型表示,返回无穷和false;f的符号始终与x的符号一致,即使f==0。

func (*Rat) RatString

func (x *Rat) RatString() string

返回z的字符串表示,如果分母不等于1,格式为"a/b";否则格式为"a"。

func (*Rat) FloatString

func (x *Rat) FloatString(prec int) string

返回z的字符串表示为精度为prec的十进制浮点数,最后一位会进行四舍五入。

func (*Rat) String

func (x *Rat) String() string

返回z的字符串表示,格式为"a/b"(即使分母等于1)。

func (*Rat) IsInt

func (x *Rat) IsInt() bool

返回x的分母是否为1(即x为整数)。

func (*Rat) SetInt64

func (z *Rat) SetInt64(x int64) *Rat

将z设为x,并返回z。

func (*Rat) SetFrac64

func (z *Rat) SetFrac64(a, b int64) *Rat

将z设为a/b,并返回z。

func (*Rat) SetFloat64

func (z *Rat) SetFloat64(f float64) *Rat

将z设为f的精确值并返回z。如果f不是有穷数(即f为+Inf、+Inf或NaN)时会返回nil。。

func (*Rat) SetInt

func (z *Rat) SetInt(x *Int) *Rat

将z设为x(生成一个拷贝)并返回z。

func (*Rat) SetFrac

func (z *Rat) SetFrac(a, b *Int) *Rat

将z设为a/b,并返回z。

func (*Rat) SetString

func (z *Rat) SetString(s string) (*Rat, bool)

将z设为字符串代表的值,返回z并用一个bool表明是否成功。字符串s的格式可以是形如"a/b"的分数格式,也可以是浮点数后跟可选的指数的科学计数法格式。如果操作失败,z的值是不确定的,但返回值为nil。

Example

r := new(big.Rat)
r.SetString("355/113")
fmt.Println(r.FloatString(3))

Output:

3.142

func (*Rat) Sign

func (x *Rat) Sign() int

返回x的正负号。如x < 0返回-1;如x > 0返回+1;否则返回0。

func (*Rat) Cmp

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

比较x和y的大小。如x < y返回-1;如x > y返回+1;否则返回0。

func (*Rat) Abs

func (z *Rat) Abs(x *Rat) *Rat

将z设为|x|并返回z。

func (*Rat) Neg

func (z *Rat) Neg(x *Rat) *Rat

将z设为-x并返回z。

func (*Rat) Inv

func (z *Rat) Inv(x *Rat) *Rat

将z设为1/x并返回z。

func (*Rat) Set

func (z *Rat) Set(x *Rat) *Rat

将z设为x(生成一个拷贝)并返回z。

func (*Rat) Add

func (z *Rat) Add(x, y *Rat) *Rat

将z设为x + y并返回z。

func (*Rat) Sub

func (z *Rat) Sub(x, y *Rat) *Rat

将z设为x - y并返回z。

func (*Rat) Mul

func (z *Rat) Mul(x, y *Rat) *Rat

将z设为x * y并返回z。

func (*Rat) Quo

func (z *Rat) Quo(x, y *Rat) *Rat

如果y != 0会将z设为x/y并返回z;如果y==0会panic。

func (*Rat) Scan

func (z *Rat) Scan(s fmt.ScanState, ch rune) error

本方法实现了fmt.Scanner接口,将z设为读取到的数字。接受格式'e'、'E'、'f'、'F'、'g'、'G'、'v';它们都是等价的。

Example

// The Scan function is rarely used directly;
// the fmt package recognizes it as an implementation of fmt.Scanner.
r := new(big.Rat)
_, err := fmt.Sscan("1.5000", r)
if err != nil {
    log.Println("error scanning value:", err)
} else {
    fmt.Println(r)
}

Output:

3/2

func (*Rat) GobEncode

func (x *Rat) GobEncode() ([]byte, error)

本方法实现了gob.GobEncoder接口。

func (*Rat) GobDecode

func (z *Rat) GobDecode(buf []byte) error

本方法实现了gob.GobDecoder接口。

func (*Rat) MarshalText

func (r *Rat) MarshalText() (text []byte, err error)

本方法实现了encoding.TextMarshaler接口。

func (*Rat) UnmarshalText

func (r *Rat) UnmarshalText(text []byte) error

本方法实现了encoding.TextUnmarshaler接口。