目录

结构体

struct BigInt

public struct BigInt <: Comparable<BigInt> & Hashable & ToString

功能:BigInt 定义为任意精度(二进制)的有符号整数。仓颉的 struct BigInt 用于任意精度有符号整数的计算,类型转换等。

[h2]prop bitLen

public prop bitLen: Int64

功能:获取此 BigInt 的最短 bit 长度。如 -3 (101) 返回 3,-1 (11) 返回 2,0 (0) 返回 1。

类型:Int64

[h2]prop sign

public prop sign: Int64

功能:获取此 BigInt 的符号。正数返回 1;0 返回 0;负数返回 -1。

类型:Int64

[h2]init(Array<Byte>)

public init(bytes: Array<Byte>)

功能:通过大端的 Byte 数组以补码形式构建一个 BigInt 结构体。

数据存储方法有以下两种:

参数:

异常:

[h2]init(Bool, Array<Byte>)

public init(sign: Bool, magnitude: Array<Byte>)

功能:通过符号位和真值的绝对值构建一个 BigInt 结构体。视空数组为 0。

参数:

异常:

[h2]init(Bool, Int64, Random)

public init(sign: Bool, bitLen: Int64, rand!: Random = Random())

功能:通过指定正负、bit 长度和随机数种子构建一个随机的 BigInt 结构体。bit 长度需要大于 0。

参数:

异常:

[h2]init(Int16)

public init(n: Int16)

功能:通过 16 位有符号整数构建一个 BigInt 结构体。

参数:

[h2]init(Int32)

public init(n: Int32)

功能:通过 32 位有符号整数构建一个 BigInt 结构体。

参数:

[h2]init(Int64)

public init(n: Int64)

功能:通过 64 位有符号整数构建一个 BigInt 结构体。

参数:

[h2]init(Int8)

public init(n: Int8)

功能:通过 8 位有符号整数构建一个 BigInt 结构体。

参数:

[h2]init(IntNative)

public init(n: IntNative)

功能:通过平台相关有符号整数构建一个 BigInt 结构体。

参数:

[h2]init(String, Int64)

public init(s: String, base!: Int64 = 10)

功能:通过字符串和进制构建一个 BigInt 结构体,支持 2 进制到 36 进制。

字符串的规则如下,即开头是可选的符号(正号或负号),接一串字符串表示的数字:

IntegerString : (SignString)? ValueString

参数:

异常:

[h2]init(UInt16)

public init(n: UInt16)

功能:通过 16 位无符号整数构建一个 BigInt 结构体。

参数:

[h2]init(UInt32)

public init(n: UInt32)

功能:通过 32 位无符号整数构建一个 BigInt 结构体。

参数:

[h2]init(UInt64)

public init(n: UInt64)

功能:通过 64 位无符号整数构建一个 BigInt 结构体。

参数:

[h2]init(UInt8)

public init(n: UInt8)

功能:通过 8 位无符号整数构建一个 BigInt 结构体。

参数:

[h2]init(UIntNative)

public init(n: UIntNative)

功能:通过平台相关无符号整数构建一个 BigInt 结构体。

参数:

[h2]static func randomProbablePrime(Int64, UInt64, Random)

public static func randomProbablePrime(bitLen: Int64, certainty: UInt64, rand!: Random = Random()): BigInt

功能:通过可选的随机数种子构建一个随机的 BigInt 素数,素数的 bit 长度不超过入参 bitLen。

显然,素数必定是大于等于 2 的整数,因此 bitLen 必须大于等于 2。素数检测使用 Miller-Rabin 素数测试算法。Miller-Rabin 测试会有概率将一个合数判定为素数,其出错概率随着入参 certainty 的增加而减少。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let randomProbablePrime = BigInt.randomProbablePrime(6, 3)
    println(randomProbablePrime)
}

运行结果:

11

[h2]func clearBit(Int64)

public func clearBit(index: Int64): BigInt

功能:通过将指定索引位置的 bit 修改为 0 来构造一个新 BigInt。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1024)
    let clearBit = bigInt.clearBit(10)
    println(clearBit)
}

运行结果:

0

[h2]func compare(BigInt)

public func compare(that: BigInt): Ordering

功能:判断 BigInt 与另一个 BigInt 的关系。

参数:

返回值:

[h2]func divAndMod(BigInt)

public func divAndMod(that: BigInt): (BigInt, BigInt)

功能:BigInt 的除法运算。

