Macaulay2 Engine
Loading...
Searching...
No Matches
assprime.cpp
Go to the documentation of this file.
1// (c) 1994 Michael E. Stillman
2
3#include "assprime.hpp"
4
7 min_codim(I->get_ring()->n_vars() + 1),
8 nvars(I->get_ring()->n_vars()),
9 mi(I->radical()),
10 ass_primes(new MonomialIdeal(I->get_ring()))
11{
12 exps = newarray(int *, nvars + 2);
13 for (int i = 0; i <= nvars + 1; i++) exps[i] = nullptr;
14}
15
18 min_codim(cod),
19 nvars(I->get_ring()->n_vars()),
20 mi(I->radical()),
21 ass_primes(new MonomialIdeal(I->get_ring()))
22{
23 exps = newarray(int *, nvars + 2);
24 for (int i = 0; i <= nvars + 1; i++) exps[i] = nullptr;
25}
27{
28 for (int i = 0; i <= nvars + 1; i++)
29 if (exps[i] != nullptr) freemem(exps[i]);
31}
32
34{
35 minprime_limit = -1;
37 ass_prime_generator(mi->first_node(), 0);
39 return min_codim;
40}
41
43// Place the associated primes of minimal codimension
44// into a monomial ideal where each monomial corresponds to the prime
45// monomial ideal which is its support.
46{
47 if (state == do_codim)
48 {
51 }
52 minprime_limit = count;
53 n_minprimes = 0;
54 if (exps[0] == nullptr) exps[0] = newarray_atomic_clear(int, nvars);
55 ass_prime_generator(mi->first_node(), 0);
56 return ass_primes;
57}
58
59static int reduce_exp(const int *m, const int *exp)
60// Determine whether the varpower monomial 'm'
61// can be in the monomial prime ideal 'exp'.
62// exp corresponds to the set:
63// exp[i]>0 means variable is in ideal
64// exp[i]<0 means variable is not in ideal
65// exp[i]=0 means variable may or may not be in the ideal.
66// Return: 0 if 'm' is in this ideal.
67// Return: 1 if 'm' could be in the ideal.
68// Return: -1 if 'm' cannot possibly be in this ideal.
69{
70 int is_one = 1;
71 for (index_varpower i = m; i.valid(); ++i)
72 {
73 if (exp[i.var()] == 1) return 0;
74 if (exp[i.var()] == 0) is_one = 0;
75 }
76 if (is_one) return -1;
77 return 1;
78}
79
80static void to_prime_ideal(int n, int *exp)
81{
82 for (int i = 0; i < n; i++)
83 if (exp[i] <= 0)
84 exp[i] = 1;
85 else
86 exp[i] = 0;
87}
88
90{
91 int i = codim + 1;
92 if (exps[i] == nullptr) exps[i] = newarray_atomic(int, nvars);
93 exponents_t exp = exps[i];
94 for (int j = 0; j < nvars; j++) exp[j] = exps[codim][j];
95 for (;;)
96 {
97 if (p == nullptr)
98 {
99 if (state == do_codim)
100 {
101 if (codim < min_codim) min_codim = codim;
102 }
103 else
104 {
105 to_prime_ideal(nvars, exp);
106 Bag *b = new Bag(0);
108 ass_primes->insert(b);
109 n_minprimes++;
110 if (minprime_limit > 0 && n_minprimes >= minprime_limit) return;
111 }
112 return;
113 }
114 const int *m = p->monom().data();
115 switch (reduce_exp(m, exp))
116 {
117 case 0:
118 p = mi->next(p);
119 break;
120 case -1:
121 return;
122 case 1:
123 if (codim < min_codim)
124 for (index_varpower i2 = m; i2.valid(); ++i2)
125 if (exp[i2.var()] == 0)
126 {
127 exp[i2.var()] = 1;
128 ass_prime_generator(mi->next(p), codim + 1);
129 exp[i2.var()] = -1;
131 return;
132 }
133 return;
134 }
135 }
136}
137
138// Local Variables:
139// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
140// indent-tabs-mode: nil
141// End:
ExponentListIterator< int, true > index_varpower
exponents::Exponents exponents_t
static int reduce_exp(const int *m, const int *exp)
Definition assprime.cpp:59
static void to_prime_ideal(int n, int *exp)
Definition assprime.cpp:80
AssociatedPrimes — codimension and minimal-codimension associated primes of a monomial ideal.
MonomialIdeal * mi
Definition assprime.hpp:56
MonomialIdeal * associated_primes(int count)
Definition assprime.cpp:42
enum AssociatedPrimes::@177063233203262365233110357323144202102263177177 state
MonomialIdeal * ass_primes
Definition assprime.hpp:58
void ass_prime_generator(Nmi_node *p, int codim)
Definition assprime.cpp:89
AssociatedPrimes(const MonomialIdeal *const &mi)
Definition assprime.cpp:5
static void from_expvector(int n, exponents::ConstExponents a, Vector &result)
Engine-side monomial ideal: a decision tree of Nmi_nodes storing the (typically minimal) generators b...
Definition monideal.hpp:136
Internal tree node of the MonomialIdeal decision tree.
Definition monideal.hpp:74
gc_vector< int > & monom()
Definition int-bag.hpp:60
int p
int_bag Bag
Definition int-bag.hpp:70
void freemem(void *s)
Definition m2-mem.cpp:103
#define newarray_atomic_clear(T, len)
Definition newdelete.hpp:93
#define newarray(T, len)
Definition newdelete.hpp:82
#define newarray_atomic(T, len)
Definition newdelete.hpp:91