Macaulay2 Engine
Loading...
Searching...
No Matches

◆ insert1()

void MonomialIdeal::insert1 ( Nmi_node *& p,
Bag * b )
private

Definition at line 321 of file monideal.cpp.

322{
323 Nmi_node **p = &top, *up = nullptr;
324 int one_element = 1;
325
326 for (index_varpower i = b->monom().data(); i.valid();)
327 {
328 one_element = 0;
329 int insert_var = i.var();
330 int insert_exp;
331
332 if (*p == nullptr)
333 {
334 // make a new header node
335 *p = new_internal_mi_node(insert_var, 0, up);
336 (*p)->header = (*p)->left = (*p)->right = *p;
337 }
338 else if ((*p)->var < insert_var)
339 {
340 // make a new layer
341 Nmi_node *header_node, *zero_node;
342 header_node = new_internal_mi_node(insert_var, 0, up);
343 zero_node = new_internal_mi_node(insert_var, 0, *p);
344
345 header_node->left = header_node->right = zero_node;
346 (*p)->down() = zero_node;
347 *p = header_node->header = zero_node->header = zero_node->left =
348 zero_node->right = header_node;
349 }
350
351 if ((*p)->var > insert_var)
352 {
353 insert_var = (*p)->var;
354 insert_exp = 0;
355 }
356 else
357 {
358 insert_exp = i.exponent();
359 ++i;
360 }
361
362 Nmi_node *q = (*p)->right;
363 while ((q != q->header) && (q->exp < insert_exp)) q = q->right;
364 if (q->exp != insert_exp)
365 {
366 Nmi_node *insert_node;
367
368 if (i.valid())
369 {
370 insert_node = new_internal_mi_node(
371 insert_var, insert_exp, static_cast<Nmi_node*>(nullptr));
372 q->insert_to_left(insert_node);
373 q = insert_node;
374 }
375 else
376 {
377 insert_node = new_leaf_mi_node(insert_var, insert_exp, b);
378 q->insert_to_left(insert_node);
379 return;
380 }
381 }
382
383 up = q;
384 p = &(q->down());
385 }
386 if (one_element)
387 {
388 // insert a header node and a var/exp = 0/0 leaf
389 top = new_internal_mi_node(0, 0, static_cast<Nmi_node *>(nullptr));
390 Nmi_node *leaf_node = new_leaf_mi_node(0, 0, b);
391 top->left = top->right = leaf_node;
392 top->header = leaf_node->header = leaf_node->left = leaf_node->right =
393 top;
394 }
395}
ExponentListIterator< int, true > index_varpower
Nmi_node * new_leaf_mi_node(int v, int e, Bag *b)
Definition monideal.cpp:62
Nmi_node * new_internal_mi_node(int v, int e, Nmi_node *d)
Definition monideal.cpp:49
Nmi_node * header
Definition monideal.hpp:84
void insert_to_left(Nmi_node *q)
Definition monideal.hpp:106
Nmi_node * down
Definition monideal.hpp:88
Nmi_node * left
Definition monideal.hpp:82
Nmi_node * right
Definition monideal.hpp:83
gc_vector< int > & monom()
Definition int-bag.hpp:60
int p

References Nmi_node::down, Nmi_node::exp, Nmi_node::header, Nmi_node::insert_to_left(), Nmi_node::left, int_bag::monom(), new_internal_mi_node(), new_leaf_mi_node(), p, and Nmi_node::right.

Referenced by insert_minimal().