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

spielwiese
Last change on this file since 066288 was 066288, checked in by Oleksandr Motsak <motsak@…>, 10 years ago
Separating headers: kernel/fglm/ NOTE: in this case git was able to detect the movement of headers despite minor changes to them, in general if git fails to do that one will get separate DELETION and ADDITION of a new file which is to be avoided e.g. at the cost of an extra commit (with all the changes)
  • 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#ifdef HAVE_CONFIG_H
12#include "singularconfig.h"
13#endif /* HAVE_CONFIG_H */
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
24class gaussElem
25{
26public:
27    fglmVector v;
28    fglmVector p;
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
51    ~gaussElem()
52    {
53        nDelete( & pdenom );
54        nDelete( & fac );
55    }
56};
57
58gaussReducer::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
74gaussReducer::~gaussReducer()
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
89BOOLEAN
90gaussReducer::reduce( fglmVector thev )
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_Gcd( 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
159void
160gaussReducer::store()
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
196fglmVector
197gaussReducer::getDependence()
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: ***
Note: See TracBrowser for help on using the repository browser.