Macaulay2 Engine
Loading...
Searching...
No Matches
skew.cpp
Go to the documentation of this file.
1#include "skew.hpp"
2
3#include "monoid.hpp"
4
9
10SkewMultiplication::SkewMultiplication(int nvars, int nskew, int *skew_list)
11 : _n_vars(nvars), _n_skew(nskew), _skew_list(skew_list), _skew_exp(nullptr)
12{
13 _skew_exp = newarray_atomic_clear(bool, nvars);
14 for (int v = 0; v < nskew; v++) _skew_exp[skew_list[v]] = true;
15
17}
18
19static int sort_sign(int a, int *v1, int b, int *v2)
20{
21 if (a == 0 || b == 0) return 1;
22 int result = 0; // number of sign switches
23 a--;
24 b--;
25 for (;;)
26 {
27 if (v1[a] < v2[b])
28 {
29 b--;
30 if (b < 0)
31 {
32 return (result % 2 == 0 ? 1 : -1);
33 }
34 }
35 else if (v1[a] > v2[b])
36 {
37 result += b + 1;
38 a--;
39 if (a < 0)
40 {
41 return (result % 2 == 0 ? 1 : -1);
42 }
43 }
44 else
45 return 0;
46 }
47}
48
49int SkewMultiplication::skew_degree(const int *exp) const
50// Returns the number of skew commuting variables appearing in 'exp'.n
51{
52 int deg = 0;
53 for (int i = 0; i < _n_skew; i++)
54 {
55 int v = _skew_list[i];
56 if (exp[v] > 0) deg++;
57 }
58 return deg;
59}
60
61int SkewMultiplication::skew_vars(const int *exp, int *result) const
62// The number s of skew variables in 'exp' is returned, and their
63// indices are placed in result[0], ..., result[s-1].
64// The space that 'result' points to MUST hold at least n_skew ints
65{
66 int i;
67 int next = 0;
68 for (i = 0; i < _n_skew; i++)
69 {
70 int v = _skew_list[i];
71 if (exp[v] > 0) result[next++] = v;
72 }
73 return next;
74}
75
76int SkewMultiplication::skew_vars(const long *exp, int *result) const
77// The number s of skew variables in 'exp' is returned, and their
78// indices are placed in result[0], ..., result[s-1].
79// The space that 'result' points to MUST hold at least n_skew ints
80{
81 int i;
82 int next = 0;
83 for (i = 0; i < _n_skew; i++)
84 {
85 int v = _skew_list[i];
86 if (exp[v] > 0) result[next++] = v;
87 }
88 return next;
89}
90
91int SkewMultiplication::mult_sign(const int *exp1, const int *exp2) const
92{
95 int a = skew_vars(exp1, SKEW1);
96 int b = skew_vars(exp2, SKEW2);
97 return sort_sign(a, SKEW1, b, SKEW2);
98}
99
100int SkewMultiplication::mult_sign(const long *exp1, const long *exp2) const
101{
104 int a = skew_vars(exp1, SKEW1);
105 int b = skew_vars(exp2, SKEW2);
106 return sort_sign(a, SKEW1, b, SKEW2);
107}
108
109int SkewMultiplication::diff(const int *exp1,
110 const int *exp2,
111 int *result) const
112// exp1 acting as a differential operator on exp2 is s * result, s = 0, 1, or
113// -1.
114{
115 for (int i = 0; i < _n_vars; i++)
116 {
117 int cmp = exp2[i] - exp1[i];
118 if (cmp < 0) return 0;
119 result[i] = cmp;
120 }
123 int a = skew_vars(result, SKEW1);
124 int b = skew_vars(exp1, SKEW2);
125 int sign = sort_sign(a, SKEW1, b, SKEW2);
126 int c = b % 4;
127 if (c == 2 || c == 3) sign = -sign;
128 return sign;
129}
130
131int SkewMultiplication::divide(const int *exp1,
132 const int *exp2,
133 int *result) const
134// If the result is s (1,or -1), then exp1 = s * result * exp2
135{
136 for (int i = 0; i < _n_vars; i++)
137 {
138 int cmp = exp1[i] - exp2[i];
139 if (cmp < 0) return 0;
140 result[i] = cmp;
141 }
142 int sign = mult_sign(result, exp2);
143 return sign;
144}
145
146bool SkewMultiplication::exp_is_zero(const int *exp) const
147// Return whether any skew variable in the exponent vector has exponent >= 2
148{
149 for (int i = 0; i < _n_skew; i++)
150 {
151 int v = _skew_list[i];
152 if (exp[v] >= 2) return true;
153 }
154 return false;
155}
156
157// Local Variables:
158// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
159// indent-tabs-mode: nil
160// End:
exponents::Exponents exponents_t
int skew_degree(const int *exp) const
Definition skew.cpp:49
unsigned long skew_byte_size
Definition skew.hpp:62
int mult_sign(const int *exp1, const int *exp2) const
Definition skew.cpp:91
bool * _skew_exp
Definition skew.hpp:60
bool exp_is_zero(const int *exp) const
Definition skew.cpp:146
int diff(const int *exp1, const int *exp2, int *result) const
Definition skew.cpp:109
int skew_vars(const int *exp, int *result) const
Definition skew.cpp:61
int divide(const int *exp1, const int *exp2, int *result) const
Definition skew.cpp:131
VALGRIND_MAKE_MEM_DEFINED & result(result)
#define ALLOCATE_EXPONENTS(byte_len)
Definition monoid.hpp:62
#define EXPONENT_BYTE_SIZE(nvars)
Definition monoid.hpp:63
Monoid — variable count, naming, grading, and monomial order of a polynomial ring.
#define newarray_atomic_clear(T, len)
Definition newdelete.hpp:93
static int sort_sign(int a, int *v1, int b, int *v2)
Definition skew.cpp:19
SkewMultiplication — configuration object naming the skew-commuting variables of a ring.