117 lines
3.2 KiB
C++
117 lines
3.2 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
|
|
*
|
|
* New! it is now possible to assign a polynomial as:-
|
|
*
|
|
* Variable x;
|
|
* Poly P=3*pow(x,3)+2*x+1 // P=3x^3+2x+1
|
|
*
|
|
* See Knuth The Art of Computer Programming Vol.2, Chapter 4.6
|
|
*/
|
|
|
|
#ifndef POLY_H
|
|
#define POLY_H
|
|
|
|
#include "zzn.h"
|
|
#include "variable.h"
|
|
|
|
#define FFT_BREAK_EVEN 16
|
|
|
|
class term
|
|
{
|
|
public:
|
|
ZZn an;
|
|
int n;
|
|
term *next;
|
|
};
|
|
|
|
class Poly
|
|
{
|
|
public:
|
|
term *start;
|
|
Poly() {start=NULL;}
|
|
Poly(const Poly&);
|
|
|
|
Poly(const ZZn&,int);
|
|
Poly(Variable &);
|
|
|
|
void clear();
|
|
term *addterm(const ZZn&,int,term *pos=NULL);
|
|
void multerm(const ZZn&,int);
|
|
ZZn F(const ZZn&) const;
|
|
ZZn coeff(int) const;
|
|
ZZn min() const;
|
|
|
|
Poly& operator=(const Poly&);
|
|
Poly& operator=(const ZZn&);
|
|
Poly& operator=(int);
|
|
Poly& operator+=(const Poly&);
|
|
Poly& operator-=(const Poly&);
|
|
Poly& operator+=(const ZZn& m) {addterm(m,0); return *this; }
|
|
Poly& operator-=(const ZZn& m) {addterm((-m),0); return *this; }
|
|
Poly& operator%=(const Poly&);
|
|
Poly& operator*=(const ZZn&);
|
|
Poly& operator/=(const ZZn&);
|
|
|
|
friend void setpolymod(const Poly&);
|
|
friend BOOL iszero(const Poly&);
|
|
friend BOOL isone(const Poly&);
|
|
friend Poly divxn(const Poly&,int);
|
|
friend Poly mulxn(const Poly&,int);
|
|
friend Poly modxn(const Poly&,int);
|
|
friend Poly invmodxn(const Poly&,int);
|
|
friend Poly reverse(const Poly&);
|
|
friend int degree(const Poly&);
|
|
friend Poly compose(const Poly&,const Poly&,const Poly&);
|
|
friend Poly compose(const Poly&,const Poly&);
|
|
friend Poly modmult(const Poly&,const Poly&,const Poly&);
|
|
friend void egcd(Poly result[], const Poly&,const Poly&);
|
|
friend Poly inverse(Poly&,const Poly&);
|
|
friend ZZn makemonic(Poly&);
|
|
friend Poly differentiate(const Poly&);
|
|
|
|
friend Poly reduce(const Poly&,const Poly&);
|
|
friend Poly operator*(const Poly&,const Poly&);
|
|
friend Poly operator%(const Poly&,const Poly&);
|
|
friend Poly operator/(const Poly&,const Poly&);
|
|
friend Poly operator-(const Poly&,const Poly&);
|
|
friend Poly operator+(const Poly&,const Poly&);
|
|
friend Poly operator-(const Poly&);
|
|
friend Poly divrem(Poly&,const Poly&);
|
|
|
|
friend Poly operator*(const ZZn& ,Variable);
|
|
friend Poly pow(Variable,int);
|
|
|
|
|
|
friend Poly operator-(const Poly&,const ZZn&);
|
|
friend Poly operator+(const Poly&,const ZZn&);
|
|
friend Poly operator*(const Poly&,const ZZn&);
|
|
friend Poly operator*(const ZZn&,const Poly&);
|
|
|
|
friend Poly operator/(const Poly&,const ZZn&);
|
|
|
|
friend Poly gcd(const Poly&,const Poly&);
|
|
friend Poly diff(const Poly&);
|
|
friend Poly pow(const Poly&,const Big&,const Poly&);
|
|
friend Poly pow(const Poly&,int);
|
|
|
|
friend BOOL operator==(const Poly&,const Poly&);
|
|
friend BOOL operator!=(const Poly&,const Poly&);
|
|
|
|
friend Poly factor(const Poly&,int);
|
|
friend ostream& operator<<(ostream&,const Poly&);
|
|
~Poly();
|
|
};
|
|
|
|
extern Poly pow(Variable,int);
|
|
|
|
|
|
#endif
|
|
|