目录

big

优质
小牛编辑
170浏览
2023-12-01

import "math/big"

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

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

方法一般为如下格式:

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

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


  • Constants
  • type Word
  • type Int
  • type Rat
  • Examples


  • Int.Scan
  • Int.SetString
  • Rat.Scan
  • Rat.SetString
  • 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接口。