You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1004 B

package gocircomprover
import (
"bytes"
"math/big"
)
func FAdd(a, b *big.Int) *big.Int {
ab := new(big.Int).Add(a, b)
return new(big.Int).Mod(ab, R)
}
func FSub(a, b *big.Int) *big.Int {
ab := new(big.Int).Sub(a, b)
return new(big.Int).Mod(ab, R)
}
func FMul(a, b *big.Int) *big.Int {
ab := new(big.Int).Mul(a, b)
return new(big.Int).Mod(ab, R)
}
func FDiv(a, b *big.Int) *big.Int {
ab := new(big.Int).Mul(a, new(big.Int).ModInverse(b, R))
return new(big.Int).Mod(ab, R)
}
func FNeg(a *big.Int) *big.Int {
return new(big.Int).Mod(new(big.Int).Neg(a), R)
}
func FInv(a *big.Int) *big.Int {
return new(big.Int).ModInverse(a, R)
}
func FExp(base *big.Int, e *big.Int) *big.Int {
res := big.NewInt(1)
rem := new(big.Int).Set(e)
exp := base
for !bytes.Equal(rem.Bytes(), big.NewInt(int64(0)).Bytes()) {
// if BigIsOdd(rem) {
if rem.Bit(0) == 1 { // .Bit(0) returns 1 when is odd
res = FMul(res, exp)
}
exp = FMul(exp, exp)
rem = new(big.Int).Rsh(rem, 1)
}
return res
}