# # Number-theoretic transform # (that is, FFT for polynomials over finite fields) # #------------------------------------------------------------------------------- import constantine/math/arithmetic except Fp,Fr import constantine/math/io/io_fields import bn128 import domain #------------------------------------------------------------------------------- func forwardNTT_worker( m: int , srcStride: int , gen: Fr , src: seq[Fr] , srcOfs: int , buf: var seq[Fr] , bufOfs: int , tgt: var seq[Fr] , tgtOfs: int ) = case m of 0: tgt[tgtOfs] = src[srcOfs] of 1: tgt[tgtOfs ] = src[srcOfs] + src[srcOfs+srcStride] tgt[tgtOfs+1] = src[srcOfs] - src[srcOfs+srcStride] else: let N : int = 1 shl m let halfN : int = 1 shl (m-1) var gpow : Fr = gen square(gpow) forwardNTT_worker( m-1 , srcStride shl 1 , gpow , src , srcOfs , buf , bufOfs + N , buf , bufOfs ) forwardNTT_worker( m-1 , srcStride shl 1 , gpow , src , srcOfs + srcStride , buf , bufOfs + N , buf , bufOfs + halfN ) gpow = oneFr for j in 0..