|
|
/* Copyright 2018 0kims association
This file is part of zksnark javascript library.
zksnark javascript library is 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.
zksnark javascript library 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 zksnark javascript library. If not, see <https://www.gnu.org/licenses/>.
*/
const fUtils = require("./futils.js");
class RatField { constructor(F) { this.F = F; this.zero = [F.zero, F.one]; this.one = [F.one, F.one]; this.two = [F.two, F.one]; this.twoinv = [F.one, F.two]; this.q = F.q; }
add(a,b) { return [ this.F.add( this.F.mul(a[0], b[1]), this.F.mul(a[1], b[0])), this.F.mul(a[1], b[1])]; }
double(a) { return [this.F.add(a[0], a[0]), a[1]]; }
sub(a,b) { return [ this.F.sub( this.F.mul(a[0], b[1]), this.F.mul(a[1], b[0])), this.F.mul(a[1], b[1])]; }
neg(a) { return [this.F.neg(a[0]), a[1]]; }
mul(a,b) { return [ this.F.mul(a[0], b[0]), this.F.mul(a[1], b[1]), ]; }
copy(a) { return [a[0], a[1]]; }
div(a, b) { return [ this.F.mul(a[0], b[1]), this.F.mul(a[1], b[0]), ]; }
inverse(a) { return [a[1], a[0]]; }
square(a) { return [ this.F.square(a[0]), this.F.square(a[1]) ]; }
mulScalar(base, e) { return [this.F.mulScalar(base[0], e) , base[1]]; }
exp(base, e) { return fUtils.exp(this, base, e); }
equals(a, b) { return this.F.equals( this.F.mul(a[0], b[1]), this.F.mul(a[1], b[0]) ); }
isZero(a) { return this.F.isZero(a[0]); }
affine(a) { return [this.F.div(a[0], a[1]), this.F.one]; }
toString(a) { const ca = this.affine(a); return `"0x${ca[0].toString(16)}"`; }
random() { return [this.F.random(), this.F.one]; }
fromF(a) { return [a, this.F.one]; }
toF(a) { return this.affine(a)[0]; } }
module.exports = RatField;
|