///| Polyveck is a vector of polynomials and length is k.
pub struct Polyveck {
  vec : Array[Poly]
} derive(Show)

///| deep clone
pub fn Polyveck::copy(self : Polyveck) -> Polyveck {
  let new_vec = Array::new()
  for poly in self.vec {
    new_vec.push(poly.copy())
  }
  { vec: new_vec }
}

///|
impl Default for Polyveck with default() -> Polyveck {
  let k = dilithium_context.get_params_set().k
  let vec = Array::new()
  for _i in 0.. Polyvecl {
  let new_vec = Array::new()
  for poly in self.vec {
    new_vec.push(poly.copy())
  }
  { vec: new_vec }
}

///|
impl Default for Polyvecl with default() -> Polyvecl {
  let l = dilithium_context.get_params_set().l
  let vec = Array::new()
  for _i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  let l = dilithium_context.get_params_set().l
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  let mut nonce = nonce
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  let l_u16 = l.to_uint16()
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  for i in 0.. Unit {
  let l = dilithium_context.get_params_set().l
  let t = Poly::default()
  w.pointwise_montgomery(u.vec[0], v.vec[0])
  for i in 1.. Byte {
  let l = dilithium_context.get_params_set().l
  for i in 0.. 0 {
      return 1
    }
  }
  return 0
}

//*********** Vectors of polynomials of length K ****************************

///|
pub fn Polyveck::uniform_eta(
  v : Polyveck,
  seed : Array[Byte],
  nonce : UInt16,
) -> Unit {
  let k = dilithium_context.get_params_set().k
  let mut nonce = nonce
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Byte {
  let k = dilithium_context.get_params_set().k
  for i in 0.. 0 {
      return 1
    }
  }
  return 0
}

///| For all coefficients a of polynomials in vector of length K,
/// compute a0, a1 such that a mod Q = a1*2^D + a0
/// with -2^{D-1} < a0 <= 2^{D-1}. Assumes coefficients to be
/// standard representatives.
pub fn Polyveck::power2round(v1 : Polyveck, v0 : Polyveck) -> Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Int {
  let k = dilithium_context.get_params_set().k
  let mut s = 0
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  for i in 0.. Unit {
  let k = dilithium_context.get_params_set().k
  let mut idx = 0
  for i in 0..