My Project  debian-1:4.1.1-p2+ds-4
fglmgauss.cc
Go to the documentation of this file.
1 // emacs edit mode for this file is -*- C++ -*-
2 
3 /****************************************
4 * Computer Algebra System SINGULAR *
5 ****************************************/
6 /*
7 * ABSTRACT - class gaussReducer. Used in fglmzero.cc and fglmhom.cc
8 * to find linear dependecies of fglmVectors.
9 */
10 
11 
12 
13 
14 #include "kernel/mod2.h"
15 
16 #include "kernel/structs.h"
17 #include "coeffs/numbers.h"
18 #include "polys/monomials/ring.h"
19 #include "omalloc/omalloc.h"
20 
21 #include "fglmvec.h"
22 #include "fglmgauss.h"
23 
24 class gaussElem
25 {
26 public:
29  number pdenom;
30  number fac;
31  gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac ) : v( newv ), p( newp ), pdenom( newpdenom ), fac( newfac )
32  {
33  newpdenom= NULL;
34  newfac= NULL;
35  }
36 
37 #ifndef HAVE_EXPLICIT_CONSTR
38  gaussElem() : v(), p(), pdenom(NULL), fac(NULL) {}
39 
40  void mac_gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac )
41  {
42  v= newv;
43  p= newp;
44  pdenom=newpdenom;
45  fac=newfac;
46  newpdenom= NULL;
47  newfac= NULL;
48  }
49 #endif
50 
52  {
53  if (pdenom!=NULL) nDelete( & pdenom );
54  if (fac!=NULL) nDelete( & fac );
55  }
56 };
57 
58 gaussReducer::gaussReducer( int dimen )
59 {
60  int k;
61  size= 0;
62  max= dimen;
63 #ifndef HAVE_EXPLICIT_CONSTR
64  elems= new gaussElem[ max+1 ];
65 #else
66  elems= (gaussElem *)omAlloc( (max+1)*sizeof( gaussElem ) );
67 #endif
68  isPivot= (BOOLEAN *)omAlloc( (max+1)*sizeof( BOOLEAN ) );
69  for ( k= max; k > 0; k-- )
70  isPivot[k]= FALSE;
71  perm= (int *)omAlloc( (max+1)*sizeof( int ) );
72 }
73 
75 {
76 #ifndef HAVE_EXPLICIT_CONSTR
77  delete [] elems;
78 #else
79  int k;
80  for ( k= size; k > 0; k-- )
81  elems[k].~gaussElem();
82  omFreeSize( (ADDRESS)elems, (max+1)*sizeof( gaussElem ) );
83 #endif
84 
85  omFreeSize( (ADDRESS)isPivot, (max+1)*sizeof( BOOLEAN ) );
86  omFreeSize( (ADDRESS)perm, (max+1)*sizeof( int ) );
87 }
88 
91 {
92  number fac1, fac2;
93  number temp;
94  // Hier ueberlegen, ob thev als referenz, oder wie wann was kopiert usw.
95  v= thev;
96  p= fglmVector( size + 1, size + 1 );
97  // fglmASSERT( pdenom == NULL );
98  pdenom= nInit( 1 );
99  number vdenom = v.clearDenom();
100  if ( ! nIsOne( vdenom ) && ! nIsZero( vdenom ) ) {
101  p.setelem( p.size(), vdenom );
102  }
103  else {
104  nDelete( & vdenom );
105  }
106  number gcd = v.gcd();
107  if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
108  v /= gcd;
109  number temp= nMult( pdenom, gcd );
110  nDelete( & pdenom );
111  pdenom= temp;
112  }
113  nDelete( & gcd );
114 
115  int k;
116  for ( k= 1; k <= size; k++ ) {
117  if ( ! v.elemIsZero( perm[k] ) ) {
118  fac1= elems[k].fac;
119  fac2= nCopy( v.getconstelem( perm[k] ) );
120  v.nihilate( fac1, fac2, elems[k].v );
121  fac1= nMult( fac1, elems[k].pdenom );
122  temp= nMult( fac2, pdenom );
123  nDelete( & fac2 );
124  fac2= temp;
125  p.nihilate( fac1, fac2, elems[k].p );
126  temp= nMult( pdenom, elems[k].pdenom );
127  nDelete( & pdenom );
128  pdenom= temp;
129 
130  nDelete( & fac1 );
131  nDelete( & fac2 );
132  number gcd = v.gcd();
133  if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) )
134  {
135  v/= gcd;
136  number temp = nMult( pdenom, gcd );
137  nDelete( & pdenom );
138  pdenom= temp;
139  }
140  nDelete( & gcd );
141  gcd= p.gcd();
142  temp= n_SubringGcd( pdenom, gcd, currRing->cf );
143  nDelete( & gcd );
144  gcd= temp;
145  if ( ! nIsZero( gcd ) && ! nIsOne( gcd ) )
146  {
147  p/= gcd;
148  temp= nDiv( pdenom, gcd );
149  nDelete( & pdenom );
150  pdenom= temp;
151  nNormalize( pdenom );
152  }
153  nDelete( & gcd );
154  }
155  }
156  return ( v.isZero() );
157 }
158 
159 void
161 {
162  // fglmASSERT( size < max );
163  // number fac;
164  // find the pivot-element in v:
165 
166  size++;
167  int k= 1;
168  while ( nIsZero(v.getconstelem(k)) || isPivot[k] ) {
169  k++;
170  }
171  // fglmASSERT( k <= dimen, "Error(1) in fglmDdata::pivot-search");
172  number pivot= v.getconstelem( k );
173  int pivotcol = k;
174  k++;
175  while ( k <= max ) {
176  if ( ! nIsZero( v.getconstelem(k) ) && ! isPivot[k] ) {
177  if ( nGreater( v.getconstelem( k ), pivot ) ) {
178  pivot= v.getconstelem( k );
179  pivotcol= k;
180  }
181  }
182  k++;
183  }
184  // fglmASSERT( ! nIsZero( pivot ), "Error(2) fglmDdata::Pivotelement ist Null" );
185  isPivot[ pivotcol ]= TRUE;
186  perm[size]= pivotcol;
187 
188  pivot= nCopy( v.getconstelem( pivotcol ) );
189 #ifndef HAVE_EXPLICIT_CONSTR
190  elems[size].mac_gaussElem( v, p, pdenom, pivot );
191 #else
192  elems[size].gaussElem( v, p, pdenom, pivot );
193 #endif
194 }
195 
198 {
199  nDelete( & pdenom );
200  // hier kann p noch gekuerzt werden, je nach Charakteristik
201  fglmVector result = p;
202  p= fglmVector();
203  return ( result );
204 }
205 // ================================================================================
206 
207 // ----------------------------------------------------------------------------
208 // Local Variables: ***
209 // compile-command: "make Singular" ***
210 // page-delimiter: "^\\( \\|//!\\)" ***
211 // fold-internal-margins: nil ***
212 // End: ***
FALSE
#define FALSE
Definition: auxiliary.h:94
omalloc.h
nNormalize
#define nNormalize(n)
Definition: numbers.h:30
fglmVector::clearDenom
number clearDenom()
Definition: fglmvec.cc:502
fglmVector::isZero
int isZero()
Definition: fglmvec.cc:295
gaussReducer::elems
gaussElem * elems
Definition: fglmgauss.h:20
k
int k
Definition: cfEzgcd.cc:92
gaussReducer::reduce
BOOLEAN reduce(fglmVector v)
Definition: fglmgauss.cc:89
result
return result
Definition: facAbsBiFact.cc:76
nGreater
#define nGreater(a, b)
Definition: numbers.h:28
ADDRESS
void * ADDRESS
Definition: auxiliary.h:133
gaussReducer::gaussReducer
gaussReducer(int dimen)
Definition: fglmgauss.cc:57
gaussReducer::isPivot
BOOLEAN * isPivot
Definition: fglmgauss.h:21
fglmVector
Definition: fglmvec.h:17
gaussElem::pdenom
number pdenom
Definition: fglmgauss.cc:29
gaussElem::gaussElem
gaussElem(const fglmVector newv, const fglmVector newp, number &newpdenom, number &newfac)
Definition: fglmgauss.cc:31
gaussReducer::size
int size
Definition: fglmgauss.h:26
currRing
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition: polys.cc:13
TRUE
#define TRUE
Definition: auxiliary.h:98
nIsOne
#define nIsOne(n)
Definition: numbers.h:25
fglmVector::setelem
void setelem(int i, number &n)
Definition: fglmvec.cc:451
gaussElem::v
fglmVector v
Definition: fglmgauss.cc:27
omFreeSize
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:258
gaussElem::fac
number fac
Definition: fglmgauss.cc:30
BOOLEAN
int BOOLEAN
Definition: auxiliary.h:85
structs.h
gaussReducer::perm
int * perm
Definition: fglmgauss.h:22
mod2.h
fglmgauss.h
gaussReducer::~gaussReducer
~gaussReducer()
Definition: fglmgauss.cc:73
pivot
bool pivot(const matrix aMat, const int r1, const int r2, const int c1, const int c2, int *bestR, int *bestC, const ring R)
This code computes a score for each non-zero matrix entry in aMat[r1..r2, c1..c2].
Definition: linearAlgebra.cc:68
omAlloc
#define omAlloc(size)
Definition: omAllocDecl.h:208
gaussReducer::max
int max
Definition: fglmgauss.h:27
nDiv
#define nDiv(a, b)
Definition: numbers.h:32
gaussElem::p
fglmVector p
Definition: fglmgauss.cc:28
gaussReducer::getDependence
fglmVector getDependence()
Definition: fglmgauss.cc:196
fglmVector::nihilate
void nihilate(const number fac1, const number fac2, const fglmVector v)
Definition: fglmvec.cc:218
fglmVector::gcd
number gcd() const
Definition: fglmvec.cc:458
nIsZero
#define nIsZero(n)
Definition: numbers.h:19
ring.h
nMult
#define nMult(n1, n2)
Definition: numbers.h:17
gaussReducer::v
fglmVector v
Definition: fglmgauss.h:23
gaussReducer::store
void store()
Definition: fglmgauss.cc:159
gaussReducer::p
fglmVector p
Definition: fglmgauss.h:24
gaussElem
Definition: fglmgauss.cc:23
NULL
#define NULL
Definition: omList.c:9
fglmVector::getconstelem
number getconstelem(int i) const
Definition: fglmvec.cc:446
nDelete
#define nDelete(n)
Definition: numbers.h:16
n_SubringGcd
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
Definition: coeffs.h:688
gcd
int gcd(int a, int b)
Definition: walkSupport.cc:836
fglmvec.h
nInit
#define nInit(i)
Definition: numbers.h:24
gaussElem::~gaussElem
~gaussElem()
Definition: fglmgauss.cc:51
nCopy
#define nCopy(n)
Definition: numbers.h:15
gaussReducer::pdenom
number pdenom
Definition: fglmgauss.h:25
numbers.h
fglmVector::elemIsZero
int elemIsZero(int i)
Definition: fglmvec.cc:300
fglmVector::size
int size() const
Definition: fglmvec.cc:207