File: res-a1-poly.hpp

package info (click to toggle)
macaulay2 1.21%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 133,096 kB
  • sloc: cpp: 110,377; ansic: 16,306; javascript: 4,193; makefile: 3,821; sh: 3,580; lisp: 764; yacc: 590; xml: 177; python: 140; perl: 114; lex: 65; awk: 3
file content (143 lines) | stat: -rw-r--r-- 4,758 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright 1996.  Michael E. Stillman

#ifndef _respoly_hh_
#define _respoly_hh_

#include "monideal.hpp"

struct resterm;

// The following are the possible types of res_pairs's
enum {
  SYZ_RING_ELEM,       // Base ring elements: will go away...
  SYZ_EXTERIOR_VAR,    // possibly will go away...
  SYZ_BASE_COMPONENT,  // Base component at level 0

  SYZ_S_PAIR,     // Pre computation: s-pair
  SYZ_RING_PAIR,  // Pre computation: (module elem, ring elem)
  SYZ_ONE_PAIR,   // Pre computation: (module elem * variable)
  SYZ_GEN,        // Pre computation: original generator at level 1

  SYZ_NOT_COMPUTED,
  SYZ_MINIMAL,      // Post s-pair computation: element is minimal syzygy
  SYZ_NOT_MINIMAL,  // Post s-pair computation: element is not minimal
  SYZ_NOT_NEEDED    // S-pair computation for this pair cancelled
};

class res_pair
// Only do new and delete via res_comp::new_res_pair, res_comp::delete_res_pair
{
 public:
  // The schreyer order part:

  int me;
  int compare_num;  // Schreyer order of this stripped component
  int *base_monom;

  res_pair *next;          // Next pair to compute in the same degree
  res_pair *next_compare;  // List of pairs in the level in ascending
                           // 'compare_num' value
  res_pair *first;
  res_pair *second;
  res_pair *base_comp;
  int syz_type;

  MonomialIdeal *mi;  // Monomial ideal of total monomials
  res_pair *mi2;      // List of res_pairs having this as lead term
  res_pair *next_mi;  // If this is part of a list of mi2, this is the
                      // next-link.
  resterm *syz;       // The syzygy itself, once computed

  // The following are used only for minimalization of the resolution
  int minimal_me;         // SYZ_MINIMAL: the number of this min syzygy
  resterm *pivot_term;    // SYZ_NOT_MINIMAL: Points into 'syz', to the
                          // term containing the constant.
  resterm *stripped_syz;  // If syz_type is SYZ_MINIMAL: this is the
                          // reduced stripped version.
                          // If syz_type is SYZ_NOT_MINIMAL: this is the
                          // stripped (possibly reduced) version.
};

struct resterm
{
  resterm *next;
  res_pair *comp;
  ring_elem coeff;
  int monom[1];
};

class res_poly : public our_new_delete
{
  const PolynomialRing *R;
  const Monoid *M;
  const Ring *K;  // Coefficient field of R.
  size_t element_size;
  stash *resterm_stash;

  resterm *new_term() const;

  void sort(resterm *&f) const;

 public:
  res_poly(PolynomialRing *R);
  ~res_poly();

  const res_pair *lead_component(const resterm *f) const;
  //  int lead_coefficient(const resterm *f) const;
  const int *lead_monomial(const resterm *f) const;  // Lead TOTAL monomial

  resterm *new_term(ring_elem c, const int *m, res_pair *comp) const;
  resterm *mult_by_monomial(const resterm *f, const int *m) const;
  void make_monic(resterm *&f) const;
  resterm *mult_by_term(const resterm *f, ring_elem c, const int *m) const;
  resterm *ring_mult_by_term(const ring_elem f,
                             ring_elem c,
                             const int *m,
                             res_pair *x) const;
  void add_to(resterm *&f, resterm *&g) const;  // Destroys both f and g.
  void subtract_multiple_to(resterm *&f,
                            ring_elem c,
                            const int *m,
                            const resterm *g) const;
  void ring_subtract_multiple_to(resterm *&f,
                                 ring_elem c,
                                 const int *m,
                                 res_pair *x,
                                 const ring_elem g) const;

  int compare(const resterm *a, const resterm *b) const;

  resterm *strip(const resterm *f) const;
  const resterm *component_occurs_in(const res_pair *x, const resterm *f) const;

  resterm *copy(const resterm *f) const;
  void remove(resterm *&f) const;

  vec to_vector(const resterm *f,
                const FreeModule *F,
                int to_minimal = 0) const;
  resterm *from_vector(const VECTOR(res_pair *)& base, const vec v) const;

  int n_terms(const resterm *f) const;  // Used for stats
  void elem_text_out(buffer &o,
                     const resterm *f) const;  // Used for debugging and stats
  void elem_text_out(const resterm *f) const;  // Used for debugging and stats
};

inline const res_pair *res_poly::lead_component(const resterm *f) const
{
  return f->comp;
}
// inline int res_poly::lead_coefficient(const resterm *f) const { return
// f->coeff; }
inline const int *res_poly::lead_monomial(const resterm *f) const
{
  return f->monom;
}

#endif

// Local Variables:
// compile-command: "make -C $M2BUILDDIR/Macaulay2/e "
// indent-tabs-mode: nil
// End: