const bigInt = require("./bigint"); const fUtils = require("./futils.js"); class ZqField { constructor(q) { this.q = q; this.nq = bigInt.zero.minus(q); this.zero = bigInt.zero; this.one = bigInt.one; } copy(a) { return bigInt(a); } add(a, b) { return a.add(b); } double(a) { return this.add(a,a); } sub(a, b) { return a.minus(b); } neg(a) { return bigInt.zero.minus(a); } mul(a, b) { return a.mulMod(this.q, b); } inverse(a) { return a.modInv(this.q); } div(a, b) { return this.mul(a, this.inverse(b)); } square(a) { return a.square().mod(this.q); } isZero(a) { return a.isZero(); } equals(a, b) { return this.affine(a).equals(this.affine(b)); } affine(a) { return a.affine(this.q); } mulEscalar(base, e) { return fUtils.mulEscalar(this, base, e); } exp(base, e) { return fUtils.exp(this, base, e); } toString(a) { const ca = this.affine(a); return `"0x${ca.toString(16)}"`; } } module.exports = ZqField;