From 3f7519bed410c1d673359b06899f0ea7d273da49 Mon Sep 17 00:00:00 2001 From: filifa Date: Thu, 11 Dec 2025 23:49:34 -0500 Subject: [PATCH] add function for legendre symbol --- modules/math.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/math.js b/modules/math.js index e40d615..db1d21b 100644 --- a/modules/math.js +++ b/modules/math.js @@ -101,10 +101,19 @@ function isprime(n) { return true; } +function legendreSymbol(a, p) { + let r = modpow(a, (p - 1n)/2n, p); + if (r === p - 1n) { + r = -1n; + } + + return r; +} + function quadraticNonResidue(p) { // TODO: consider randomizing this for (let a = 2n; a < p; a++) { - if (modpow(a, (p-1n)/2n, p) === p - 1n) { + if (legendreSymbol(a, p) === -1n) { return a; } } @@ -158,7 +167,7 @@ function modsqrt(n, modulus) { if (n % modulus === 0n) { return 0n; - } else if (modpow(n, (modulus-1n)/2n, modulus) !== 1n) { + } else if (legendreSymbol(n, modulus) !== 1n) { throw new Error("radicand is not a quadratic residue of the modulus"); } else if (modulus === 2n) { return n % 2n;