1 #ifndef _SMART_FRACTION_H_ 2 #define _SMART_FRACTION_H_ 5 #include "BPASFieldOfFractions.hpp" 6 #include "../../include/RationalFunction/rationalfunction_euclideanmethods.h" 7 #include "../../include/RationalNumberPolynomial/mrpolynomial.h" 11 #include "FactorRefinement.hpp" 18 template <
class Domain>
22 std::vector<Factor<Domain>> num;
23 std::vector<Factor<Domain>> den;
26 for (
int i = 0; i < A.size(); ++i)
28 Domain curr_Domain = A[i].first;
29 int curr_exp = A[i].second;
33 u->push_back(std::make_pair(temp_u,curr_exp));
34 C->push_back(std::make_pair(temp_C,curr_exp));
35 v->push_back(std::make_pair(temp_v,curr_exp));
40 std::vector<Factor<Domain>> left, mid, right;
41 FactorRefinement::MergeRefineTwoSeq<Domain>(A,B,&left,&mid,&right);
47 a = convertToDomain(A);
49 b = convertToDomain(B);
51 std::vector<Factor<Domain>> v;
52 v = extractFactors(a);
58 a = convertToDomain(A);
60 b = convertToDomain(B);
62 std::vector<Factor<Domain>> v;
63 v = extractFactors(a);
68 std::vector<Factor<Domain>> v1,v2,v3;
69 FactorRefinement::MergeRefineTwoSeq<Domain>(A,B,&v1,&v2,&v3);
72 v1.insert(v1.end(),v2.begin(),v2.end());
73 v1.insert(v1.end(),v3.begin(),v3.end());
77 std::vector<Factor<Domain>> v1,v2,v3;
78 FactorRefinement::MergeRefineTwoSeq<Domain>(A,B,&v1,&v2,&v3);
80 cout <<
"BPAS error: in SmartFraction<Domain>, not exact division" <<endl;
94 b->push_back(std::make_pair(one,1));
97 static std::vector<Factor<Domain>> smart_one(){
98 std::vector<Factor<Domain>> b;
101 b.push_back(std::make_pair(one,1));
111 if(b.size() == 1 && b[0].first.isOne()){
135 characteristic = c.characteristic;
147 characteristic = c.characteristic;
160 characteristic = c.characteristic;
170 num = extractFactors(a);
171 den = extractFactors(b);
183 characteristic = c.characteristic;
188 void setNumerator(
const std::vector<std::pair<Domain, int>>& b);
189 void setDenominator(
const std::vector<std::pair<Domain, int>>& b);
191 void set(
const std::vector<std::pair<Domain, int>>& a,
const std::vector<std::pair<Domain, int>>& b);
228 std::cerr <<
"SmartFraction<Domain>::squareFree NOT YET IMPLEMENTED" << std::endl;
233 std::cerr <<
"SmartFraction<Domain>::convertToExpressionTree NOT YET IMPLEMENTED" << std::endl;
239 void print(std::ostream& ostream)
const;
254 template <
class Domain>
255 std::vector<Factor<Domain>> extractFactors(
const Domain &p) {
256 std::vector<Factor<Domain>> ret;
259 ret.emplace_back(v[0].first * v.ringElement(), 1);
263 Domain v0 = v.ringElement();
265 ret.emplace_back(v[0].first * v0, v[0].second);
267 ret.emplace_back(v[0].first, v[0].second);
269 for (
int i = 1; i < v.size(); ++i){
270 if(!v[i].first.isOne()){
271 ret.emplace_back(v[i].first, v[i].second);
281 template <
class Domain>
287 for (
int i = 0; i < b.size(); ++i)
An abstract class defining the interface of a field of fractions.
Definition: BPASFieldOfFractions.hpp:16
void one()
Make *this ring element one.
SmartFraction< Domain > remainder(const SmartFraction< Domain > &b) const
Get the remainder of *this and b.
bool isZero() const
Determine if *this ring element is zero, that is the additive identity.
void zero()
Make *this ring element zero.
SmartFraction< Domain > & operator/=(const SmartFraction< Domain > &b)
Exact division assignment.
SmartFraction< Domain > inverse() const
Get the inverse of *this.
bool operator!=(const SmartFraction< Domain > &b) const
Inequality test,.
SmartFraction< Domain > & operator%=(const SmartFraction< Domain > &b)
Assign *this to be the remainder of *this and b.
bool isOne() const
Determine if *this ring element is one, that is the multiplication identity.
An ExpressionTree encompasses various forms of data that can be expressed generically as a binary tre...
Definition: ExpressionTree.hpp:17
SmartFraction< Domain > euclideanDivision(const SmartFraction< Domain > &b, SmartFraction< Domain > *q=NULL) const
Perform the eucldiean division of *this and b.
SmartFraction< Domain > operator%(const SmartFraction< Domain > &b) const
Get the remainder of *this and b;.
void canonicalize()
Canonicalize this fraction, reducing terms as needed.
SmartFraction< Domain > operator-() const
Negation.
SmartFraction< Domain > & operator^=(long long int e)
Exponentiation assignment.
SmartFraction< Domain > & operator-=(const SmartFraction< Domain > &b)
Subtraction assignment.
SmartFraction< Domain > extendedEuclidean(const SmartFraction< Domain > &b, SmartFraction< Domain > *s=NULL, SmartFraction< Domain > *t=NULL) const
Perofrm the extended euclidean division on *this and b.
Definition: SmartFraction.hpp:245
SmartFraction< Domain > quotient(const SmartFraction< Domain > &b) const
Get the quotient of *this and b.
Domain denominator() const
Get the fraction's denominator.
A simple data structure for encapsulating a collection of Factor elements.
Definition: Factors.hpp:95
Factors< SmartFraction< Domain > > squareFree() const
Compute squarefree factorization of *this.
Definition: SmartFraction.hpp:227
SmartFraction< Domain > gcd(const SmartFraction< Domain > &b) const
Get GCD of *this and other.
ExpressionTree convertToExpressionTree() const
Convert this to an expression tree.
Definition: SmartFraction.hpp:232
SmartFraction< Domain > operator^(long long int e) const
Exponentiation.
SmartFraction< Domain > operator+(const SmartFraction< Domain > &b) const
Addition.
bool operator==(const SmartFraction< Domain > &b) const
Equality test,.
SmartFraction< Domain > & operator+=(const SmartFraction< Domain > &b)
Addition assignment.
virtual Derived unitCanonical(Derived *u=NULL, Derived *v=NULL) const =0
Obtain the unit normal (a.k.a canonical associate) of an element.
A field of fractions templated by an arbitrary BPASGCDDomain making use of factor refinement...
Definition: SmartFraction.hpp:19
SmartFraction< Domain > unitCanonical(SmartFraction< Domain > *u=NULL, SmartFraction< Domain > *v=NULL) const
Obtain the unit normal (a.k.a canonical associate) of an element.
virtual mpz_class characteristic()
The characteristic of this ring class.
Definition: BPASRing.hpp:87
void print(std::ostream &ostream) const
Print the Ring element.
Domain numerator() const
Get the fraction's numerator.
SmartFraction< Domain > euclideanSize() const
Get the euclidean size of *this.
SmartFraction< Domain > operator/(const SmartFraction< Domain > &b) const
Exact division.
SmartFraction< Domain > operator*(const SmartFraction< Domain > &b) const
Multiplication.
SmartFraction< Domain > & operator*=(const SmartFraction< Domain > &b)
Multiplication assignment.