29 #include "factory/factory.h"
51 #define STICKYPROT(msg) if (BTEST1(OPT_PROT)) Print(msg)
52 #define PROT2(msg,arg)
53 #define STICKYPROT2(msg,arg) if (BTEST1(OPT_PROT)) Print(msg,arg)
54 #define fglmASSERT(ignore1,ignore2)
92 void map( ring source );
127 for ( row= colp->
size-1, elemp= colp->
elems; row >= 0; row--, elemp++ )
159 for ( var= 0; var <
_nfunc; var ++ ) {
160 for ( col= 0, colp=
func[var]; col <
_size; col++, colp++ ) {
162 for ( row= colp->
size-1, elemp= colp->
elems; row >= 0;
167 elemp->
elem= newelem;
171 temp[ perm[var+1]-1 ]=
func[var];
194 fglmASSERT( 0 < divisors[0] && divisors[0] <=
_nfunc,
"wrong number of divisors" );
200 for (
k= divisors[0];
k > 0;
k-- ) {
215 fglmASSERT( 0 < divisors[0] && divisors[0] <=
_nfunc,
"wrong number of divisors" );
221 if ( numElems > 0 ) {
223 for (
k= 1,
l= 1, elemp= elems;
k <= numElems;
k++, elemp++ ) {
232 for (
k= divisors[0];
k > 0;
k-- ) {
235 colp->
size= numElems;
250 int vsize =
v.size();
253 for (
k= 1, colp=
func[var-1];
k <= vsize;
k++, colp++ ) {
256 for (
l= colp->
size-1, elemp= colp->
elems;
l >= 0;
l--, elemp++ ) {
258 number newelem=
nAdd(
result.getconstelem( elemp->
row ), temp );
277 for (
k= 1, colp=
func[var-1];
k <=
_size;
k++, colp++ ) {
280 for (
l= colp->
size-1, elemp= colp->
elems;
l >= 0;
l--, elemp++ ) {
282 number newelem=
nAdd(
result.getconstelem( elemp->
row ), temp );
309 #ifndef HAVE_EXPLICIT_CONSTR
396 #ifndef HAVE_EXPLICIT_CONSTR
411 #ifndef HAVE_EXPLICIT_CONSTR
447 #ifndef HAVE_EXPLICIT_CONSTR
460 #ifndef HAVE_EXPLICIT_CONSTR
486 poly newmonom =
NULL;
496 while ( list.
hasItem() && (!done) )
550 while (
m !=
NULL ) {
553 fglmASSERT(
num > 0,
"Error(1) in fglmSdata::getVectorRep" );
643 l.insertCols( candidate.
divisors, basis );
650 fglmASSERT( var > 0,
"this should never happen" );
658 l.endofConstruction();
679 return ( data.
state() );
692 return ( data.
state() );
731 #ifndef HAVE_EXPLICIT_CONSTR
740 #ifndef HAVE_EXPLICIT_CONSTR
741 void insertElem(
const fglmVector newv,
const fglmVector newp, number & newpdenom, number & newfac )
801 #ifndef HAVE_EXPLICIT_CONSTR
829 #ifndef HAVE_EXPLICIT_CONSTR
868 number
pivot=
v.getconstelem(
k );
885 #ifndef HAVE_EXPLICIT_CONSTR
896 poly newmonom =
NULL;
906 while ( list.
hasItem() && (!done) )
908 if ( (state=
pCmp( list.
getItem().monom, newmonom )) < 0 )
964 if ( !
nIsZero(
p.getconstelem(
k ) ) ) {
986 fglmASSERT( pdenom ==
NULL,
"pdenom in gaussreduce should be NULL" );
988 number vdenom =
v.clearDenom();
990 p.setelem(
p.size(), vdenom );
995 number
gcd =
v.gcd();
1006 if ( !
v.elemIsZero(
perm[
k] ) ) {
1009 v.nihilate( fac1, fac2,
gauss[
k].
v );
1011 temp=
nMult( fac2, pdenom );
1014 p.nihilate( fac1, fac2,
gauss[
k].
p );
1021 number
gcd =
v.gcd();
1061 if ( iv.isZero() ) {
1072 number nOne =
nInit( 1 );
1088 number pdenom =
NULL;
1148 number
gcd=
p.gcd();
1157 for (
k=
p.size();
k > 0;
k-- )
1159 number n =
nCopy(
p.getconstelem(
k ) );
1184 v=
l.multiply(
v,
i );
1206 if ( deleteIdeal ==
TRUE )
1209 if ( fglmok ==
TRUE )
1211 L.
map( sourceRing );
1214 if ( (switchBack) && (
currRing != initialRing) )
1220 fglmquot( ideal sourceIdeal, poly quot, ideal & destIdeal)
1230 if ( fglmok ==
TRUE ) {
1244 if ( fglmok ==
TRUE ) {
BOOLEAN dimension(leftv res, leftv args)
borderElem(poly p, fglmVector n)
fglmDelem nextCandidate()
void newGroebnerPoly(fglmVector &v, poly &p)
BOOLEAN candidatesLeft() const
void updateCandidates(poly m, const fglmVector v)
void gaussreduce(fglmVector &v, fglmVector &p, number &denom)
void newBasisElem(poly &m, fglmVector v, fglmVector p, number &denom)
BOOLEAN isBasisOrEdge() const
fglmDelem(poly &m, fglmVector mv, int v)
The new basis.
BOOLEAN candidatesLeft() const
fglmSdata(const ideal thisIdeal)
void newBorderElem(poly &m, fglmVector v)
poly getSpanPoly(int number) const
int newBasisElem(poly &p)
fglmVector getVectorRep(const poly m)
fglmSelem nextCandidate()
fglmVector getBorderDiv(const poly m, int &var) const
int getEdgeNumber(const poly m) const
fglmSelem(poly p, int var)
BOOLEAN isBasisOrEdge() const
int numNonZeroElems() const
number getconstelem(int i) const
void setelem(int i, number &n)
BOOLEAN reduce(fglmVector v)
fglmVector getDependence()
idealFunctionals(int blockSize, int numFuncs)
void insertCols(int *divisors, int to)
fglmVector multiply(const fglmVector v, int var) const
fglmVector addCols(const int var, int basisSize, const fglmVector v) const
matHeader * grow(int var)
oldGaussElem(const fglmVector newv, const fglmVector newp, number &newpdenom, number &newfac)
static FORCE_INLINE nMapFunc n_SetMap(const coeffs src, const coeffs dst)
set the mapping function pointers for translating numbers from src to dst
static FORCE_INLINE number n_SubringGcd(number a, number b, const coeffs r)
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
const Variable & v
< [in] a sqrfree bivariate poly
bool isZero(const CFArray &A)
checks if entries of A are zero
int comp(const CanonicalForm &A, const CanonicalForm &B)
compare polynomials
static ideal FindUnivariatePolys(const idealFunctionals &l)
#define fglmASSERT(ignore1, ignore2)
#define STICKYPROT2(msg, arg)
BOOLEAN fglmzero(ring sourceRing, ideal &sourceIdeal, ring destRing, ideal &destIdeal, BOOLEAN switchBack, BOOLEAN deleteIdeal)
static BOOLEAN CalculateFunctionals(const ideal &theIdeal, idealFunctionals &l)
BOOLEAN fglmquot(ideal sourceIdeal, poly quot, ideal &destIdeal)
static ideal GroebnerViaFunctionals(const idealFunctionals &l, fglmVector iv=fglmVector())
BOOLEAN FindUnivariateWrapper(ideal source, ideal &destIdeal)
void internalCalculateFunctionals(const ideal, idealFunctionals &l, fglmSdata &data)
#define idDelete(H)
delete an ideal
static intvec * idSort(ideal id, BOOLEAN nolex=TRUE)
#define idMaxIdeal(D)
initialise the maximal ideal (at 0)
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].
void maFindPerm(char const *const *const preim_names, int preim_n, char const *const *const preim_par, int preim_p, char const *const *const names, int n, char const *const *const par, int nop, int *perm, int *par_perm, n_coeffType ch)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
#define omFreeSize(addr, size)
#define omReallocSize(addr, o_size, size)
void pEnlargeSet(poly **p, int l, int increment)
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
void rChangeCurrRing(ring r)
Compatiblity layer for legacy polynomial operations (over currRing)
#define pSetCoeff(p, n)
deletes old coeff before setting the new one
#define pCmp(p1, p2)
pCmp: args may be NULL returns: (p2==NULL ? 1 : (p1 == NULL ? -1 : p_LmCmp(p1, p2)))
#define pLmDelete(p)
assume p != NULL, deletes Lm(p)->coef and Lm(p)
#define pGetExp(p, i)
Exponent.
void pNorm(poly p, const ring R=currRing)
#define pDivisibleBy(a, b)
returns TRUE, if leading monom of a divides leading monom of b i.e., if there exists a expvector c > ...
#define pCopy(p)
return a copy of the poly
static short rVar(const ring r)
#define rVar(r) (r->N)
ideal idInit(int idsize, int rank)
initialise an ideal / module
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size