diff --git a/groth16/dynamic/shared.nim b/groth16/dynamic/shared.nim index f886d30..ef07a62 100644 --- a/groth16/dynamic/shared.nim +++ b/groth16/dynamic/shared.nim @@ -154,6 +154,67 @@ proc groupConvolveWithWVecBar*( D: Domain, gs: seq[G1] ): seq[G1] = inplaceScalarMulByFFTofWVecBar( gsHat ) return inverseGroupFFT( gsHat , D) +#--------------------------------------- + +# only computes the result on a subgroup +proc fieldConvolveWithWVecBarOnSubgroup*( sg: Subgroup, xs: seq[F] ): seq[F] = + + let N = xs.len + assert( N == sg.bigDomain.domainSize ) + let D = sg.bigDomain + let K = sg.smallDomain.domainSize + let ell = N div K + + let fN = intToFr( N ) + let invN = invFr( fN ) + let fell : F = intToFr(ell) + let invN_per_fell : F = invN / fell + + let xsHat = forwardNTT( xs , D ) + var ysHat : seq[F] = newSeq[F]( K ) + + let c0 = divBy2Fr(oneFr - fN) * invN_per_fell + for k in 0..