
/*****************************************************************************\

MODULE: vec_zz_p

SUMMARY:

Provides vectors over zz_p, along with some related operations.

\*****************************************************************************/

#include "zz_p.h"
#include "vec_zz.h"
#include "vector.h"

vector_decl(zz_p)

vector_io_decl(zz_p)
// I/O operators are defined

vector_eq_decl(zz_p)
// operators == and != are defined

void operator<<(vector(zz_p)& x, const vector(ZZ)& a);
// x.SetLength(a.length())
// x[i] << a[i]  (0 <= i < a.length())

void operator<<(vector(ZZ)& x, const vector(zz_p)& a);
// x.SetLength(a.length())
// x[i] << a[i]  (0 <= i < a.length())

void InnerProduct(zz_p& x, const vector(zz_p)& a, const vector(zz_p)& b);
// x = sum_{i=0}^{n-1} a[i]*b[i], where n = min(a.length(), b.length())

void mul(vector(zz_p)& x, const vector(zz_p)& a, zz_p b);
// x = a * b

void add(vector(zz_p)& x, const vector(zz_p)& a, const vector(zz_p)& b);
// x = a + b

void sub(vector(zz_p)& x, const vector(zz_p)& a, const vector(zz_p)& b);
// x = a - b

void clear(vector(zz_p)& x);
// x = 0 (length unchanged)

void negate(vector(zz_p)& x, const vector(zz_p)& a);
// x = -a


void InnerProduct(zz_p& x, const vector(zz_p)& a, const vector(zz_p)& b,
                  long offset);
// x = sum_{i=offset}^n a[i]*b[i-offset], 
// where n = min(a.length(), b.length()+offset)

long CRT(vector(ZZ)& a, ZZ& prod, const vector(zz_p)& A);
// Incremental Chinese Remaindering:
// If p is the current modulus with (p, prod) = 1;
// Computes b such that b = a mod prod and b = A mod p,
//    with coefficients in the interval (-p*prod/2, p*prod/2];
// Sets a = b, prod = p*prod, and returns 1 if a's value changed.


