DegreePattern.cc
Go to the documentation of this file.
1 /*****************************************************************************\
2  * Computer Algebra System SINGULAR
3 \*****************************************************************************/
4 /** @file DegreePattern.cc
5  *
6  * This file provides functions for manipulating DegreePatterns
7  *
8  * @author Martin Lee
9  *
10  **/
11 /*****************************************************************************/
12 
13 
14 #include "config.h"
15 
16 
17 #include "DegreePattern.h"
18 #include "cf_iter.h"
20 #include "gfops.h"
21 #include "cf_factory.h"
22 
23 
25 {
26  m_data = NULL;
27 
28  if (l.length() == 0)
29  m_data = new Pattern();
30  else
31  {
32 
33  Variable x= Variable (1);
34  int p= getCharacteristic();
35  int d= 0;
36  char cGFName= 'Z';
38  {
39  d= getGFDegree();
40  cGFName= gf_name;
41  }
43  CanonicalForm buf= 1;
45  for (int i= 0; i < l.length(); i++, k++)
46  buf *= (power (x, degree (k.getItem(), x)) + 1);
47 
48  int j= 0;
49  for (CFIterator i= buf; i.hasTerms(); i++, j++)
50  ;
51 
52  ASSERT ( j > 1, "j > 1 expected" );
53 
54  m_data = new Pattern( j - 1 );
55 
56  int i= 0;
57  for (CFIterator m = buf; i < getLength(); i++, m++)
58  (*this) [i]= m.exp();
59 
60  if (d > 1)
61  setCharacteristic (p, d, cGFName);
62  else
64  }
65 }
66 
67 
69 {
70  if (degPat.getLength() < getLength())
71  {
72  DegreePattern bufDeg= *this;
73  *this= degPat;
74  return (*this).intersect (bufDeg);
75  }
76 
77  int count= 0;
78  int length= tmin (getLength(), degPat.getLength());
79  int* buf= new int [length];
80  for (int i= 0; i < length; i++)
81  {
82  if (degPat.find ((*this)[i]))
83  {
84  buf[i]= (*this)[i];
85  count++;
86  }
87  else
88  buf[i]= -1;
89  }
90  ASSERT ( count > 0, "count > 0 expected" );
91 
92  init (count);
93  count= 0;
94  for (int i= 0; i < length; i++)
95  {
96  if (buf[i] != -1)
97  {
98  (*this) [count]= buf[i];
99  count++;
100  }
101  }
102  delete[] buf;
103 }
104 
106 {
107  if (getLength() <= 1)
108  return;
109  int count= 0;
110  int* buf= new int [getLength()];
111  int d= (*this) [0];
112  int pos;
113  for (int i= 0; i < getLength(); i++)
114  buf[i]= -1;
115  for (int i= 1; i < getLength(); i++)
116  {
117  pos= (*this).find (d - (*this)[i]);
118  if (pos)
119  {
120  buf[i]= (*this)[i];
121  count++;
122  }
123  }
124  buf[0]= d;
125  count++;
126  if (count == getLength())
127  {
128  delete [] buf;
129  return;
130  }
131  int length= getLength();
132 
133  ASSERT ( count > 0, "count > 0 expected" );
134  init (count);
135  count= 0;
136  for (int i= 0; i < length; i++)
137  {
138  if (buf[i] != -1)
139  {
140  (*this)[count]= buf[i];
141  count++;
142  }
143  }
144 
145  delete[] buf;
146  return;
147 }
148 
int status int void size_t count
Definition: si_signals.h:59
CanonicalForm power(const CanonicalForm &f, int n)
exponentiation
DegreePattern provides a functionality to create, intersect and refine degree patterns.
Definition: DegreePattern.h:31
int getLength() const
getter
Definition: DegreePattern.h:86
some useful template functions.
void init(int n)
initialise a DegreePattern
Definition: DegreePattern.h:60
return P p
Definition: myNF.cc:203
factory&#39;s class for variables
Definition: factory.h:115
int find(const int x) const
find an element x
factory&#39;s main class
Definition: canonicalform.h:75
char gf_name
Definition: gfops.cc:52
int k
Definition: cfEzgcd.cc:93
void setCharacteristic(int c)
Definition: cf_char.cc:23
int getCharacteristic()
Definition: cf_char.cc:51
void intersect(const DegreePattern &degPat)
intersect two degree patterns
DegreePattern()
default constructor
Operations in GF, where GF is a finite field of size less than 2^16 represented by a root of Conway p...
int j
Definition: myNF.cc:70
int status int void * buf
Definition: si_signals.h:59
Interface to generate InternalCF&#39;s over various domains from intrinsic types or mpz_t&#39;s.
int m
Definition: cfEzgcd.cc:119
Iterators for CanonicalForm&#39;s.
int length() const
Definition: ftmpl_list.cc:273
int i
Definition: cfEzgcd.cc:123
void refine()
Refine a degree pattern. Assumes that (*this)[0]:= d is the degree of the poly to be factored...
class to iterate through CanonicalForm&#39;s
Definition: cf_iter.h:44
#define NULL
Definition: omList.c:10
static int gettype()
Definition: cf_factory.h:27
T & getItem() const
Definition: ftmpl_list.cc:431
int getGFDegree()
Definition: cf_char.cc:56
Variable x
Definition: cfModGcd.cc:4023
#define GaloisFieldDomain
Definition: cf_defs.h:22
This file provides a class to handle degree patterns.
#define ASSERT(expression, message)
Definition: cf_assert.h:99
int degree(const CanonicalForm &f)
struct DegreePattern::Pattern * m_data
int l
Definition: cfEzgcd.cc:94
template CanonicalForm tmin(const CanonicalForm &, const CanonicalForm &)