/*
Package math provides access to useful numeric functions available in Neo VM.
*/
package math

import "github.com/nspcc-dev/neo-go/pkg/interop/neogointernal"

// Pow returns a^b using POW VM opcode.
// b must be >= 0 and <= 2^31-1.
func Pow(a, b int) int {
	return neogointernal.Opcode2("POW", a, b).(int)
}

// Sqrt returns a positive square root of x rounded down.
func Sqrt(x int) int {
	return neogointernal.Opcode1("SQRT", x).(int)
}

// Sign returns:
//
//	-1 if x <  0
//	 0 if x == 0
//	+1 if x >  0
func Sign(a int) int {
	return neogointernal.Opcode1("SIGN", a).(int)
}

// Abs returns an absolute value of a.
func Abs(a int) int {
	return neogointernal.Opcode1("ABS", a).(int)
}

// Max returns the maximum of a, b.
func Max(a, b int) int {
	return neogointernal.Opcode2("MAX", a, b).(int)
}

// Min returns the minimum of a, b.
func Min(a, b int) int {
	return neogointernal.Opcode2("MIN", a, b).(int)
}

// Within returns true if a <= x < b.
func Within(x, a, b int) bool {
	return neogointernal.Opcode3("WITHIN", x, a, b).(bool)
}

// ModMul returns the result of modulus division on a*b.
func ModMul(a, b, mod int) int {
	return neogointernal.Opcode3("MODMUL", a, b, mod).(int)
}

// ModPow returns the result of modulus division on a^b. If b is -1,
// it returns the modular inverse of a.
func ModPow(a, b, mod int) int {
	return neogointernal.Opcode3("MODPOW", a, b, mod).(int)
}