ACEC/polynomial.h
2022-10-23 17:07:24 +08:00

248 lines
4.8 KiB
C++

/*------------------------------------------------------------------------*/
/*! \file polynomial.h
\brief contains arithmetic operations for polynomials
Part of AMulet2.1 : AIG Multiplier Verification Tool.
Copyright(C) 2020, 2021 Daniela Kaufmann, Johannes Kepler University Linz
*/
/*------------------------------------------------------------------------*/
#ifndef AMULET2_SRC_POLYNOMIAL_H_
#define AMULET2_SRC_POLYNOMIAL_H_
/*------------------------------------------------------------------------*/
#include <list>
#include <deque>
#include <cstring>
#include "monomial.h"
/*------------------------------------------------------------------------*/
/** \class Polynomial
This class is used to polynomials.
*/
class Polynomial {
int idx; // /< index as used in pac proofs
int level = 1; // /< level of polynomials needed for certificates
Monomial ** mon; // /< sorted deque of monomials
public:
size_t num_mon = 0;
/** Constructor */
Polynomial();
Polynomial (Monomial ** m, size_t len);
/** Getter for member idx
@return integer
*/
int get_idx() const {return idx;}
/**
Setter for idx
@param idx_ integer
*/
void set_idx(int idx_) {idx = idx_;}
/** Getter for member level
@return integer
*/
int get_level() const {return level;}
/**
Setter for level
@param level_ integer
*/
void set_level(int level_) {level = level_;}
Monomial * get_mon(size_t i) const {
if(i < num_mon) return mon[i];
else return 0;
}
size_t size() const { return num_mon;}
/** Returns the leading term
@return Term*
*/
Term * get_lt() const {return mon[0]->get_term();}
/**
Copy routine
@return A hard copy of the current polynomial
*/
Polynomial * copy() const;
/**
Printing routine
@param file Output file
@param end if true we print trailing ";"
*/
void print(FILE * file, bool end = 1) const;
/** Destructor */
~Polynomial();
/**
Returns whether the polynomial is the constant zero polynomial
@return bool
*/
bool is_constant_zero_poly() const;
/**
Returns whether the polynomial is the constant one polynomial
@return bool
*/
bool is_constant_one_poly() const;
/**
Returns the size of the smallest term
@return integer
*/
int min_term_size() const;
};
/*------------------------------------------------------------------------*/
// Polynomials are generated using a sorted array "mstack"
/**
Enlarges the allocated size of mstack
*/
void enlarge_mstack();
/**
Sets the number of elements in the stack to 0
*/
void clear_mstack();
/**
Deallocates mstack
*/
void deallocate_mstack();
/**
Checks whether mstack is empty
@return true if mstack is empty
*/
bool mstack_is_empty();
/**
Pushes a monomial to the end of the stack
@param t monomial to be added to the mstack
*/
void push_mstack_end(Monomial *t);
/**
Pushes a monomial to the stack such that mstack remains sorted
@param t monomial to be added to the mstack
*/
void push_mstack(Monomial *t);
/**
Generates a polynomial from mstack and clears mstack
@return Polynomial*
*/
Polynomial * build_poly();
/*------------------------------------------------------------------------*/
/**
Add two polynomials p1+p2
@param p1 Polynomial*
@param p2 Polynomial*
@return Polynomial*, sum of p1+p2
*/
Polynomial * add_poly(const Polynomial *p1, const Polynomial *p2);
/**
Multiplies two polynomials p1*p2
@param p1 Polynomial*
@param p2 Polynomial*
@return Polynomial*, product of p1*p2
*/
Polynomial * multiply_poly(const Polynomial *p1, const Polynomial *p2);
/**
Multiplies a polynomial p1 with a constant c
@param p1: Polynomial*
@param c: mpz_t object
@return Polynomial*, product of c*p1
*/
Polynomial * multiply_poly_with_constant(const Polynomial *p1, mpz_t c);
/**
Returns the quotient of dividing a polynomial p1 by a term t
@param p1 Polynomial*
@param t Term *
@return Polynomial defining the quotient of p1/t
*/
Polynomial * divide_by_term(const Polynomial * p1, const Term * t);
/*---------------------------------------------------------------------------*/
// / gmp for 1
extern mpz_t one;
// / gmp for -1
extern mpz_t minus_one;
// / gmp for 2
extern mpz_t two;
// / gmp for -2
extern mpz_t minus_two;
// / gmp for 4
extern mpz_t four;
// / gmp for -4
extern mpz_t minus_four;
// / gmp for 2
extern mpz_t base;
// / gmp for 2^NN
extern mpz_t mod_coeff;
/*---------------------------------------------------------------------------*/
/**
Initializes all global gmp objects
@param exp unsigned exponent for mod coeff
*/
void init_mpz(unsigned exp);
/**
Clears all globally allocated gmp objects
*/
void clear_mpz();
#endif // AMULET2_SRC_POLYNOMIAL_H_