My Project
UNKNOWN_GIT_VERSION
kernel
fglm
fglmgauss.cc
Go to the documentation of this file.
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
12
13
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
24
class
gaussElem
25
{
26
public
:
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
if
(
pdenom
!=
NULL
)
nDelete
( &
pdenom
);
54
if
(
fac
!=
NULL
)
nDelete
( &
fac
);
55
}
56
};
57
58
gaussReducer::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
74
gaussReducer::~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
89
BOOLEAN
90
gaussReducer::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_SubringGcd
(
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
159
void
160
gaussReducer::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
196
fglmVector
197
gaussReducer::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: ***
FALSE
#define FALSE
Definition:
auxiliary.h:94
omalloc.h
nNormalize
#define nNormalize(n)
Definition:
numbers.h:30
fglmVector::clearDenom
number clearDenom()
Definition:
fglmvec.cc:502
fglmVector::isZero
int isZero()
Definition:
fglmvec.cc:295
gaussReducer::elems
gaussElem * elems
Definition:
fglmgauss.h:20
k
int k
Definition:
cfEzgcd.cc:92
gaussReducer::reduce
BOOLEAN reduce(fglmVector v)
Definition:
fglmgauss.cc:89
result
return result
Definition:
facAbsBiFact.cc:76
nGreater
#define nGreater(a, b)
Definition:
numbers.h:28
ADDRESS
void * ADDRESS
Definition:
auxiliary.h:133
gaussReducer::gaussReducer
gaussReducer(int dimen)
Definition:
fglmgauss.cc:57
gaussReducer::isPivot
BOOLEAN * isPivot
Definition:
fglmgauss.h:21
fglmVector
Definition:
fglmvec.h:17
gaussElem::pdenom
number pdenom
Definition:
fglmgauss.cc:29
gaussElem::gaussElem
gaussElem(const fglmVector newv, const fglmVector newp, number &newpdenom, number &newfac)
Definition:
fglmgauss.cc:31
gaussReducer::size
int size
Definition:
fglmgauss.h:26
currRing
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition:
polys.cc:13
TRUE
#define TRUE
Definition:
auxiliary.h:98
nIsOne
#define nIsOne(n)
Definition:
numbers.h:25
fglmVector::setelem
void setelem(int i, number &n)
Definition:
fglmvec.cc:451
gaussElem::v
fglmVector v
Definition:
fglmgauss.cc:27
omFreeSize
#define omFreeSize(addr, size)
Definition:
omAllocDecl.h:258
gaussElem::fac
number fac
Definition:
fglmgauss.cc:30
BOOLEAN
int BOOLEAN
Definition:
auxiliary.h:85
structs.h
gaussReducer::perm
int * perm
Definition:
fglmgauss.h:22
mod2.h
fglmgauss.h
gaussReducer::~gaussReducer
~gaussReducer()
Definition:
fglmgauss.cc:73
pivot
bool pivot(const matrix aMat, const int r1, const int r2, const int c1, const int c2, int *bestR, int *bestC, const ring R)
This code computes a score for each non-zero matrix entry in aMat[r1..r2, c1..c2].
Definition:
linearAlgebra.cc:68
omAlloc
#define omAlloc(size)
Definition:
omAllocDecl.h:208
gaussReducer::max
int max
Definition:
fglmgauss.h:27
nDiv
#define nDiv(a, b)
Definition:
numbers.h:32
gaussElem::p
fglmVector p
Definition:
fglmgauss.cc:28
gaussReducer::getDependence
fglmVector getDependence()
Definition:
fglmgauss.cc:196
fglmVector::nihilate
void nihilate(const number fac1, const number fac2, const fglmVector v)
Definition:
fglmvec.cc:218
fglmVector::gcd
number gcd() const
Definition:
fglmvec.cc:458
nIsZero
#define nIsZero(n)
Definition:
numbers.h:19
ring.h
nMult
#define nMult(n1, n2)
Definition:
numbers.h:17
gaussReducer::v
fglmVector v
Definition:
fglmgauss.h:23
gaussReducer::store
void store()
Definition:
fglmgauss.cc:159
gaussReducer::p
fglmVector p
Definition:
fglmgauss.h:24
gaussElem
Definition:
fglmgauss.cc:23
NULL
#define NULL
Definition:
omList.c:9
fglmVector::getconstelem
number getconstelem(int i) const
Definition:
fglmvec.cc:446
nDelete
#define nDelete(n)
Definition:
numbers.h:16
n_SubringGcd
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
Definition:
coeffs.h:687
gcd
int gcd(int a, int b)
Definition:
walkSupport.cc:836
fglmvec.h
nInit
#define nInit(i)
Definition:
numbers.h:24
gaussElem::~gaussElem
~gaussElem()
Definition:
fglmgauss.cc:51
nCopy
#define nCopy(n)
Definition:
numbers.h:15
gaussReducer::pdenom
number pdenom
Definition:
fglmgauss.h:25
numbers.h
fglmVector::elemIsZero
int elemIsZero(int i)
Definition:
fglmvec.cc:300
fglmVector::size
int size() const
Definition:
fglmvec.cc:207
Generated on Thu Jan 9 2020 00:00:00 for My Project by
doxygen 1.8.16
for
Singular UNKNOWN_GIT_VERSION