source: git/kernel/fglm/fglmgauss.cc @ e6cdad

spielwiese
Last change on this file since e6cdad was e6cdad, checked in by Hans Schoenemann <hannes@…>, 6 years ago
use xalloc if omalloc is disabled
  • Property mode set to 100644
File size: 5.4 KB
Line 
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
20#include "fglmvec.h"
21#include "fglmgauss.h"
22
23class gaussElem
24{
25public:
26    fglmVector v;
27    fglmVector p;
28    number pdenom;
29    number fac;
30    gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac ) : v( newv ), p( newp ), pdenom( newpdenom ), fac( newfac )
31    {
32        newpdenom= NULL;
33        newfac= NULL;
34    }
35
36#ifndef HAVE_EXPLICIT_CONSTR
37  gaussElem() : v(), p(), pdenom(NULL), fac(NULL) {}
38
39  void mac_gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac )
40    {
41    v= newv;
42    p= newp;
43    pdenom=newpdenom;
44    fac=newfac;
45        newpdenom= NULL;
46        newfac= NULL;
47    }
48#endif
49
50    ~gaussElem()
51    {
52      if (pdenom!=NULL) nDelete( & pdenom );
53      if (fac!=NULL)    nDelete( & fac );
54    }
55};
56
57gaussReducer::gaussReducer( int dimen )
58{
59    int k;
60    size= 0;
61    max= dimen;
62#ifndef HAVE_EXPLICIT_CONSTR
63    elems= new gaussElem[ max+1 ];
64#else
65    elems= (gaussElem *)omAlloc( (max+1)*sizeof( gaussElem ) );
66#endif
67    isPivot= (BOOLEAN *)omAlloc( (max+1)*sizeof( BOOLEAN ) );
68    for ( k= max; k > 0; k-- )
69            isPivot[k]= FALSE;
70    perm= (int *)omAlloc( (max+1)*sizeof( int ) );
71}
72
73gaussReducer::~gaussReducer()
74{
75#ifndef HAVE_EXPLICIT_CONSTR
76    delete [] elems;
77#else
78    int k;
79    for ( k= size; k > 0; k-- )
80        elems[k].~gaussElem();
81    omFreeSize( (ADDRESS)elems, (max+1)*sizeof( gaussElem ) );
82#endif
83
84    omFreeSize( (ADDRESS)isPivot, (max+1)*sizeof( BOOLEAN ) );
85    omFreeSize( (ADDRESS)perm, (max+1)*sizeof( int ) );
86}
87
88BOOLEAN
89gaussReducer::reduce( fglmVector thev )
90{
91    number fac1, fac2;
92    number temp;
93    // Hier ueberlegen, ob thev als referenz, oder wie wann was kopiert usw.
94    v= thev;
95    p= fglmVector( size + 1, size + 1 );
96    // fglmASSERT( pdenom == NULL );
97    pdenom= nInit( 1 );
98    number vdenom = v.clearDenom();
99    if ( ! nIsOne( vdenom ) && ! nIsZero( vdenom ) ) {
100        p.setelem( p.size(), vdenom );
101    }
102    else {
103        nDelete( & vdenom );
104    }
105    number gcd = v.gcd();
106    if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
107        v /= gcd;
108        number temp= nMult( pdenom, gcd );
109        nDelete( & pdenom );
110        pdenom= temp;
111    }
112    nDelete( & gcd );
113
114    int k;
115    for ( k= 1; k <= size; k++ ) {
116        if ( ! v.elemIsZero( perm[k] ) ) {
117            fac1= elems[k].fac;
118            fac2= nCopy( v.getconstelem( perm[k] ) );
119            v.nihilate( fac1, fac2, elems[k].v );
120            fac1= nMult( fac1, elems[k].pdenom );
121            temp= nMult( fac2, pdenom );
122            nDelete( & fac2 );
123            fac2= temp;
124            p.nihilate( fac1, fac2, elems[k].p );
125            temp= nMult( pdenom, elems[k].pdenom );
126            nDelete( & pdenom );
127            pdenom= temp;
128
129            nDelete( & fac1 );
130            nDelete( & fac2 );
131            number gcd = v.gcd();
132            if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) )
133            {
134                v/= gcd;
135                number temp = nMult( pdenom, gcd );
136                nDelete( & pdenom );
137                pdenom= temp;
138            }
139            nDelete( & gcd );
140            gcd= p.gcd();
141            temp= n_SubringGcd( pdenom, gcd, currRing->cf );
142            nDelete( & gcd );
143            gcd= temp;
144            if ( ! nIsZero( gcd ) && ! nIsOne( gcd ) )
145            {
146                p/= gcd;
147                temp= nDiv( pdenom, gcd );
148                nDelete( & pdenom );
149                pdenom= temp;
150                nNormalize( pdenom );
151            }
152            nDelete( & gcd );
153        }
154    }
155    return ( v.isZero() );
156}
157
158void
159gaussReducer::store()
160{
161    // fglmASSERT( size < max );
162    // number fac;
163    // find the pivot-element in v:
164
165    size++;
166    int k= 1;
167    while ( nIsZero(v.getconstelem(k)) || isPivot[k] ) {
168        k++;
169    }
170    // fglmASSERT( k <= dimen, "Error(1) in fglmDdata::pivot-search");
171    number pivot= v.getconstelem( k );
172    int pivotcol = k;
173    k++;
174    while ( k <= max ) {
175        if ( ! nIsZero( v.getconstelem(k) ) && ! isPivot[k] ) {
176            if ( nGreater( v.getconstelem( k ), pivot ) ) {
177                pivot= v.getconstelem( k );
178                pivotcol= k;
179            }
180        }
181        k++;
182    }
183    // fglmASSERT( ! nIsZero( pivot ), "Error(2) fglmDdata::Pivotelement ist Null" );
184    isPivot[ pivotcol ]= TRUE;
185    perm[size]= pivotcol;
186
187    pivot= nCopy( v.getconstelem( pivotcol ) );
188#ifndef HAVE_EXPLICIT_CONSTR
189    elems[size].mac_gaussElem( v, p, pdenom, pivot );
190#else
191    elems[size].gaussElem( v, p, pdenom, pivot );
192#endif
193}
194
195fglmVector
196gaussReducer::getDependence()
197{
198    nDelete( & pdenom );
199    // hier kann p noch gekuerzt werden, je nach Charakteristik
200    fglmVector result = p;
201    p= fglmVector();
202    return ( result );
203}
204// ================================================================================
205
206// ----------------------------------------------------------------------------
207// Local Variables: ***
208// compile-command: "make Singular" ***
209// page-delimiter: "^\\(\\|//!\\)" ***
210// fold-internal-margins: nil ***
211// End: ***
Note: See TracBrowser for help on using the repository browser.