From 865e74c3f79753eb43bc362438db7f0d614fa986 Mon Sep 17 00:00:00 2001 From: Mamy Ratsimbazafy Date: Wed, 3 Sep 2025 09:59:49 +0200 Subject: [PATCH] =?UTF-8?q?[arith]:=20isSquare=20on=20=F0=9D=94=BDr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../math/arithmetic/finite_fields_square_root.nim | 10 +++++----- tests/math_fields/t_finite_fields_sqrt.nim | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/constantine/math/arithmetic/finite_fields_square_root.nim b/constantine/math/arithmetic/finite_fields_square_root.nim index 253d92162..a8ff7f18d 100644 --- a/constantine/math/arithmetic/finite_fields_square_root.nim +++ b/constantine/math/arithmetic/finite_fields_square_root.nim @@ -361,13 +361,13 @@ func invsqrt_if_square_vartime*[Name](r: var Fp[Name], a: Fp[Name]): SecretBool # Legendre symbol / Euler's Criterion / Kronecker's symbol # ------------------------------------------------------------ -func isSquare*(a: Fp): SecretBool = - ## Returns true if ``a`` is a square (quadratic residue) in 𝔽p +func isSquare*(a: FF): SecretBool = + ## Returns true if ``a`` is a square (quadratic residue) in 𝔽p or 𝔽r ## - ## Assumes that the prime modulus ``p`` is public. - var aa {.noInit.}: Fp.getBigInt() + ## Assumes that the prime modulus ``p`` (or ``r``) is public. + var aa {.noInit.}: FF.getBigInt() aa.fromField(a) - let symbol = legendre(aa.limbs, Fp.getModulus().limbs, aa.bits) + let symbol = legendre(aa.limbs, FF.getModulus().limbs, aa.bits) return not(symbol == MaxWord) {.pop.} # inline diff --git a/tests/math_fields/t_finite_fields_sqrt.nim b/tests/math_fields/t_finite_fields_sqrt.nim index abe917b11..9f0c4f788 100644 --- a/tests/math_fields/t_finite_fields_sqrt.nim +++ b/tests/math_fields/t_finite_fields_sqrt.nim @@ -199,4 +199,18 @@ proc main() = a.fromHex"0x7ff7ffffffffffff1dfb7fafc0000000" testSqrtImpl(a) + suite "isSquare on 𝔽r" & " [" & $WordBitWidth & "-bit words]": + test "𝔽r[BW6_761] is consistent with 𝔽p[BLS12_381]": + block: + var a: Fr[BW6_761] + a.fromHex"0x184d02ce4f24d5e59b4150a57a31b202fd40a4b41d7518c22b84bee475fbcb7763100448ef6b17a6ea603cf062e5db51" + check: + bool(not a.isSquare()) + + block: + var a: Fr[BW6_761] + a.fromHex"0x0f16d7854229d8804bcadd889f70411d6a482bde840d238033bf868e89558d39d52f9df60b2d745e02584375f16c34a3" + check: + bool(not a.isSquare()) + main()