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

107 lines
2.9 KiB
C++

/*
* C++ class to implement a polynomial type and to allow
* arithmetic on polynomials whose elements are from
* the finite field 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
*
* See Knuth The Art of Computer Programming Vol.2, Chapter 4.6
*/
#ifndef POLY2_H
#define POLY2_H
#include "gf2m.h"
#include "variable.h"
#define KARAT_BREAK_EVEN 8
class term2
{
public:
GF2m an;
int n;
term2 *next;
};
class Poly2
{
public:
term2 *start;
Poly2() {start=NULL;}
Poly2(const Poly2&);
Poly2(const GF2m&,int);
Poly2(Variable &);
void clear();
term2 *addterm(const GF2m&,int,term2 *pos=NULL);
void multerm(const GF2m&,int);
GF2m F(const GF2m&) const;
GF2m coeff(int) const;
GF2m min() const;
Poly2& operator=(const Poly2&);
Poly2& operator=(const GF2m&);
Poly2& operator=(int);
Poly2& operator+=(const Poly2&);
Poly2& operator+=(const GF2m& m) {addterm(m,0); return *this; }
Poly2& operator%=(const Poly2&);
Poly2& operator*=(const GF2m&);
Poly2& operator/=(const GF2m&);
friend BOOL iszero(const Poly2&);
friend BOOL isone(const Poly2&);
friend Poly2 divxn(const Poly2&,int);
friend Poly2 mulxn(const Poly2&,int);
friend Poly2 modxn(const Poly2&,int);
friend Poly2 invmodxn(const Poly2&,int);
friend Poly2 reverse(const Poly2&);
friend int degree(const Poly2&);
friend Poly2 differentiate(const Poly2&);
friend GF2m resultant(const Poly2&,const Poly2&);
friend Poly2 operator*(const Poly2&,const Poly2&);
friend Poly2 operator%(const Poly2&,const Poly2&);
friend Poly2 operator/(const Poly2&,const Poly2&);
friend Poly2 operator+(const Poly2&,const Poly2&);
friend Poly2 operator+(const Poly2&,const GF2m&);
friend Poly2 operator-(const Poly2&,const Poly2&);
friend Poly2 operator-(const Poly2&,const GF2m&);
friend Poly2 operator-(const Poly2&);
friend void egcd(Poly2 result[], const Poly2&,const Poly2&);
friend Poly2 operator*(const Poly2&,const GF2m&);
friend Poly2 operator*(const GF2m&,const Poly2&);
friend Poly2 operator/(const Poly2&,const GF2m&);
friend Poly2 operator*(const GF2m&,Variable);
friend Poly2 pow2(Variable,int);
friend Poly2 fulldiv(Poly2&,const Poly2&);
friend Poly2 gcd(const Poly2&,const Poly2&);
friend Poly2 inverse(const Poly2&,const Poly2&);
friend void swap(Poly2 &,Poly2 &);
friend void makemonic(Poly2&);
friend Poly2 pow(const Poly2&,const Big&,const Poly2&);
friend Poly2 pow(const Poly2&,int);
friend Poly2 compose(const Poly2&,const Poly2&);
friend BOOL operator==(const Poly2&,const Poly2&);
friend BOOL operator!=(const Poly2&,const Poly2&);
friend ostream& operator<<(ostream&,const Poly2&);
~Poly2();
};
extern Poly2 operator*(const GF2m&,Variable);
extern Poly2 pow2(Variable,int);
#endif