source: git/kernel/fglmgauss.cc @ a82c308

spielwiese
Last change on this file since a82c308 was 762407, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
config.h is for sources files only FIX: config.h should only be used by source (not from inside kernel/mod2.h!) NOTE: each source file should better include mod2.h right after config.h, while headers should better not include mod2.h.
  • Property mode set to 100644
File size: 5.4 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2// $Id$
3
4/****************************************
5*  Computer Algebra System SINGULAR     *
6****************************************/
7/*
8* ABSTRACT - class gaussReducer. Used in fglmzero.cc and fglmhom.cc
9*  to find linear dependecies of fglmVectors.
10*/
11
12#include "config.h"
13#include <kernel/mod2.h>
14
15#ifdef  HAVE_FACTORY
16#include <kernel/structs.h>
17#include <coeffs/numbers.h>
18#include <polys/monomials/ring.h>
19#include <omalloc/omalloc.h>
20
21#include <kernel/fglmvec.h>
22#include <kernel/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    int k;
77
78#ifndef HAVE_EXPLICIT_CONSTR
79    delete [] elems;
80#else
81    for ( k= size; k > 0; k-- )
82        elems[k].~gaussElem();
83    omFreeSize( (ADDRESS)elems, (max+1)*sizeof( gaussElem ) );
84#endif
85
86    omFreeSize( (ADDRESS)isPivot, (max+1)*sizeof( BOOLEAN ) );
87    omFreeSize( (ADDRESS)perm, (max+1)*sizeof( int ) );
88}
89
90BOOLEAN
91gaussReducer::reduce( fglmVector thev )
92{
93    number fac1, fac2;
94    number temp;
95    // Hier ueberlegen, ob thev als referenz, oder wie wann was kopiert usw.
96    v= thev;
97    p= fglmVector( size + 1, size + 1 );
98    // fglmASSERT( pdenom == NULL );
99    pdenom= nInit( 1 );
100    number vdenom = v.clearDenom();
101    if ( ! nIsOne( vdenom ) && ! nIsZero( vdenom ) ) {
102        p.setelem( p.size(), vdenom );
103    }
104    else {
105        nDelete( & vdenom );
106    }
107    number gcd = v.gcd();
108    if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
109        v /= gcd;
110        number temp= nMult( pdenom, gcd );
111        nDelete( & pdenom );
112        pdenom= temp;
113    }
114    nDelete( & gcd );
115
116    int k;
117    for ( k= 1; k <= size; k++ ) {
118        if ( ! v.elemIsZero( perm[k] ) ) {
119            fac1= elems[k].fac;
120            fac2= nCopy( v.getconstelem( perm[k] ) );
121            v.nihilate( fac1, fac2, elems[k].v );
122            fac1= nMult( fac1, elems[k].pdenom );
123            temp= nMult( fac2, pdenom );
124            nDelete( & fac2 );
125            fac2= temp;
126            p.nihilate( fac1, fac2, elems[k].p );
127            temp= nMult( pdenom, elems[k].pdenom );
128            nDelete( & pdenom );
129            pdenom= temp;
130
131            nDelete( & fac1 );
132            nDelete( & fac2 );
133            number gcd = v.gcd();
134            if ( ! nIsOne( gcd ) && ! nIsZero( gcd ) ) {
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= nGcd( pdenom, gcd, currRing );
143            nDelete( & gcd );
144            gcd= temp;
145            if ( ! nIsZero( gcd ) && ! nIsOne( gcd ) ) {
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: ***
212#endif // HAVE_FACTORY
Note: See TracBrowser for help on using the repository browser.