78 lines
2.6 KiB
C++
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
|
|
|