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

fieker-DuValspielwiese
Last change on this file since d3e2512 was d3e2512, checked in by Oleksandr Motsak <motsak@…>, 10 years ago
Separating sources: kernel/fglm/
  • 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 <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#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.