#ifndef _POINTCOUNT_INCLUDE_
#define _POINTCOUNT_INCLUDE_
#include "ff.h"
#define POINTCOUNT_MULTI_X 32
void pointcount_init (unsigned maxp);
void pointcount_precompute (mpz_t D[], mpz_t f[], int degree);
void pointcount_precompute_long (long D[], long f[], int degree);
static inline void pointcount_reduce (unsigned long d[], long D[], int degree, long p)
{ register long x; register int i; for ( i = 0 ; i <= degree ; i++ ) { x=D[i]%p; d[i] = (x < 0 ? x+p : x); } }
unsigned pointcount_g1 (unsigned long D[4], unsigned p);
unsigned pointcount_g2 (unsigned long D[6], unsigned p);
unsigned pointcount_g2d6 (unsigned long D[7], unsigned p, unsigned long f6);
unsigned pointcount_g3 (unsigned long D[8], unsigned p);
unsigned pointcount_g3d8 (unsigned long D[9], unsigned p, unsigned long f8);
unsigned pointcount_g4 (unsigned long D[10], unsigned p);
unsigned pointcount_pd4 (unsigned long D[5], unsigned p);
unsigned pointcount_g2_d2 (unsigned long f[6], unsigned p);
unsigned pointcount_big_g1 (unsigned long D[4], unsigned p);
unsigned pointcount_big_g2 (unsigned long D[6], unsigned p);
unsigned pointcount_big_g2d6 (unsigned long D[7], unsigned p, unsigned long f6);
unsigned pointcount_big_g3 (unsigned long D[8], unsigned p);
unsigned pointcount_big_g4 (unsigned long D[10], unsigned p);
int pointcount_multi_g2 (unsigned pts[], unsigned long D[6], unsigned p);
int pointcount_multi_g2d6 (unsigned pts[], unsigned long D[6], unsigned p, unsigned long f6);
int pointcount_multi_g3 (unsigned pts[], unsigned long D[8], unsigned p);
int pointcount_multi_g3d8 (unsigned pts[], unsigned long D[6], unsigned p, unsigned long f8);
unsigned pointcount_slow (ff_t f[], int d, unsigned p);
unsigned pointcount_tiny (unsigned long f[], int d, unsigned p);
unsigned pointcount_slow_d2 (ff_t f[], int d, unsigned p);
unsigned pointcount_tiny_d2 (unsigned long f[], int d, unsigned p);
unsigned pointcount_tiny_d3 (unsigned long f[], int d, unsigned p);
#endif