Files
2026-05-27 23:03:00 +08:00

71 lines
1.4 KiB
Go

package gmath
import (
"math/big"
)
// BigIntx is a big.Int of x
var (
BigInt0 = big.NewInt(0)
BigInt1 = big.NewInt(1)
BigInt2 = big.NewInt(2)
BigInt3 = big.NewInt(3)
BigInt4 = big.NewInt(4)
BigInt5 = big.NewInt(5)
BigInt6 = big.NewInt(6)
BigInt7 = big.NewInt(7)
BigInt8 = big.NewInt(8)
BigInt9 = big.NewInt(9)
BigInt10 = big.NewInt(10)
BigInt11 = big.NewInt(11)
BigInt12 = big.NewInt(12)
BigInt2256 = new(big.Int).Lsh(BigInt1, 256) // = 2^256
)
// IsBigInt0 return if x==0
func IsBigInt0(x *big.Int) bool {
return x.Sign() == 0
}
// IsBigInt1 return if x==0
func IsBigInt1(x *big.Int) bool {
return x.Cmp(BigInt1) == 0
}
// ClearBigInt set memory of x be 0
func ClearBigInt(x *big.Int) {
if x == nil {
return
}
words := x.Bits()
for i := range words {
words[i] = 0
}
x.SetInt64(0)
}
type bytes interface {
Bytes() []byte
}
// ToNBytes ouput a bytes to fix n bytes. extend as 0.
func ToNBytes(b bytes, n int) []byte {
abs := b.Bytes()
l := len(abs)
var s []byte
// l==n is the most case (255/256)
if l >= n {
s = abs[l-n : l]
} else {
s = make([]byte, n)
copy(s[n-l:], abs)
}
return s
}
// BigIntToNByte return a n byte slice of the input big.Int as big-endian
// if len(a.Bytes()) > n, then only the lower n bytes are return
func BigIntToNByte(a *big.Int, n int) []byte {
return ToNBytes(a, n)
}