与另一个 BigInt 相除,返回商和模。此除法运算的行为与基础类型保持一致,即商向靠近 0 的方向取整,模的符号与被除数保持一致。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1025)
    let that = BigInt(512)
    let (div, mod) = bigInt.divAndMod(that)
    println(div)
    println(mod)
}

运行结果:

2
1

[h2]func flipBit(Int64)

public func flipBit(index: Int64): BigInt

功能:通过翻转指定索引位置的 bit 来构造一个新 BigInt。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1024)
    let flipBit = bigInt.flipBit(10)
    println(flipBit)
}

运行结果:

0

[h2]func hashCode()

public func hashCode(): Int64

功能:计算并返回此 BigInt 的哈希值。

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1024)
    let hashCode = bigInt.hashCode()
    println(hashCode)
}

运行结果:

1024

[h2]func isProbablePrime(UInt64)

public func isProbablePrime(certainty: UInt64): Bool

功能:判断一个数是不是素数。

该函数使用了 Miller-Rabin 测试算法,此算法的准确率会随着 certainty 参数的增加而增加。如果该数是素数,那么 Miller-Rabin 测试必定返回 true;如果该数是合数(期待返回 false),那么会有低于 1/4certainty 概率返回 true。素数只对大于等于 2 的正整数有意义,即负数,0,1 都不是素数。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1024)
    let isProbablePrime = bigInt.isProbablePrime(10)
    println(isProbablePrime)
}

运行结果:

false

[h2]func lowestOneBit()

public func lowestOneBit(): Int64

功能:判断为 1 的最低位的 bit 的位置。

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(-1)
    let lowestOneBit = bigInt.lowestOneBit()
    println(lowestOneBit)
}

运行结果:

0

[h2]func modInverse(BigInt)

public func modInverse(that: BigInt): BigInt

功能:求模逆元。

模逆元 r 满足 $(this * r) % that == 1$。显然,this 和 that 必须互质。当 that 为 正负 1 时,结果总是 0。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1025)
    let that = BigInt(512)
    let modInverse = bigInt.modInverse(that)
    println(modInverse)
}

运行结果:

1

[h2]func modPow

public func modPow(n: BigInt, m!: ?BigInt = None): BigInt

功能:计算此 BigInt 的 n 次幂模 m 的结果,并返回。

模的规则与基础类型一致,即模的符号与被除数保持一致。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(2)
    let n = BigInt(10)
    let modPow = bigInt.modPow(n)
    println(modPow)
}

运行结果:

1024

[h2]func quo(BigInt)

public func quo(that: BigInt): BigInt

功能:BigInt 的除法运算。

与另一个 BigInt 相除,返回结果。此除法运算的行为与运算符重载函数区别于,如果被除数为负数,此函数的结果向着远离 0 的方向取整,保证余数大于等于 0。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1025)
    let that = BigInt(512)
    let quo = bigInt.quo(that)
    println(quo)
}

运行结果:

2

[h2]func quoAndRem(BigInt)

public func quoAndRem(that: BigInt): (BigInt, BigInt)

功能:BigInt 的除法运算。

与另一个 BigInt 相除,返回商和余数。此除法运算的行为与 divAndMod 函数区别于,如果被除数为负数,此函数的结果向着远离 0 的方向取整,保证余数总是大于等于 0。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1025)
    let that = BigInt(512)
    let (quo, rem) = bigInt.quoAndRem(that)
    println(quo)
    println(rem)
}

运行结果:

2
1

[h2]func rem(BigInt)

public func rem(that: BigInt): BigInt

功能:BigInt 的模运算。

与另一个 BigInt 相除,返回余数。余数的结果总是大于等于 0。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(1025)
    let that = BigInt(512)
    let rem = bigInt.rem(that)
    println(rem)
}

运行结果:

1

[h2]func setBit(Int64)

public func setBit(index: Int64): BigInt

功能:通过将指定索引位置的 bit 修改为 1 来构造一个新 BigInt。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(0)
    let setBit = bigInt.setBit(10)
    println(setBit)
}

运行结果:

1024

[h2]func testBit(Int64)

public func testBit(index: Int64): Bool

功能:判断指定位置的 bit 信息,如果指定位置的 bit 为 0,则返回 false;为 1,则返回 true。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(-1)
    let testBit = bigInt.testBit(100)
    println(testBit)
}

运行结果:

true

[h2]func toBytes()

public func toBytes(): Array<Byte>

功能:计算并返回此 BigInt 的大端补码字节数组。

字节数组最低索引的最低位为符号位,如 128 返回 [0, 128](符号位为 0),-128 返回 [128](符号位为 1)。

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(0x400)
    let toBytes = bigInt.toBytes()
    println(toBytes)
}

