import constantine/math/arithmetic import constantine/named/properties_fields import groth16/bn128 import groth16/bn128/curves import groth16/bn128/arrays import groth16/math/domain import groth16/math/ntt import groth16/math/group_fft #------------------------------------------------------------------------------- type F = Fr[BN254_Snarks] func fieldConvolution*(xs: seq[F], ys: seq[F]): seq[F] = let N = xs.len assert( N == ys.len ) let D = createDomain( N ) let us = forwardNTT(xs, D) let vs = forwardNTT(ys, D) let ws = pointwiseProdFr(us, vs) return inverseNTT(ws, D) #------------------------------------------------------------------------------- func groupConvolution*(xs: seq[F], gs: seq[G1]): seq[G1] = let N = xs.len assert( N == gs.len ) let D = createDomain( N ) let us = forwardNTT(xs, D) let hs = forwardGroupFFT(gs, D) let rs = pointwiseScaleG1(us, hs) return inverseGroupFFT(rs, D) #------------------------------------------------------------------------------- func fieldConvolutionOnSubgroup*(sg: Subgroup, xs: seq[F], ys: seq[F]): seq[F] = let N = xs.len assert( N == ys.len ) assert( N == sg.bigDomain.domainSize ) let D = sg.bigDomain let K = sg.smallDomain.domainSize let ell = N div K let fell : F = intToFr(ell) let invfell : F = invFr(fell) let us = forwardNTT(xs, D) let vs = forwardNTT(ys, D) var ws: seq[F] = newSeq[F]( K ) for k in 0..