/* 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 . */ 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;