source: git/factory/DegreePattern.cc

spielwiese
Last change on this file was 72d624, checked in by Martin Lee <martinlee84@…>, 10 years ago
fix: memory leaks
  • Property mode set to 100644
File size: 2.7 KB
Line 
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"
19#include "templates/ftmpl_functions.h"
20#include "gfops.h"
21#include "cf_factory.h"
22
23
24DegreePattern::DegreePattern (const CFList& l)
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';
37  if (CFFactory::gettype() == GaloisFieldDomain)
38  {
39    d= getGFDegree();
40    cGFName= gf_name;
41  }
42  setCharacteristic(0);
43  CanonicalForm buf= 1;
44  CFListIterator k= l;
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
63    setCharacteristic (p);
64  }
65}
66
67
68void DegreePattern::intersect (const DegreePattern& degPat)
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
105void DegreePattern::refine ()
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
Note: See TracBrowser for help on using the repository browser.