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

78 lines
2.6 KiB
C++

/*
* C++ class to implement a polynomial type and to allow
* arithmetic on polynomials whose elements are from
* the finite field mod p.
*
* 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
*
* This type is automatically reduced
* wrt a polynomial Modulus.
*
* See Knuth The Art of Computer Programming Vol.2, Chapter 4.6
*/
#ifndef POLYMOD_H
#define POLYMOD_H
#include "poly.h"
extern Poly Modulus;
class PolyMod
{
public:
Poly p;
PolyMod() { }
PolyMod(const Poly& m) {p=m%Modulus; }
PolyMod(const PolyMod& m) {p=m.p; }
void clear() {p.clear();}
term* addterm(const ZZn& z,int i,term *pos=NULL) {return p.addterm(z,i,pos);}
void multerm(const ZZn& z,int i) {p.multerm(z,i);}
ZZn F(const ZZn& z) {return p.F(z); }
ZZn coeff(int i) const;
PolyMod& operator=(int m) {p=m; return *this;}
PolyMod& operator=(const PolyMod& m) {p=m.p; return *this;}
PolyMod& operator=(const Poly& m) {reduce(m,*this); return *this;}
PolyMod& operator+=(const PolyMod& m) {p=(p+m.p)%Modulus;return *this;}
PolyMod& operator-=(const PolyMod& m) {p=(p-m.p)%Modulus;return *this;}
PolyMod& operator+=(const ZZn& m) {addterm(m,0); return *this;}
PolyMod& operator-=(const ZZn& m) {addterm((-m),0); return *this;}
PolyMod& operator*=(const ZZn& z) {p*=z;return *this;}
PolyMod& operator/=(const ZZn& z) {p/=z;return *this;}
PolyMod& operator*=(const PolyMod&);
friend void setmod(const Poly&);
friend void reduce(const Poly&,PolyMod&);
friend BOOL iszero(const PolyMod&);
friend BOOL isone(const PolyMod&);
friend int degree(const PolyMod&);
friend PolyMod operator*(const PolyMod&,const PolyMod&);
friend PolyMod operator-(const PolyMod&,const PolyMod&);
friend PolyMod operator+(const PolyMod&,const PolyMod&);
friend PolyMod operator-(const PolyMod&,const ZZn&);
friend PolyMod operator+(const PolyMod&,const ZZn&);
friend BOOL operator==(const PolyMod&,const PolyMod&);
friend BOOL operator!=(const PolyMod&,const PolyMod&);
friend PolyMod operator*(const PolyMod&,const ZZn&);
friend PolyMod operator*(const ZZn&,const PolyMod&);
friend PolyMod compose(const PolyMod&,const PolyMod&);
friend PolyMod operator/(const PolyMod&,const ZZn&);
friend Poly gcd(const PolyMod&);
friend PolyMod pow(const PolyMod&,const Big&);
friend ostream& operator<<(ostream& ,const PolyMod&);
~PolyMod() {}
};
extern void setmod(const Poly&);
#endif