Macaulay2 Engine
Loading...
Searching...
No Matches
skewpoly.cpp
Go to the documentation of this file.
1// Copyright 2003 Michael E. Stillman
2
3#include "skewpoly.hpp"
4#include "gbring.hpp"
5#include "skew.hpp"
6
9{
10 is_skew_ = true;
11 skew_ = SkewMultiplication(nvars_, skewvars->len, skewvars->array);
12 return true;
13}
14
16 const Monoid *M,
17 M2_arrayint skewvars)
18{
20
21 result->initialize_poly_ring(K, M);
22 if (!result->initialize_skew(skewvars)) return nullptr;
23 result->gb_ring_ = GBRing::create_SkewPolynomialRing(K, M, result->skew_);
24 return result;
25}
26
28{
29 o << "SkewPolynomialRing(";
30 K_->text_out(o);
31 M_->text_out(o);
32 o << ")";
33}
34
35static int sign4[4] = {1, 1, -1, -1};
36
38{
39 Nterm head;
40 Nterm *inresult = &head;
41
43
44 for (Nterm& s : f)
45 {
46 M_->to_expvector(s.monom, EXP);
47 int deg = skew_.skew_degree(EXP);
48 // sign is (-1)^ (binomial(deg,2))
49 // deg = 0: sign is 1
50 // deg = 1: sign is 1
51 // deg = 2: sign is -1
52 // deg = 3: sign is -1
53 // deg = 4: sign is 1, and so on
54 int mod4 = deg % 4;
55 int sign = sign4[mod4];
56 Nterm *t = new_term();
57 t->next = nullptr;
58 t->coeff = (sign == 1 ? s.coeff : K_->negate(s.coeff));
59 M_->copy(s.monom, t->monom);
60 inresult->next = t;
61 inresult = inresult->next;
62 }
63 inresult->next = nullptr;
64 return head.next;
65}
66
68 const ring_elem c,
69 const int *m) const
70// Computes c*m*f, BUT NOT doing normal form wrt a quotient ideal..
71{
72 Nterm head;
73 Nterm *inresult = &head;
74
77 M_->to_expvector(m, EXP1);
78
79 for (Nterm& s : f)
80 {
81 M_->to_expvector(s.monom, EXP2);
82 int sign = skew_.mult_sign(EXP1, EXP2);
83 if (sign == 0) continue;
84
85 Nterm *t = new_term();
86 t->next = nullptr;
87 t->coeff = K_->mult(c, s.coeff);
88 if (sign < 0) K_->negate_to(t->coeff);
89
90 M_->mult(m, s.monom, t->monom);
91 inresult->next = t;
92 inresult = inresult->next;
93 }
94 inresult->next = nullptr;
95 return head.next;
96}
97
98ring_elem SkewPolynomialRing::power(const ring_elem f, mpz_srcptr n) const
99{
100 std::pair<bool, int> n1 = RingZZ::get_si(n);
101 if (n1.first)
102 return power(f, n1.second);
103 else
104 throw exc::engine_error("exponent too large");
105}
106
108{
109 return Ring::power(f, n);
110}
111
112// Local Variables:
113// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
114// indent-tabs-mode: nil
115// End:
exponents::Exponents exponents_t
static GBRing * create_SkewPolynomialRing(const Ring *K0, const Monoid *M0, SkewMultiplication skew0)
Definition gbring.cpp:147
Engine-side commutative monomial monoid: variable names, ordering, multidegree machinery,...
Definition monoid.hpp:89
Nterm * new_term() const
Definition poly.cpp:146
SkewMultiplication skew_
Definition polyring.hpp:104
const Ring * K_
Definition polyring.hpp:123
const Monoid * M_
Definition polyring.hpp:124
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
Definition ring.cpp:109
xxx xxx xxx
Definition ring.hpp:102
static std::pair< bool, int > get_si(mpz_srcptr n)
Definition ZZ.cpp:46
Sign-rule helper used by every ring that has a skew-commutative subset of variables (exterior factor,...
Definition skew.hpp:54
virtual ring_elem power(const ring_elem f, mpz_srcptr n) const
Exponentiation. This is the default function, if a class doesn't define this.
Definition skewpoly.cpp:98
bool initialize_skew(M2_arrayint skewvars)
Definition skewpoly.cpp:8
void text_out(buffer &o) const
Definition skewpoly.cpp:27
virtual ~SkewPolynomialRing()
Definition skewpoly.cpp:7
static SkewPolynomialRing * create(const Ring *K, const Monoid *M, M2_arrayint skewvars)
Definition skewpoly.cpp:15
ring_elem antipode(const ring_elem f) const
Definition skewpoly.cpp:37
virtual ring_elem mult_by_term(const ring_elem f, const ring_elem c, const int *m) const
Definition skewpoly.cpp:67
GBRing and gbvector — the GB-tuned polynomial-ring view used by classical Buchberger code.
void size_t s
Definition m2-mem.cpp:271
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
SkewMultiplication — configuration object naming the skew-commuting variables of a ring.
static int sign4[4]
Definition skewpoly.cpp:35
SkewPolynomialRing — polynomial ring with a designated set of anticommuting variables.
Nterm * next
Definition ringelem.hpp:157
ring_elem coeff
Definition ringelem.hpp:158
int monom[1]
Definition ringelem.hpp:160
Singly linked-list node carrying one term of a polynomial-ring element.
Definition ringelem.hpp:156