arnaucube
arnaucube/snarkjsPublic Self-hosted repository
snarkjs/src/ratfield.js
src/ratfield.jsRaw
  1const fUtils = require("./futils.js");
  2
  3class RatField {
  4    constructor(F) {
  5        this.F = F;
  6        this.zero = [F.zero, F.one];
  7        this.one = [F.one, F.one];
  8        this.two = [F.two, F.one];
  9        this.twoinv = [F.one, F.two];
 10        this.q = F.q;
 11    }
 12
 13    add(a,b) {
 14        return [
 15            this.F.add(
 16                this.F.mul(a[0], b[1]),
 17                this.F.mul(a[1], b[0])),
 18            this.F.mul(a[1], b[1])];
 19    }
 20
 21    double(a) {
 22        return [this.F.add(a[0], a[0]), a[1]];
 23    }
 24
 25    sub(a,b) {
 26        return [
 27            this.F.sub(
 28                this.F.mul(a[0], b[1]),
 29                this.F.mul(a[1], b[0])),
 30            this.F.mul(a[1], b[1])];
 31    }
 32
 33    neg(a) {
 34        return [this.F.neg(a[0]), a[1]];
 35    }
 36
 37    mul(a,b) {
 38        return [
 39            this.F.mul(a[0], b[0]),
 40            this.F.mul(a[1], b[1]),
 41        ];
 42    }
 43
 44    copy(a) {
 45        return [a[0], a[1]];
 46    }
 47
 48    div(a, b) {
 49        return [
 50            this.F.mul(a[0], b[1]),
 51            this.F.mul(a[1], b[0]),
 52        ];
 53    }
 54
 55    inverse(a) {
 56        return [a[1], a[0]];
 57    }
 58
 59    square(a) {
 60        return [
 61            this.F.square(a[0]),
 62            this.F.square(a[1])
 63        ];
 64    }
 65
 66    mulScalar(base, e) {
 67        return [this.F.mulScalar(base[0], e) , base[1]];
 68    }
 69
 70    exp(base, e) {
 71        return fUtils.exp(this, base, e);
 72    }
 73
 74    equals(a, b) {
 75        return this.F.equals(
 76            this.F.mul(a[0], b[1]),
 77            this.F.mul(a[1], b[0])
 78        );
 79    }
 80
 81    isZero(a) {
 82        return this.F.isZero(a[0]);
 83    }
 84
 85    affine(a) {
 86        return [this.F.div(a[0], a[1]), this.F.one];
 87    }
 88
 89    toString(a) {
 90        const ca = this.affine(a);
 91        return `"0x${ca[0].toString(16)}"`;
 92    }
 93
 94    random() {
 95        return [this.F.random(), this.F.one];
 96    }
 97
 98    fromF(a) {
 99        return [a, this.F.one];
100    }
101
102    toF(a) {
103        return this.affine(a)[0];
104    }
105}
106
107
108module.exports = RatField;