运行结果:

[4, 0]

[h2]func toInt16(OverflowStrategy)

public func toInt16(overflowHandling!: OverflowStrategy = throwing): Int16

功能:将当前 BigInt 对象转化为 Int16 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt(0x8000_0000_0000)
    let toInt16 = bigInt.toInt16(overflowHandling: saturating)
    println(toInt16)
}

运行结果:

32767

[h2]func toInt32(OverflowStrategy)

public func toInt32(overflowHandling!: OverflowStrategy = throwing): Int32

功能:将当前 BigInt 对象转化为 Int32 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt(0x8000_0000_00FF)
    let toInt32 = bigInt.toInt32(overflowHandling: wrapping)
    println(toInt32)
}

运行结果:

255

[h2]func toInt64(OverflowStrategy)

public func toInt64(overflowHandling!: OverflowStrategy = throwing): Int64

功能:将当前 BigInt 对象转化为 Int64 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt("800000000000000000", base: 16)
    let toInt64 = bigInt.toInt64(overflowHandling: wrapping)
    println(toInt64)
}

运行结果:

0

[h2]func toInt8(OverflowStrategy)

public func toInt8(overflowHandling!: OverflowStrategy = throwing): Int8

功能:将当前 BigInt 对象转化为 Int8 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt(1024)
    let toInt8 = bigInt.toInt8(overflowHandling: saturating)
    println(toInt8)
}

运行结果:

127

[h2]func toIntNative(OverflowStrategy)

public func toIntNative(overflowHandling!: OverflowStrategy = throwing): IntNative

功能:将当前 BigInt 对象转化为 IntNative 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt("800000000000000000", base: 16)
    let toIntNative = bigInt.toIntNative(overflowHandling: wrapping)
    println(toIntNative)
}

运行结果:

0

[h2]func toString()

public func toString(): String

功能:计算并返回此 BigInt 的十进制字符串表示。

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(0x400)
    let toString = bigInt.toString()
    println(toString)
}

运行结果:

1024

[h2]func toString(Int64)

public func toString(base: Int64): String

功能:计算并返回此 BigInt 的任意进制字符串表示。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt(0x400)
    let toString = bigInt.toString(2)
    println(toString)
}

运行结果:

10000000000

[h2]func toUInt16(OverflowStrategy)

public func toUInt16(overflowHandling!: OverflowStrategy = throwing): UInt16

功能:将当前 BigInt 对象转化为 UInt16 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt("800000000000000000", base: 16)
    let toUInt16 = bigInt.toUInt16(overflowHandling: wrapping)
    println(toUInt16)
}

运行结果:

0

[h2]func toUInt32(OverflowStrategy)

public func toUInt32(overflowHandling!: OverflowStrategy = throwing): UInt32

功能:将当前 BigInt 对象转化为 UInt32 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt("800000000000000000", base: 16)
    let toUInt32 = bigInt.toUInt32(overflowHandling: wrapping)
    println(toUInt32)
}

运行结果:

0

[h2]func toUInt64(OverflowStrategy)

public func toUInt64(overflowHandling!: OverflowStrategy = throwing): UInt64

功能:将当前 BigInt 对象转化为 UInt64 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt("-800000000000000000", base: 16)
    let toUInt64 = bigInt.toUInt64(overflowHandling: saturating)
    println(toUInt64)
}

运行结果:

0

[h2]func toUInt8(OverflowStrategy)

public func toUInt8(overflowHandling!: OverflowStrategy = throwing): UInt8

功能:将当前 BigInt 对象转化为 UInt8 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt("800000000000000000", base: 16)
    try {
        bigInt.toUInt8(overflowHandling: throwing)
    } catch (e: OverflowException) {
        println(e.message)
    }
    return
}

运行结果:

Out of range of the UInt8

[h2]func toUIntNative(OverflowStrategy)

public func toUIntNative(overflowHandling!: OverflowStrategy = throwing): UIntNative

功能:将当前 BigInt 对象转化为 UIntNative 类型,支持自定义溢出策略。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt
import std.math.numeric.OverflowStrategy

main() {
    let bigInt = BigInt("-800000000000000000", base: 16)
    let toUIntNative = bigInt.toUIntNative(overflowHandling: saturating)
    println(toUIntNative)
}

运行结果:

0

[h2]operator func !()

public operator func !(): BigInt

功能:按位非。将操作数中的二进制位 0 变 1,1 变 0。

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let no = !bigInt
    println(no)
}

