UNPKG

@kotevode/ffjavascript

Version:

Finite Field Library in Javascript

95 lines (64 loc) 1.96 kB
/* Copyright 2018 0kims association. This file is part of snarkjs. snarkjs is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. snarkjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with snarkjs. If not, see <https://www.gnu.org/licenses/>. */ import * as Scalar from "./scalar.js"; export function mulScalar(F, base, e) { let res; if (Scalar.isZero(e)) return F.zero; const n = Scalar.naf(e); if (n[n.length-1] == 1) { res = base; } else if (n[n.length-1] == -1) { res = F.neg(base); } else { throw new Error("invlaud NAF"); } for (let i=n.length-2; i>=0; i--) { res = F.double(res); if (n[i] == 1) { res = F.add(res, base); } else if (n[i] == -1) { res = F.sub(res, base); } } return res; } /* exports.mulScalar = (F, base, e) =>{ let res = F.zero; let rem = bigInt(e); let exp = base; while (! rem.eq(bigInt.zero)) { if (rem.and(bigInt.one).eq(bigInt.one)) { res = F.add(res, exp); } exp = F.double(exp); rem = rem.shiftRight(1); } return res; }; */ export function exp(F, base, e) { if (Scalar.isZero(e)) return F.one; const n = Scalar.bits(e); if (n.length==0) return F.one; let res = base; for (let i=n.length-2; i>=0; i--) { res = F.square(res); if (n[i]) { res = F.mul(res, base); } } return res; }