71 lines
1.4 KiB
Go
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)
|
|
}
|