source: git/kernel/fglmgauss.cc @ 7bb7da5

jengelh-datetimespielwiese
Last change on this file since 7bb7da5 was ba5e9e, checked in by Oleksandr Motsak <motsak@…>, 10 years ago
Changed configure-scripts to generate individual public config files for each package: resources, libpolys, singular (main) fix: sources should include correct corresponding config headers.
  • Property mode set to 100644
File size: 5.5 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#ifdef  HAVE_FACTORY
17#include <kernel/structs.h>
18#include <coeffs/numbers.h>
19#include <polys/monomials/ring.h>
20#include <omalloc/omalloc.h>
21
22#include <kernel/fglmvec.h>
23#include <kernel/fglmgauss.h>
24
25class gaussElem
26{
27public:
28    fglmVector v;
29    fglmVector p;
30    number pdenom;
31    number fac;
32    gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac ) : v( newv ), p( newp ), pdenom( newpdenom ), fac( newfac )
33    {
34        newpdenom= NULL;
35        newfac= NULL;
36    }
37
38#ifndef HAVE_EXPLICIT_CONSTR
39  gaussElem() : v(), p(), pdenom(NULL), fac(NULL) {}
40
41  void mac_gaussElem( const fglmVector newv, const fglmVector newp, number & newpdenom, number & newfac )
42    {
43    v= newv;
44    p= newp;
45    pdenom=newpdenom;
46    fac=newfac;
47        newpdenom= NULL;
48        newfac= NULL;
49    }
50#endif
51
52    ~gaussElem()
53    {
54        nDelete( & pdenom );
55        nDelete( & fac );
56    }
57};
58
59gaussReducer::gaussReducer( int dimen )
60{
61    int k;
62    size= 0;
63    max= dimen;
64#ifndef HAVE_EXPLICIT_CONSTR
65    elems= new gaussElem[ max+1 ];
66#else
67    elems= (gaussElem *)omAlloc( (max+1)*sizeof( gaussElem ) );
68#endif
69    isPivot= (BOOLEAN *)omAlloc( (max+1)*sizeof( BOOLEAN ) );
70    for ( k= max; k > 0; k-- )
71            isPivot[k]= FALSE;
72    perm= (int *)omAlloc( (max+1)*sizeof( int ) );
73}
74
75gaussReducer::~gaussReducer()
76{
77#ifndef HAVE_EXPLICIT_CONSTR
78    delete [] elems;
79#else
80    int k;
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.