source: git/factory/DegreePattern.cc @ d1dc39

fieker-DuValspielwiese
Last change on this file since d1dc39 was 17f4dc, checked in by Martin Lee <martinlee84@…>, 12 years ago
chg: check for GaloisFieldDomain
  • 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 * @internal @version \$Id$
11 *
12 **/
13/*****************************************************************************/
14
15#include "config.h"
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;
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    return;
129  }
130  int length= getLength();
131
132  ASSERT ( count > 0, "count > 0 expected" );
133  init (count);
134  count= 0;
135  for (int i= 0; i < length; i++)
136  {
137    if (buf[i] != -1)
138    {
139      (*this)[count]= buf[i];
140      count++;
141    }
142  }
143
144  delete[] buf;
145  return;
146}
147
Note: See TracBrowser for help on using the repository browser.