Macaulay2 Engine
Loading...
Searching...
No Matches
monomial.cpp
Go to the documentation of this file.
1// (c) 1995 Michael E. Stillman
2
3#include "monomial.hpp"
4#include "error.h"
5#include "monoid.hpp"
6
8{
9 // This routine is private because it leaves the object in
10 // an incorrect state... to be filled in by varpower routines.
11}
12
13 // SIGH... the front end reverses monomials. For commutative ones, this
14 // is not a problem. FOr non-commutative ones, one needs to reverse the
15 // varpower pairs before calling this function.
16 // Thus, if we are non-commutative, and
17 // vp = [7 0 1 2 1 0 2]
18 // then the corresponding monomial is
19 // a^2ca
20
21EngineMonomial::EngineMonomial(const std::vector<int>& vp) { varpower::copy(vp.data(), val); }
25
27{
29 if (error()) return nullptr;
30 return result;
31}
32
34{
35 if ((m->len % 2) != 0)
36 {
37 ERROR("Monomial expected an even number of elements");
38 return nullptr;
39 }
40 for (unsigned int i = 2; i < m->len; i += 2)
41 if (m->array[i - 2] <= m->array[i])
42 {
43 ERROR("Monomial expects variables in descending order");
44 return nullptr;
45 }
47 if (error()) return nullptr;
48 return result;
49}
50
52{
54 if (error()) return nullptr;
55 return result;
56}
57
58EngineMonomial* EngineMonomial::make(const std::vector<int>& vp)
59{
61 return result;
62}
63
65{
66 return varpower::computeHashValue(val.data());
67}
68
69bool EngineMonomial::is_one() const { return varpower::is_one(ints()); }
71{
72 if (this == &b) return true;
73 return varpower::is_equal(ints(), b.ints());
74}
75
76int EngineMonomial::compare(const Monoid *M, const EngineMonomial &b) const
77{
81 M->from_varpower(b.ints(), monom2);
82 int result = M->compare(monom1, monom2);
83 M->remove(monom1);
84 M->remove(monom2);
85 return result;
86}
87
88bool EngineMonomial::divides(const Monoid *M, const EngineMonomial &b) const
89{
93 M->from_varpower(b.ints(), monom2);
94 bool result = M->divides(monom1, monom2);
95 M->remove(monom1);
96 M->remove(monom2);
97 return result;
98}
99
102{
104 varpower::lcm(ints(), b.ints(), result->val);
105 return result;
106}
107
109{
111 varpower::gcd(ints(), b.ints(), result->val);
112 return result;
113}
114
116{
117 sa = new EngineMonomial;
118 sb = new EngineMonomial;
119 varpower::monsyz(ints(), b.ints(), sa->val, sb->val);
120}
121
123{
125 varpower::mult(ints(), b.ints(), result->val);
126 if (error()) return nullptr;
127 return result;
128}
129
136
143
145{
147 varpower::power(ints(), n, result->val);
148 if (error()) return nullptr;
149 return result;
150}
151
158
159// Local Variables:
160// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
161// indent-tabs-mode: nil
162// End:
std::vector< int > monom1
std::vector< int > monom2
EngineMonomial * operator*(const EngineMonomial &b) const
Definition monomial.cpp:122
int simple_degree() const
Definition monomial.cpp:100
EngineMonomial * erase(const EngineMonomial &b) const
Definition monomial.cpp:137
gc_vector< int > val
Definition monomial.hpp:64
bool divides(const Monoid *M, const EngineMonomial &b) const
Definition monomial.cpp:88
bool is_equal(const EngineMonomial &b) const
Definition monomial.cpp:70
int compare(const Monoid *M, const EngineMonomial &b) const
Definition monomial.cpp:76
EngineMonomial * power(int n) const
Definition monomial.cpp:144
bool is_one() const
Definition monomial.cpp:69
EngineMonomial * radical() const
Definition monomial.cpp:152
EngineMonomial * gcd(const EngineMonomial &b) const
Definition monomial.cpp:108
void monsyz(const EngineMonomial &b, EngineMonomial *&sa, EngineMonomial *&sb) const
Definition monomial.cpp:115
EngineMonomial * lcm(const EngineMonomial &b) const
Definition monomial.cpp:101
virtual unsigned int computeHashValue() const
Definition monomial.cpp:64
static EngineMonomial * make(int v, int e)
Definition monomial.cpp:26
EngineMonomial * operator/(const EngineMonomial &b) const
Definition monomial.cpp:130
static bool is_one(ConstExponents a)
static void radical(ConstExponents a, Vector &result)
static HashExponent computeHashValue(ConstExponents vp)
static void lcm(ConstExponents a, ConstExponents b, Vector &result)
static void mult(ConstExponents a, ConstExponents b, Vector &result)
static void from_arrayint(M2_arrayint m, Vector &result)
static void quotient(ConstExponents a, ConstExponents b, Vector &result)
static void gcd(ConstExponents a, ConstExponents b, Vector &result)
static Exponent simple_degree(ConstExponents m)
static void monsyz(ConstExponents a, ConstExponents b, Vector &sa, Vector &sb)
static void erase(ConstExponents a, ConstExponents b, Vector &result)
static void copy(ConstExponents vp, Vector &result)
static bool is_equal(ConstExponents a, ConstExponents b)
static void var(Exponent v, Exponent e, Vector &result)
static void power(ConstExponents a, Exponent n, Vector &result)
void from_varpower(const_varpower vp, monomial result) const
Definition monoid.cpp:728
monomial make_one() const
Definition monoid.cpp:455
int compare(int nslots, const_monomial m, const_monomial n) const
Definition monoid.hpp:226
void remove(monomial d) const
Definition monoid.cpp:462
bool divides(const_monomial m, const_monomial n) const
Definition monoid.cpp:493
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
int error()
Definition error.c:48
Engine error-reporting primitives: ERROR, INTERNAL_ERROR, error, error_message.
#define monomial
Definition gb-toric.cpp:11
const int ERROR
Definition m2-mem.cpp:55
VALGRIND_MAKE_MEM_DEFINED & result(result)
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
EngineMonomial — opaque single-monomial value type used at the engine boundary.