source: git/kernel/fglmgauss.cc @ 528f5b7

spielwiese
Last change on this file since 528f5b7 was b1dfaf, checked in by Frank Seelisch <seelisch@…>, 14 years ago
patch from Kai (checked for problems under Windows OS: no problems) git-svn-id: file:///usr/local/Singular/svn/trunk@13210 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • 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 <kernel/mod2.h>
13
14#ifdef  HAVE_FACTORY
15#include <kernel/structs.h>
16#include <kernel/numbers.h>
17#include <kernel/ring.h>
18#include <omalloc/omalloc.h>
19
20#include <kernel/fglmvec.h>
21#include <kernel/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        nDelete( & pdenom );
53        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    int k;
76
77#ifndef HAVE_EXPLICIT_CONSTR
78    delete [] elems;
79#else
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                v/= gcd;
135                number temp = nMult( pdenom, gcd );
136                nDelete( & pdenom );
137                pdenom= temp;
138            }
139            nDelete( & gcd );
140            gcd= p.gcd();
141            temp= nGcd( pdenom, gcd, currRing );
142            nDelete( & gcd );
143            gcd= temp;
144            if ( ! nIsZero( gcd ) && ! nIsOne( gcd ) ) {
145                p/= gcd;
146                temp= nDiv( pdenom, gcd );
147                nDelete( & pdenom );
148                pdenom= temp;
149                nNormalize( pdenom );
150            }
151            nDelete( & gcd );
152        }
153    }
154    return ( v.isZero() );
155}
156
157void
158gaussReducer::store()
159{
160    // fglmASSERT( size < max );
161    number fac;
162    // find the pivot-element in v:
163
164    size++;
165    int k= 1;
166    while ( nIsZero(v.getconstelem(k)) || isPivot[k] ) {
167        k++;
168    }
169    // fglmASSERT( k <= dimen, "Error(1) in fglmDdata::pivot-search");
170    number pivot= v.getconstelem( k );
171    int pivotcol = k;
172    k++;
173    while ( k <= max ) {
174        if ( ! nIsZero( v.getconstelem(k) ) && ! isPivot[k] ) {
175            if ( nGreater( v.getconstelem( k ), pivot ) ) {
176                pivot= v.getconstelem( k );
177                pivotcol= k;
178            }
179        }
180        k++;
181    }
182    // fglmASSERT( ! nIsZero( pivot ), "Error(2) fglmDdata::Pivotelement ist Null" );
183    isPivot[ pivotcol ]= TRUE;
184    perm[size]= pivotcol;
185
186    pivot= nCopy( v.getconstelem( pivotcol ) );
187#ifndef HAVE_EXPLICIT_CONSTR
188    elems[size].mac_gaussElem( v, p, pdenom, pivot );
189#else
190    elems[size].gaussElem( v, p, pdenom, pivot );
191#endif
192}
193
194fglmVector
195gaussReducer::getDependence()
196{
197    nDelete( & pdenom );
198    // hier kann p noch gekuerzt werden, je nach Charakteristik
199    fglmVector result = p;
200    p= fglmVector();
201    return ( result );
202}
203// ================================================================================
204
205// ----------------------------------------------------------------------------
206// Local Variables: ***
207// compile-command: "make Singular" ***
208// page-delimiter: "^\\(\\|//!\\)" ***
209// fold-internal-margins: nil ***
210// End: ***
211#endif // HAVE_FACTORY
Note: See TracBrowser for help on using the repository browser.