Macaulay2 Engine
Loading...
Searching...
No Matches
util-polyring-creation.cpp
Go to the documentation of this file.
1
27
29
30const Monoid* degreeMonoid(const std::vector<std::string>& names)
31{
32 std::vector<int> wts;
33 for (int i=0; i<names.size(); i++)
34 wts.push_back(-1);
36 ({
38 MonomialOrderings::GroupLex(names.size()),
40 });
41
42 return Monoid::create(mo,
43 IM2_Ring_trivial_polyring()->cast_to_PolynomialRing(),
44 names,
45 {},
46 {});
47}
48
49const PolynomialRing* degreeRing(const std::vector<std::string>& names)
50{
51 auto degM = degreeMonoid(names);
52 if (degM == nullptr) return nullptr;
53 return PolyRing::create(globalZZ, degM);
54}
55const PolynomialRing* degreeRing(int ndegrees)
56{
57 assert(ndegrees == 1);
58 return degreeRing({"T"});
59}
60
62 const std::vector<std::string>& names,
63 MonomialOrdering* monorder)
64{
65 // degrees are all set to 1. (degree ring has one variable)
66 // heft is 1.
67
68 // Now create the monomial order. This one is a pain in the butt!
69 std::vector<int> degs;
70 for (int i=0; i<names.size(); i++) degs.push_back(1);
71 std::vector<int> heft {1};
72
73 const Monoid* M = Monoid::create(
74 monorder,
75 degreeRing(1),
76 names,
77 degs,
78 heft
79 );
80 if (M == nullptr) return nullptr; // an error should have been constructed
81 return PolyRing::create(kk, M);
82}
83
84const PolynomialRing* simplePolynomialRing(int p, const std::vector<std::string>& names)
85{
86 // if p is 0, use QQ.
87 // degrees are all set to 1. (degree ring has one variable)
88 // heft is 1.
89 // monomial order is grevlex.
90
91 const Ring *kk = (p > 0 ? rawARingZZpFlint(p) : rawARingQQFlint());
92 if (kk == nullptr) return nullptr; // one of these routines would have made an error.
93
95 ({
96 MonomialOrderings::GRevLex(names.size()),
98 });
99
100 return simplePolynomialRing(kk, names, monorder);
101}
102
103
104// Local Variables:
105// indent-tabs-mode: nil
106// End:
static Monoid * create(const MonomialOrdering *mo, const PolynomialRing *DR, const std::vector< std::string > &names, const std::vector< int > &degs, const std::vector< int > &hefts)
Definition monoid.cpp:61
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
static MonomialOrdering * Weights(const std::vector< int > &wts)
static MonomialOrdering * PositionUp()
static MonomialOrdering * GRevLex(int nvars)
static MonomialOrdering * GroupLex(int nvars)
static MonomialOrdering * join(const std::vector< MonomialOrdering * > &M)
static const PolyRing * create(const Ring *K, const Monoid *M)
Definition poly.cpp:101
Abstract base for the engine's polynomial-ring hierarchy.
Definition polyring.hpp:96
xxx xxx xxx
Definition ring.hpp:102
RingZZ * globalZZ
Definition relem.cpp:13
int p
const Ring * rawARingQQFlint()
Definition aring.cpp:37
const Ring * rawARingZZpFlint(unsigned long p)
Definition aring.cpp:51
const Ring * IM2_Ring_trivial_polyring()
Definition ring.cpp:114
Front-end-side description of a monomial ordering as a list of mon_part blocks.
const Monoid * degreeMonoid(const std::vector< std::string > &names)
const PolynomialRing * degreeRing(const std::vector< std::string > &names)
const PolynomialRing * simplePolynomialRing(const Ring *kk, const std::vector< std::string > &names, MonomialOrdering *monorder)
One-line helpers for building degree monoids and polynomial rings inside gtest cases.