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

72 lines
2.4 KiB
C++

/*
* C++ class to implement a polynomial type and to allow
* arithmetic on polynomials whose elements are from
* the finite field GF(2^m).
*
* 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 POLY2MOD_H
#define POLY2MOD_H
#include "poly2.h"
extern Poly2 Modulus;
class Poly2Mod
{
public:
Poly2 p;
Poly2Mod() { }
Poly2Mod(const Poly2& m) {p=m%Modulus; }
Poly2Mod(const Poly2Mod& m) {p=m.p; }
void clear() {p.clear();}
term2* addterm(const GF2m& z,int i,term2 *pos=NULL) {return p.addterm(z,i,pos);}
void multerm(const GF2m& z,int i) {p.multerm(z,i);}
GF2m F(const GF2m& z) {return p.F(z); }
GF2m coeff(int i) const;
Poly2Mod& operator=(int m) {p=m; return *this;}
Poly2Mod& operator=(const Poly2Mod& m) {p=m.p; return *this;}
Poly2Mod& operator=(const Poly2& m) {reduce(m,*this); return *this;}
Poly2Mod& operator+=(const Poly2Mod& m) {p=(p+m.p)%Modulus;return *this;}
Poly2Mod& operator+=(const GF2m& z) {addterm(z,0); return *this; }
Poly2Mod& operator*=(const GF2m& z) {p*=z;return *this;}
Poly2Mod& operator/=(const GF2m& z) {p/=z;return *this;}
Poly2Mod& operator*=(const Poly2Mod&);
friend void setmod(const Poly2&);
friend void reduce(const Poly2&,Poly2Mod&);
friend BOOL iszero(const Poly2Mod&);
friend BOOL isone(const Poly2Mod&);
friend int degree(const Poly2Mod&);
friend Poly2Mod operator*(const Poly2Mod&,const Poly2Mod&);
friend Poly2Mod operator+(const Poly2Mod&,const Poly2Mod&);
friend Poly2Mod operator+(const Poly2Mod&,const GF2m&);
friend Poly2Mod operator*(const Poly2Mod&,const GF2m&);
friend Poly2Mod operator*(const GF2m&,const Poly2Mod&);
friend Poly2Mod compose(const Poly2Mod&,const Poly2Mod&);
friend Poly2Mod operator/(const Poly2Mod&,const GF2m&);
friend Poly2 gcd(const Poly2Mod&);
friend Poly2Mod inverse(const Poly2Mod&);
friend Poly2Mod pow(const Poly2Mod&,const Big&);
friend ostream& operator<<(ostream&,const Poly2Mod&);
~Poly2Mod() {}
};
extern void setmod(const Poly2&);
#endif