KGC_TEST/KGCAPP/3rdparty/miracl/source/curve/ps_zzn.h

88 lines
2.2 KiB
C++

/*
* C++ class to implement a power series type and to allow
* arithmetic on it. COefficinets are of type ZZn
*
* WARNING: This class has been cobbled together for a specific use with
* the MIRACL library. It is not complete, and may not work in other
* applications
*
* See Knuth The Art of Computer Programming Vol.2, Chapter 4.7
*/
#ifndef PS_ZZN_H
#define PS_ZZN_H
#include "zzn.h"
#define FFT_BREAK_EVEN 16
extern int psN;
// F(x) = (c0+c1*x^(offset+pwr)+c2.x^(offset+2*pwr)+c3.x^(offset+3*pwr) ..)
class term_ps_zzn
{
public:
ZZn an;
int n;
term_ps_zzn *next;
};
class Ps_ZZn
{
public:
term_ps_zzn *start;
int pwr;
int offset;
Ps_ZZn() {start=NULL; offset=0; pwr=1; }
Ps_ZZn(const Ps_ZZn&);
void clear();
void compress(int);
void decompress(int);
void norm();
void pad();
int max();
BOOL one_term() const;
BOOL IsInt() const;
void divxn(int n) {offset+=n;}
void mulxn(int n) {offset-=n;}
int first() {return (-offset);}
term_ps_zzn *addterm(const ZZn&,int,term_ps_zzn *pos=NULL);
void multerm(const ZZn&,int);
ZZn coeff(int) const;
ZZn cf(int) const;
Ps_ZZn& operator*=(Ps_ZZn&);
Ps_ZZn& operator=(const Ps_ZZn&);
Ps_ZZn& operator=(int);
Ps_ZZn& operator+=(const Ps_ZZn&);
Ps_ZZn& operator-=(const Ps_ZZn&);
Ps_ZZn& operator*=(const ZZn&);
Ps_ZZn& operator/=(const ZZn&);
Ps_ZZn& operator/=(int);
friend Ps_ZZn eta();
friend Ps_ZZn operator*(Ps_ZZn&,Ps_ZZn&);
friend Ps_ZZn operator%(const Ps_ZZn&,const Ps_ZZn&);
friend Ps_ZZn operator/(Ps_ZZn&,Ps_ZZn&);
friend Ps_ZZn operator-(const Ps_ZZn&,const Ps_ZZn&);
friend Ps_ZZn operator-(const Ps_ZZn&);
friend Ps_ZZn operator+(const Ps_ZZn&,const Ps_ZZn&);
friend Ps_ZZn operator*(const Ps_ZZn&,const ZZn&);
friend Ps_ZZn operator*(const ZZn&,const Ps_ZZn&);
friend Ps_ZZn operator/(const ZZn&,const Ps_ZZn&);
friend Ps_ZZn operator/(const Ps_ZZn&,const ZZn&);
friend Ps_ZZn operator/(const Ps_ZZn&,int);
friend Ps_ZZn pow(Ps_ZZn&,int);
friend Ps_ZZn power(const Ps_ZZn&,int);
friend ostream& operator<<(ostream&,const Ps_ZZn&);
~Ps_ZZn();
};
extern Ps_ZZn eta();
#endif