运行结果:

0

[h2]operator func !=(BigInt)

public operator func !=(that: BigInt): Bool

功能:判不等运算。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("-2")
    println(bigInt != that)
}

运行结果:

true

[h2]operator func %(BigInt)

public operator func %(that: BigInt): BigInt

功能:BigInt 的模运算。

取模运算的行为与基础类型保持一致,即符号与被除数保持一致。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-23456789123456789")
    let that = BigInt("-23456789123456789")
    let mod = bigInt % that
    println(mod)
}

运行结果:

0

[h2]operator func &(BigInt)

public operator func &(that: BigInt): BigInt

功能:按位与。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为 1 时,结果位才为 1。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("8")
    let that = BigInt("7")
    let and = bigInt & that
    println(and)
}

运行结果:

0

[h2]operator func *(BigInt)

public operator func *(that: BigInt): BigInt

功能:BigInt 乘法。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("-23456789123456789")
    let mul = bigInt * that
    println(mul)
}

运行结果:

23456789123456789

[h2]operator func **(UInt64)

public operator func **(n: UInt64): BigInt

功能:求 BigInt 的 n 次幂。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-2")
    let power = bigInt ** 64
    println(power.toString(16))
}

运行结果:

10000000000000000

[h2]operator func +(BigInt)

public operator func +(that: BigInt): BigInt

功能:BigInt 加法。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("123456789123456789")
    let that = BigInt("-23456789123456789")
    let plus = bigInt + that
    println(plus)
}

运行结果:

100000000000000000

[h2]operator func -()

public operator func -(): BigInt

功能:求 BigInt 的相反数。

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-23456789123456789")
    let opposite = -bigInt
    println(opposite)
}

运行结果:

23456789123456789

[h2]operator func -(BigInt)

public operator func -(that: BigInt): BigInt

功能:BigInt 减法。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("100000000000000000")
    let that = BigInt("-23456789123456789")
    let sub = bigInt - that
    println(sub)
}

运行结果:

123456789123456789

[h2]operator func <(BigInt)

public operator func <(that: BigInt): Bool

功能:小于比较运算。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("-2")
    println(bigInt < that)
}

运行结果:

false

[h2]operator func <<(Int64)

public operator func <<(n: Int64): BigInt

功能:左移运算。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let leftShift = bigInt << 64
    println(leftShift.toString(16))
}

运行结果:

-10000000000000000

[h2]operator func <=(BigInt)

public operator func <=(that: BigInt): Bool

功能:小于等于比较运算。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("-2")
    println(bigInt <= that)
}

运行结果:

false

[h2]operator func ==(BigInt)

public operator func ==(that: BigInt): Bool

功能:判等运算。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("-2")
    println(bigInt == that)
}

运行结果:

false

[h2]operator func >(BigInt)

public operator func >(that: BigInt): Bool

功能:大于比较运算。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("-2")
    println(bigInt > that)
}

运行结果:

true

[h2]operator func >=(BigInt)

public operator func >=(that: BigInt): Bool

功能:大于等于比较运算。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("-2")
    println(bigInt >= that)
}

运行结果:

true

[h2]operator func >>(Int64)

public operator func >>(n: Int64): BigInt

功能:右移运算。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let rightShift = bigInt >> 10000
    println(rightShift)
}

运行结果:

-1

[h2]operator func /(BigInt)

public operator func /(that: BigInt): BigInt

功能:BigInt 除法。

除法运算的行为与基础类型保持一致,即结果向靠近 0 的方向取整。

参数:

返回值:

异常:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-23456789123456789")
    let that = BigInt("-23456789123456789")
    let div = bigInt / that
    println(div)
}

运行结果:

1

[h2]operator func ^(BigInt)

public operator func ^(that: BigInt): BigInt

功能:按位异或。其功能是参与运算的两数各对应的二进位相异或。二进制位结果不相同时,异或结果为 1;二进制位结果相同时,异或结果为 0。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("-1")
    let that = BigInt("7")
    let xor = bigInt ^ that
    println(xor)
}

运行结果:

-8

[h2]operator func |(BigInt)

public operator func |(that: BigInt): BigInt

功能:按位或。其功能是参与运算的两数各对应的二进位相或。只有对应的两个二进位都为 0 时,结果位才为 0。

参数:

返回值:

示例:

import std.math.numeric.BigInt

main() {
    let bigInt = BigInt("8")
    let that = BigInt("7")
    let or = bigInt | that
    println(or)
}

运行结果:

15