diff --git a/packages/utils/src/f1-field.ts b/packages/utils/src/f1-field.ts index 9321c609..57dd6aa1 100644 --- a/packages/utils/src/f1-field.ts +++ b/packages/utils/src/f1-field.ts @@ -202,6 +202,11 @@ export default class F1Field { return this.one } + if (e < 0n) { + base = this.inv(base) + e = -e + } + const n = scalar.bits(e) if (n.length === 0) { diff --git a/packages/utils/tests/f1-field.test.ts b/packages/utils/tests/f1-field.test.ts index ff530784..ae6aea87 100644 --- a/packages/utils/tests/f1-field.test.ts +++ b/packages/utils/tests/f1-field.test.ts @@ -110,7 +110,7 @@ describe("F1Field", () => { expect(field.isZero(b)).toBeFalsy() }) - it("Should pow into the finite field", () => { + it("Should pow into the finite field", async () => { const a = field.e(0n) const b = field.e(1n) const c = field.e(2n) @@ -120,6 +120,8 @@ describe("F1Field", () => { expect(field.pow(b, c)).toBe(1n) expect(field.pow(a, b)).toBe(0n) expect(field.pow(a, d)).toBe(0n) - expect(field.pow(d, a)).toBe(1n) + expect(field.pow(0n, -1n)).toBe(0n) + expect(field.pow(2n, -1n)).toBe(field.inv(2n)) + expect(field.pow(5n, -30n)).toBe(1n) }) })