1 #ifndef _SMALLMMPOLYNOMIAL_H_ 2 #define _SMALLMMPOLYNOMIAL_H_ 4 #include "../polynomial.h" 5 #include "../FFT/src/modpn.h" 6 #include "../FFT/src/general_routine.h" 7 #include "../FFT/src/basic_routine.h" 8 #include "../FFT/src/DDMP.h" 17 #define SDMPBASESIZE 1024 23 public BPASGCDDomain<SmallPrimeFieldDistributedDenseMultivariateModularPolynomial> {
41 static RingProperties properties;
88 for (
int i = 0; i < var; ++i) {
91 acc[i+1] = acc[i] * (degs[i] + 1);
93 n = acc[var-1] * (degs[var-1] + 1);
98 for (
int i = 1; i <= var; ++i) {
99 std::ostringstream convert;
100 convert << var - i + 1;
102 names[i] += convert.str();
121 coefs =
new sfixn[2];
133 std::copy(b.degs, b.degs+var, degs);
135 std::copy(b.acc, b.acc+var, acc);
136 coefs =
new sfixn[n];
137 std::copy(b.coefs, b.coefs+n, coefs);
138 names =
new Symbol[var+1];
139 std::copy(b.names, b.names+var+1, names);
168 std::copy(b.degs, b.degs+var, degs);
170 std::copy(b.acc, b.acc+var, acc);
172 coefs =
new sfixn[n];
173 std::copy(b.coefs, b.coefs+n, coefs);
174 names =
new Symbol[var+1];
175 std::copy(b.names, b.names+var+1, names);
191 for (
int i = 0; i < n; ++i) {
213 for (
int i = 1; i < n; ++i) {
217 return (coefs[0] == 1);
227 for (
int i = 1; i < n; ++i)
237 for (
int i = 1; i < n; ++i) {
241 return (coefs[0] == p - 1);
251 for (
int i = 1; i < n; ++i)
261 for (
int i = 1; i < n; ++i) {
265 if (coefs[0] < (p >> 1)) {
return 1; }
272 mpz_class mpzLead(leadCoef);
273 mpz_class mpzPrime(p);
277 if (!mpz_invert(temp, mpzLead.get_mpz_t(), mpzPrime.get_mpz_t()))
279 sfixn leadInv = mpz_get_si(temp);
298 return variables().size();
315 for (
int i = 0; i < n; ++i)
316 if (coefs[i] != 0) { k++; }
333 std::cerr <<
"SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::degree() NOT YET IMPLEMENTED" << std::endl;
345 for (
int i = 1; i <= var; ++i) {
353 for (
int i = 0; i < n; ++i) {
354 int e = (i / acc[k]) % (degs[k] + 1);
355 if (coefs[i] != 0 && e > d)
368 for (
int i = n-1; i > -1; --i) {
375 inline sfixn trailingCoefficient()
const {
376 for (
int i = 0; i < n; ++i) {
384 inline bool isConstantTermZero()
const {
385 return (coefs[0] == 0);
396 for (
int i = var-1, j = 0; i > -1 && j < v; --i, ++j) {
401 for (
int i = v-var-1; i > -1; --i)
402 if (d[i]) {
return 0; }
406 inline sfixn
coefficient(
const std::vector<int>& v)
const {
419 std::cout <<
"BPAS: error, SFDDMMP(" << var <<
"), but trying to setCoefficient with " << v <<
" variables." << std::endl;
423 for (
int i = var-1, j = 0; i > -1 && j < v; --i, ++j) {
427 std::cout <<
"BPAS: error, the degree of " << names[i+1] <<
" in SFDDMMP is " << degs[i] <<
"." << std::endl;
434 inline void setCoefficient(
const std::vector<int>& v,
const sfixn& val) {
445 if (k >= n || k < 0) {
446 std::cout <<
"BPAS: error, trying to access a non-exist coefficient in SFDDMMP<Field>." << std::endl;
458 std::vector<Symbol> xs;
459 for (
int i = var; i > 0; --i)
460 xs.push_back(names[i]);
472 std::cerr <<
"BPAS ERROR: SDMP shrinking and expanding polynomial ring NOT YET IMPLEMENTED" << std::endl;
476 for (
int i = var, j = 0; i > 0 && j < ns; --i, ++j)
480 inline std::vector<Symbol> variables()
const {
481 std::cerr <<
"BPAS ERROR: SDMP::variables() NOT YET IMPLEMENTED" << std::endl;
557 return !(*
this == b);
695 std::cerr <<
"BPAS ERROR: SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::opeartor^ NOT YET IMPLEMENTED" << std::endl;
710 std::cerr <<
"BPAS ERROR: SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::operator/(sfixn) NOT YET IMPLEMENTED" << std::endl;
718 sfixn content()
const {
719 std::cerr <<
"BPAS ERROR: SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::content NOT YET IMPLEMENTED" << std::endl;
724 std::cerr <<
"BPAS ERROR: SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::primitivePart NOT YET IMPLEMENTED" << std::endl;
728 void print(std::ostream& out)
const;
737 std::cerr <<
"SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::operator/ NOT YET IMPLEMENTED" << std::endl;
743 std::cerr <<
"SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::operator/= NOT YET IMPLEMENTED" << std::endl;
749 std::cerr <<
"SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::gcd NOT YET IMPLEMENTED" << std::endl;
758 std::cerr <<
"SmallPrimeFieldDistributedDenseMultivariateModularPolynomial::squareFree NOT YET IMPLEMENTED" << std::endl;
760 std::vector<SmallPrimeFieldDistributedDenseMultivariateModularPolynomial> ret;
761 ret.push_back(*
this);
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial & operator-=(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b)
Overload operator -=.
Definition: sdmpolynomial.h:610
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial & operator+=(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b)
Overload operator +=.
Definition: sdmpolynomial.h:572
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial derivative(const Symbol &s) const
Compute derivative.
Definition: sdmpolynomial.h:518
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial evaluate(int, const Symbol *syms, const sfixn *xs) const
Evaluate f(x)
Definition: sdmpolynomial.h:528
void print(std::ostream &out) const
Print the Ring element.
A multivariate polynomial with coefficients in a small prime field using a dense representation.
Definition: sdmpolynomial.h:22
An abstract class defining the interface of a GCD domain.
Definition: BPASGCDDomain.hpp:14
bool isOne() const
Is polynomial 1.
Definition: sdmpolynomial.h:212
sfixn coefficient(int v, const int *d) const
Get a coefficient.
Definition: sdmpolynomial.h:394
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial(Symbol x, sfixn m)
Construct with a variable name such that f(x) = x;.
Definition: sdmpolynomial.h:113
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial operator*(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b) const
Overload operator *.
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b)
Copy constructor.
Definition: sdmpolynomial.h:131
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial & operator*=(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b)
Overload operator *=.
Definition: sdmpolynomial.h:662
Factors< SmallPrimeFieldDistributedDenseMultivariateModularPolynomial > squareFree() const
Compute squarefree factorization of *this.
Definition: sdmpolynomial.h:757
An ExpressionTree encompasses various forms of data that can be expressed generically as a binary tre...
Definition: ExpressionTree.hpp:17
void setRingVariables(const std::vector< Symbol > &xs)
Set variable names.
Definition: sdmpolynomial.h:469
~SmallPrimeFieldDistributedDenseMultivariateModularPolynomial()
Deconstructor.
Definition: sdmpolynomial.h:147
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial operator+(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b) const
Overload operator +.
ExpressionTree convertToExpressionTree() const
Convert *this to an expression tree.
void negate()
Negate, f(-x)
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial unitCanonical(SmallPrimeFieldDistributedDenseMultivariateModularPolynomial *u=NULL, SmallPrimeFieldDistributedDenseMultivariateModularPolynomial *v=NULL) const
Obtain the unit normal (a.k.a canonical associate) of an element.
Definition: sdmpolynomial.h:269
int numberOfRingVariables() const
Get the number of variables in this polynomial ring.
Definition: sdmpolynomial.h:304
void zero()
Zero polynomial.
Definition: sdmpolynomial.h:203
void setCoefficient(int v, const int *d, const sfixn &val)
Set a coefficient.
Definition: sdmpolynomial.h:417
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial(int v, int *ds, sfixn m)
Constructor with number of variables and terms.
Definition: sdmpolynomial.h:84
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial derivative(const Symbol &s, int k) const
Return k-th derivative.
Definition: sdmpolynomial.h:508
void differentiate(const Symbol &s)
Convert current object to its derivative.
Definition: sdmpolynomial.h:498
An abstract class defining the interface of a multivariate polynomial over an arbitrary BPASRing...
Definition: polynomial.h:117
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial & operator=(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b)
Overload operator =.
Definition: sdmpolynomial.h:159
bool operator==(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b) const
Overload operator ==.
void differentiate(const Symbol &s, int k)
Convert current object to its k-th derivative.
Definition: sdmpolynomial.h:491
A simple data structure for encapsulating a collection of Factor elements.
Definition: Factors.hpp:95
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial()
Constructor using a default prime.
Definition: sdmpolynomial.h:49
bool isZero() const
Is a zero polynomial.
Definition: sdmpolynomial.h:190
Integer numberOfTerms() const
Get the number of non-zero terms.
Definition: sdmpolynomial.h:313
sfixn leadingCoefficient() const
Get the leading coefficient.
Definition: sdmpolynomial.h:367
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial evaluate(const std::vector< Symbol > &syms, const std::vector< sfixn > &xs) const
Evaluate f(x)
Definition: sdmpolynomial.h:539
An arbitrary-precision Integer.
Definition: Integer.hpp:22
bool isNegativeOne() const
Is polynomial -1.
Definition: sdmpolynomial.h:236
std::vector< Symbol > ringVariables() const
Get variable names.
Definition: sdmpolynomial.h:457
bool operator!=(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &b) const
Overload operator !=.
Definition: sdmpolynomial.h:556
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial(sfixn m)
Constructor with the field.
Definition: sdmpolynomial.h:66
An encapsulation of a mathematical symbol.
Definition: Symbol.hpp:23
void negativeOne()
Set polynomial to -1.
Definition: sdmpolynomial.h:249
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial & operator^=(long long int e)
Overload operator ^ for exponentiation.
Definition: sdmpolynomial.h:704
virtual mpz_class characteristic()
The characteristic of this ring class.
Definition: BPASRing.hpp:87
Integer degree() const
Total degree.
Definition: sdmpolynomial.h:332
int numberOfVariables() const
Get the number of variables.
Definition: sdmpolynomial.h:297
int isConstant() const
Is a constant.
Definition: sdmpolynomial.h:260
void setCoefficient(int k, const sfixn &val)
Set a coefficient.
Definition: sdmpolynomial.h:444
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial operator/(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &p) const
Exact division.
Definition: sdmpolynomial.h:736
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial & operator/=(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &p)
Exact division assignment.
Definition: sdmpolynomial.h:742
int size() const
Get the size of the polynomial.
Definition: sdmpolynomial.h:325
Integer degree(const Symbol &x) const
Get a partial degree of variable x.
Definition: sdmpolynomial.h:343
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial operator^(long long int e) const
Overload operator ^ for exponentiation.
Definition: sdmpolynomial.h:693
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial operator-() const
Overload operator -, negate.
SmallPrimeFieldDistributedDenseMultivariateModularPolynomial gcd(const SmallPrimeFieldDistributedDenseMultivariateModularPolynomial &p) const
Get GCD of *this and other.
Definition: sdmpolynomial.h:748
void one()
Set polynomial to 1.
Definition: sdmpolynomial.h:225