My Project
Loading...
Searching...
No Matches
Functions
sca.h File Reference
#include "polys/nc/nc.h"
#include "misc/intvec.h"

Go to the source code of this file.

Functions

ideal SCAQuotient (const ring r)
 
static short scaFirstAltVar (ring r)
 
static short scaLastAltVar (ring r)
 
static void scaFirstAltVar (ring r, short n)
 
static void scaLastAltVar (ring r, short n)
 
poly sca_pp_Mult_xi_pp (short i, const poly pPoly, const ring rRing)
 
bool p_IsBiHomogeneous (const poly p, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, int &dx, int &dy, const ring r)
 
bool id_IsBiHomogeneous (const ideal id, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, const ring r)
 
intvecivGetSCAXVarWeights (const ring r)
 
intvecivGetSCAYVarWeights (const ring r)
 
static bool p_IsSCAHomogeneous (const poly p, const intvec *wCx, const intvec *wCy, const ring r)
 
static bool id_IsSCAHomogeneous (const ideal id, const intvec *wCx, const intvec *wCy, const ring r)
 
poly p_KillSquares (const poly p, const short iFirstAltVar, const short iLastAltVar, const ring r)
 
ideal id_KillSquares (const ideal id, const short iFirstAltVar, const short iLastAltVar, const ring r, const bool bSkipZeroes=false)
 
bool sca_Force (ring rGR, int b, int e)
 
void sca_p_ProcsSet (ring rGR, p_Procs_s *p_Procs)
 
bool sca_SetupQuotient (ring rGR, ring rG, bool bCopy)
 

Function Documentation

◆ id_IsBiHomogeneous()

bool id_IsBiHomogeneous ( const ideal  id,
const intvec wx,
const intvec wy,
const intvec wCx,
const intvec wCy,
const ring  r 
)

Definition at line 1359 of file sca.cc.

1363{
1364 if (id == NULL) return true; // zero ideal
1365
1366 const int iSize = IDELEMS(id);
1367
1368 if (iSize == 0) return true;
1369
1370 bool b = true;
1371 int x, y;
1372
1373 for(int i = iSize - 1; (i >= 0 ) && b; i--)
1374 b = p_IsBiHomogeneous(id->m[i], wx, wy, wCx, wCy, x, y, r);
1375
1376 return b;
1377}
int i
Definition: cfEzgcd.cc:132
Variable x
Definition: cfModGcd.cc:4082
CanonicalForm b
Definition: cfModGcd.cc:4103
const CanonicalForm int const CFList const Variable & y
Definition: facAbsFact.cc:53
bool p_IsBiHomogeneous(const poly p, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, int &dx, int &dy, const ring r)
Definition: sca.cc:1320
#define NULL
Definition: omList.c:12
#define IDELEMS(i)
Definition: simpleideals.h:23

◆ id_IsSCAHomogeneous()

static bool id_IsSCAHomogeneous ( const ideal  id,
const intvec wCx,
const intvec wCy,
const ring  r 
)
inlinestatic

Definition at line 115 of file sca.h.

118{
119 // inefficient! don't use it in time-critical code!
122
123 bool homog = id_IsBiHomogeneous( id, wx, wy, wCx, wCy, r );
124
125 delete wx;
126 delete wy;
127
128 return homog;
129}
Definition: intvec.h:23
intvec * ivGetSCAXVarWeights(const ring r)
Definition: sca.cc:1383
intvec * ivGetSCAYVarWeights(const ring r)
Definition: sca.cc:1411
bool id_IsBiHomogeneous(const ideal id, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, const ring r)
Definition: sca.cc:1359

◆ id_KillSquares()

ideal id_KillSquares ( const ideal  id,
const short  iFirstAltVar,
const short  iLastAltVar,
const ring  r,
const bool  bSkipZeroes = false 
)

Definition at line 1520 of file sca.cc.

1523{
1524 if (id == NULL) return id; // zero ideal
1525
1526 assume( (iFirstAltVar >= 1) && (iLastAltVar <= rVar(r)) && (iFirstAltVar <= iLastAltVar) );
1527
1528 const int iSize = IDELEMS(id);
1529
1530 if (iSize == 0) return id;
1531
1532 ideal temp = idInit(iSize, id->rank);
1533
1534#if 0
1535 PrintS("<id_KillSquares>\n");
1536 {
1537 PrintS("ideal id: \n");
1538 for (unsigned int i = 0; i < IDELEMS(id); i++)
1539 {
1540 Print("; id[%d] = ", i+1);
1541 p_Write(id->m[i], r);
1542 }
1543 PrintS(";\n");
1544 PrintLn();
1545 }
1546#endif
1547
1548
1549 for (int j = 0; j < iSize; j++)
1550 temp->m[j] = p_KillSquares(id->m[j], iFirstAltVar, iLastAltVar, r);
1551
1552 if( bSkipZeroes )
1553 idSkipZeroes(temp);
1554
1555#if 0
1556 PrintS("<id_KillSquares>\n");
1557 {
1558 PrintS("ideal temp: \n");
1559 for (int i = 0; i < IDELEMS(temp); i++)
1560 {
1561 Print("; temp[%d] = ", i+1);
1562 p_Write(temp->m[i], r);
1563 }
1564 PrintS(";\n");
1565 PrintLn();
1566 }
1567 PrintS("</id_KillSquares>\n");
1568#endif
1569
1570// temp->rank = idRankFreeModule(temp, r);
1571
1572 return temp;
1573}
#define Print
Definition: emacs.cc:80
int j
Definition: facHensel.cc:110
poly p_KillSquares(const poly p, const short iFirstAltVar, const short iLastAltVar, const ring r)
Definition: sca.cc:1465
#define assume(x)
Definition: mod2.h:389
void p_Write(poly p, ring lmRing, ring tailRing)
Definition: polys0.cc:342
void PrintS(const char *s)
Definition: reporter.cc:284
void PrintLn()
Definition: reporter.cc:310
static short rVar(const ring r)
#define rVar(r) (r->N)
Definition: ring.h:592
ideal idInit(int idsize, int rank)
initialise an ideal / module
Definition: simpleideals.cc:35
void idSkipZeroes(ideal ide)
gives an ideal/module the minimal possible size

◆ ivGetSCAXVarWeights()

intvec * ivGetSCAXVarWeights ( const ring  r)

Definition at line 1383 of file sca.cc.

1384{
1385 const unsigned int N = r->N;
1386
1387 const int CommutativeVariable = 0; // bug correction!
1388 const int AntiCommutativeVariable = 0;
1389
1390 intvec* w = new intvec(N, 1, CommutativeVariable);
1391
1392 if(AntiCommutativeVariable != CommutativeVariable)
1393 if( rIsSCA(r) )
1394 {
1395 const unsigned int m_iFirstAltVar = scaFirstAltVar(r);
1396 const unsigned int m_iLastAltVar = scaLastAltVar(r);
1397
1398 for (unsigned int i = m_iFirstAltVar; i<= m_iLastAltVar; i++)
1399 {
1400 (*w)[i-1] = AntiCommutativeVariable;
1401 }
1402 }
1403
1404 return w;
1405}
const CanonicalForm CFMap CFMap & N
Definition: cfEzgcd.cc:56
const CanonicalForm & w
Definition: facAbsFact.cc:51
static bool rIsSCA(const ring r)
Definition: nc.h:190
static short scaLastAltVar(ring r)
Definition: sca.h:25
static short scaFirstAltVar(ring r)
Definition: sca.h:18

◆ ivGetSCAYVarWeights()

intvec * ivGetSCAYVarWeights ( const ring  r)

Definition at line 1411 of file sca.cc.

1412{
1413 const unsigned int N = r->N;
1414
1415 const int CommutativeVariable = 0;
1416 const int AntiCommutativeVariable = 1;
1417
1418 intvec* w = new intvec(N, 1, CommutativeVariable);
1419
1420 if(AntiCommutativeVariable != CommutativeVariable)
1421 if( rIsSCA(r) )
1422 {
1423 const unsigned int m_iFirstAltVar = scaFirstAltVar(r);
1424 const unsigned int m_iLastAltVar = scaLastAltVar(r);
1425
1426 for (unsigned int i = m_iFirstAltVar; i<= m_iLastAltVar; i++)
1427 {
1428 (*w)[i-1] = AntiCommutativeVariable;
1429 }
1430 }
1431 return w;
1432}

◆ p_IsBiHomogeneous()

bool p_IsBiHomogeneous ( const poly  p,
const intvec wx,
const intvec wy,
const intvec wCx,
const intvec wCy,
int &  dx,
int &  dy,
const ring  r 
)

Definition at line 1320 of file sca.cc.

1325{
1326 if( p == NULL )
1327 {
1328 dx = 0;
1329 dy = 0;
1330 return true;
1331 }
1332
1333 poly q = p;
1334
1335
1336 int ddx, ddy;
1337
1338 m_GetBiDegree( q, wx, wy, wCx, wCy, ddx, ddy, r); // get bi degree of lm(p)
1339
1340 pIter(q);
1341
1342 for(; q != NULL; pIter(q) )
1343 {
1344 int x, y;
1345
1346 m_GetBiDegree( q, wx, wy, wCx, wCy, x, y, r); // get bi degree of q
1347
1348 if ( (x != ddx) || (y != ddy) ) return false;
1349 }
1350
1351 dx = ddx;
1352 dy = ddy;
1353
1354 return true;
1355}
int p
Definition: cfModGcd.cc:4078
static void m_GetBiDegree(const poly m, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, int &dx, int &dy, const ring r)
Definition: sca.cc:1275
#define pIter(p)
Definition: monomials.h:37

◆ p_IsSCAHomogeneous()

static bool p_IsSCAHomogeneous ( const poly  p,
const intvec wCx,
const intvec wCy,
const ring  r 
)
inlinestatic

Definition at line 96 of file sca.h.

99{
100 // inefficient! don't use it in time-critical code!
103
104 int x,y;
105
106 bool homog = p_IsBiHomogeneous( p, wx, wy, wCx, wCy, x, y, r );
107
108 delete wx;
109 delete wy;
110
111 return homog;
112}
bool p_IsBiHomogeneous(const poly p, const intvec *wx, const intvec *wy, const intvec *wCx, const intvec *wCy, int &dx, int &dy, const ring r)
Definition: sca.cc:1320

◆ p_KillSquares()

poly p_KillSquares ( const poly  p,
const short  iFirstAltVar,
const short  iLastAltVar,
const ring  r 
)

Definition at line 1465 of file sca.cc.

1468{
1469#ifdef PDEBUG
1470 p_Test(p, r);
1471
1472 assume( (iFirstAltVar >= 1) && (iLastAltVar <= r->N) && (iFirstAltVar <= iLastAltVar) );
1473
1474#if 0
1475 PrintS("p_KillSquares, p = "); // !
1476 p_Write(p, r);
1477#endif
1478#endif
1479
1480
1481 if( p == NULL )
1482 return NULL;
1483
1484 poly pResult = NULL;
1485 poly* ppPrev = &pResult;
1486
1487 for( poly q = p; q!= NULL; pIter(q) )
1488 {
1489#ifdef PDEBUG
1490 p_Test(q, r);
1491#endif
1492
1493 // terms will be in the same order because of quasi-ordering!
1494 poly v = m_KillSquares(q, iFirstAltVar, iLastAltVar, r);
1495
1496 if( v != NULL )
1497 {
1498 *ppPrev = v;
1499 ppPrev = &pNext(v);
1500 }
1501
1502 }
1503
1504#ifdef PDEBUG
1505 p_Test(pResult, r);
1506#if 0
1507 PrintS("p_KillSquares => "); // !
1508 p_Write(pResult, r);
1509#endif
1510#endif
1511
1512 return(pResult);
1513}
const Variable & v
< [in] a sqrfree bivariate poly
Definition: facBivar.h:39
static poly m_KillSquares(const poly m, const short iFirstAltVar, const short iLastAltVar, const ring r)
Definition: sca.cc:1439
#define pNext(p)
Definition: monomials.h:36
#define p_Test(p, r)
Definition: p_polys.h:159

◆ sca_Force()

bool sca_Force ( ring  rGR,
int  b,
int  e 
)

Definition at line 1161 of file sca.cc.

1162{
1163 assume(rGR != NULL);
1164 assume(rIsPluralRing(rGR));
1165 assume(!rIsSCA(rGR));
1166
1167 const int N = rGR->N;
1168
1169// ring rSaveRing = currRing;
1170// if(rSaveRing != rGR)
1171// rChangeCurrRing(rGR);
1172
1173 const ideal idQuotient = rGR->qideal;
1174
1175 ideal tempQ = idQuotient;
1176
1177 if( b <= N && e >= 1 )
1178 tempQ = id_KillSquares(idQuotient, b, e, rGR);
1179
1180 idSkipZeroes( tempQ );
1181
1182 ncRingType( rGR, nc_exterior );
1183
1184 if( idIs0(tempQ) )
1185 rGR->GetNC()->SCAQuotient() = NULL;
1186 else
1187 rGR->GetNC()->SCAQuotient() = tempQ;
1188
1189
1190 scaFirstAltVar( rGR, b );
1191 scaLastAltVar( rGR, e );
1192
1193
1194 nc_p_ProcsSet(rGR, rGR->p_Procs);
1195
1196// if(rSaveRing != rGR)
1197// rChangeCurrRing(rSaveRing);
1198
1199 return true;
1200}
BOOLEAN idIs0(ideal h)
returns true if h is the zero ideal
void nc_p_ProcsSet(ring rGR, p_Procs_s *p_Procs)
Definition: old.gring.cc:3187
@ nc_exterior
Definition: nc.h:21
static nc_type & ncRingType(nc_struct *p)
Definition: nc.h:159
ideal id_KillSquares(const ideal id, const short iFirstAltVar, const short iLastAltVar, const ring r, const bool bSkipZeroes)
Definition: sca.cc:1520
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
Definition: ring.h:400

◆ sca_p_ProcsSet()

void sca_p_ProcsSet ( ring  rGR,
p_Procs_s p_Procs 
)

Definition at line 1225 of file sca.cc.

1226{
1227
1228 // "commutative" procedures:
1229 rGR->p_Procs->p_Mult_mm = sca_p_Mult_mm;
1230 rGR->p_Procs->pp_Mult_mm = sca_pp_Mult_mm;
1231
1232 p_Procs->p_Mult_mm = sca_p_Mult_mm;
1233 p_Procs->pp_Mult_mm = sca_pp_Mult_mm;
1234
1235 // non-commutaitve
1236 p_Procs->p_mm_Mult = sca_p_mm_Mult;
1237 p_Procs->pp_mm_Mult = sca_pp_mm_Mult;
1238
1239// rGR->GetNC()->p_Procs.SPoly = sca_SPoly;
1240// rGR->GetNC()->p_Procs.ReduceSPoly = sca_ReduceSpoly;
1241
1242#if 0
1243
1244 // Multiplication procedures:
1245
1246 p_Procs->p_Mult_mm = sca_p_Mult_mm;
1247 _p_procs->p_Mult_mm = sca_p_Mult_mm;
1248
1249 p_Procs->pp_Mult_mm = sca_pp_Mult_mm;
1250 _p_procs->pp_Mult_mm = sca_pp_Mult_mm;
1251
1252 r->GetNC()->mmMultP() = sca_mm_Mult_p;
1253 r->GetNC()->mmMultPP() = sca_mm_Mult_pp;
1254
1255/*
1256 // ??????????????????????????????????????? coefficients swell...
1257 r->GetNC()->SPoly() = sca_SPoly;
1258 r->GetNC()->ReduceSPoly() = sca_ReduceSpoly;
1259*/
1260// r->GetNC()->BucketPolyRed() = gnc_kBucketPolyRed;
1261// r->GetNC()->BucketPolyRed_Z()= gnc_kBucketPolyRed_Z;
1262#endif
1263
1264 // local ordering => Mora, otherwise - Buchberger!
1265 if (rHasLocalOrMixedOrdering(rGR))
1266 rGR->GetNC()->p_Procs.GB = cast_A_to_vptr(sca_mora);
1267 else
1268 rGR->GetNC()->p_Procs.GB = cast_A_to_vptr(sca_bba); // sca_gr_bba?
1269}
void * cast_A_to_vptr(A a)
Definition: auxiliary.h:385
EXTERN_VAR BBA_Proc sca_mora
Definition: gb_hack.h:10
EXTERN_VAR BBA_Proc sca_bba
Definition: gb_hack.h:10
static poly sca_p_mm_Mult(poly pPoly, const poly pMonom, const ring rRing)
Definition: sca.cc:635
poly sca_pp_Mult_mm(const poly pPoly, const poly pMonom, const ring rRing, poly &)
poly sca_p_Mult_mm(poly pPoly, const poly pMonom, const ring rRing)
Definition: sca.cc:371
static poly sca_pp_mm_Mult(const poly pPoly, const poly pMonom, const ring rRing)
Definition: sca.cc:567
STATIC_VAR p_Procs_s * _p_procs
Definition: p_Procs_Set.h:116
BOOLEAN rHasLocalOrMixedOrdering(const ring r)
Definition: ring.h:760

◆ sca_pp_Mult_xi_pp()

poly sca_pp_Mult_xi_pp ( short  i,
const poly  pPoly,
const ring  rRing 
)

Definition at line 1203 of file sca.cc.

1204{
1205 assume(1 <= i);
1206 assume(i <= rVar(rRing));
1207
1208 if(rIsSCA(rRing))
1209 return sca_xi_Mult_pp(i, pPoly, rRing);
1210
1211
1212
1213 poly xi = p_One( rRing);
1214 p_SetExp(xi, i, 1, rRing);
1215 p_Setm(xi, rRing);
1216
1217 poly pResult = pp_Mult_qq(xi, pPoly, rRing);
1218
1219 p_Delete( &xi, rRing);
1220
1221 return pResult;
1222
1223}
static poly sca_xi_Mult_pp(short i, const poly pPoly, const ring rRing)
Definition: sca.cc:523
poly p_One(const ring r)
Definition: p_polys.cc:1313
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent @Note: VarOffset encodes the position in p->exp
Definition: p_polys.h:486
static void p_Setm(poly p, const ring r)
Definition: p_polys.h:231
static void p_Delete(poly *p, const ring r)
Definition: p_polys.h:899
static poly pp_Mult_qq(poly p, poly q, const ring r)
Definition: p_polys.h:1149

◆ sca_SetupQuotient()

bool sca_SetupQuotient ( ring  rGR,
ring  rG,
bool  bCopy 
)

Definition at line 911 of file sca.cc.

912{
913
914 //////////////////////////////////////////////////////////////////////////
915 // checks...
916 //////////////////////////////////////////////////////////////////////////
917 if( rG == NULL )
918 rG = rGR;
919
920 assume(rGR != NULL);
921 assume(rG != NULL);
923
924#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
925 PrintS("sca_SetupQuotient(rGR, rG, bCopy)");
926
927 {
928 PrintS("\nrG: \n"); rWrite(rG);
929 PrintS("\nrGR: \n"); rWrite(rGR);
930 PrintLn();
931 }
932#endif
933
934
935 if(bCopy)
936 {
937 if(rIsSCA(rG) && (rG != rGR))
938 return sca_Force(rGR, scaFirstAltVar(rG), scaLastAltVar(rG));
939 else
940 return false;
941 }
942
943 assume(!bCopy);
944
945 const int N = rG->N;
946
947 if(N < 2)
948 return false;
949
950
951// if( (ncRingType(rG) != nc_skew) || (ncRingType(rG) != nc_comm) )
952// return false;
953
954#if OUTPUT
955 PrintS("sca_SetupQuotient: qring?\n");
956#endif
957
958 if(rGR->qideal == NULL) // there should be a factor!
959 return false;
960
961#if OUTPUT
962 PrintS("sca_SetupQuotient: qideal!!!\n");
963#endif
964
965// if((rG->qideal != NULL) && (rG != rGR) ) // we cannot change from factor to factor at the time, sorry!
966// return false;
967
968
969 int iAltVarEnd = -1;
970 int iAltVarStart = N+1;
971
972 const nc_struct* NC = rG->GetNC();
973 const ring rBase = rG; //NC->basering;
974 const matrix C = NC->C; // live in rBase!
975 const matrix D = NC->D; // live in rBase!
976
977#if OUTPUT
978 PrintS("sca_SetupQuotient: AltVars?!\n");
979#endif
980
981 for(int i = 1; i < N; i++)
982 {
983 for(int j = i + 1; j <= N; j++)
984 {
985 if( MATELEM(D,i,j) != NULL) // !!!???
986 {
987#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
988 Print("Nonzero D[%d, %d]\n", i, j);
989#endif
990 return false;
991 }
992
993
994 assume(MATELEM(C,i,j) != NULL); // after CallPlural!
995 number c = p_GetCoeff(MATELEM(C,i,j), rBase);
996
997 if( n_IsMOne(c, rBase->cf) ) // !!!???
998 {
999 if( i < iAltVarStart)
1000 iAltVarStart = i;
1001
1002 if( j > iAltVarEnd)
1003 iAltVarEnd = j;
1004 } else
1005 {
1006 if( !n_IsOne(c, rBase->cf) )
1007 {
1008#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1009 Print("Wrong Coeff at: [%d, %d]\n", i, j);
1010#endif
1011 return false;
1012 }
1013 }
1014 }
1015 }
1016
1017#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1018 Print("AltVars?1: [%d, %d]\n", iAltVarStart, iAltVarEnd);
1019#endif
1020
1021
1022 if( (iAltVarEnd == -1) || (iAltVarStart == (N+1)) )
1023 return false; // either no alternating varables, or a single one => we are in commutative case!
1024
1025
1026 for(int i = 1; i < N; i++)
1027 {
1028 for(int j = i + 1; j <= N; j++)
1029 {
1030 assume(MATELEM(C,i,j) != NULL); // after CallPlural!
1031 number c = p_GetCoeff(MATELEM(C,i,j), rBase);
1032
1033 if( (iAltVarStart <= i) && (j <= iAltVarEnd) ) // S <= i < j <= E
1034 { // anticommutative part
1035 if( !n_IsMOne(c, rBase->cf) )
1036 {
1037#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1038 Print("Wrong Coeff at: [%d, %d]\n", i, j);
1039#endif
1040 return false;
1041 }
1042 }
1043 else
1044 { // should commute
1045 if( !n_IsOne(c, rBase->cf) )
1046 {
1047#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1048 Print("Wrong Coeff at: [%d, %d]\n", i, j);
1049#endif
1050 return false;
1051 }
1052 }
1053 }
1054 }
1055
1056#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1057 Print("AltVars!?: [%d, %d]\n", iAltVarStart, iAltVarEnd);
1058#endif
1059
1060 assume( 1 <= iAltVarStart );
1061 assume( iAltVarStart < iAltVarEnd );
1062 assume( iAltVarEnd <= N );
1063
1064
1065// ring rSaveRing = assureCurrentRing(rG);
1066
1067
1068 assume(rGR->qideal != NULL);
1069 assume(rGR->N == rG->N);
1070// assume(rG->qideal == NULL); // ?
1071
1072 const ideal idQuotient = rGR->qideal;
1073
1074
1075#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1076 PrintS("Analyzing quotient ideal:\n");
1077 idPrint(idQuotient); // in rG!!!
1078#endif
1079
1080
1081 // check for
1082 // y_{iAltVarStart}^2, y_{iAltVarStart+1}^2, \ldots, y_{iAltVarEnd}^2 (iAltVarEnd > iAltVarStart)
1083 // to be within quotient ideal.
1084
1085 int b = N+1;
1086 int e = -1;
1087
1088 if(rIsSCA(rG))
1089 {
1090 b = si_min(b, scaFirstAltVar(rG));
1091 e = si_max(e, scaLastAltVar(rG));
1092
1093#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1094 Print("AltVars!?: [%d, %d]\n", b, e);
1095#endif
1096 }
1097
1098 for ( int i = iAltVarStart; (i <= iAltVarEnd); i++ )
1099 if( (i < b) || (i > e) ) // otherwise it's ok since rG is an SCA!
1100 {
1101 poly square = p_One( rG);
1102 p_SetExp(square, i, 2, rG); // square = var(i)^2.
1103 p_Setm(square, rG);
1104
1105 // square = NF( var(i)^2 | Q )
1106 // NOTE: there is no better way to check this in general!
1107 square = nc_NF(idQuotient, NULL, square, 0, 1, rG); // must ran in currRing == rG!
1108
1109 if( square != NULL ) // var(i)^2 is not in Q?
1110 {
1111 p_Delete(&square, rG);
1112 return false;
1113 }
1114 }
1115
1116#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1117 Print("ScaVars!: [%d, %d]\n", iAltVarStart, iAltVarEnd);
1118#endif
1119
1120
1121 //////////////////////////////////////////////////////////////////////////
1122 // ok... here we go. let's setup it!!!
1123 //////////////////////////////////////////////////////////////////////////
1124 ideal tempQ = id_KillSquares(idQuotient, iAltVarStart, iAltVarEnd, rG); // in rG!!!
1125
1126
1127#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1128 PrintS("Quotient: \n");
1129 iiWriteMatrix((matrix)idQuotient,"__",1, rG, 0);
1130 PrintS("tempSCAQuotient: \n");
1131 iiWriteMatrix((matrix)tempQ,"__",1, rG, 0);
1132#endif
1133
1134 idSkipZeroes( tempQ );
1135
1136 ncRingType( rGR, nc_exterior );
1137
1138 scaFirstAltVar( rGR, iAltVarStart );
1139 scaLastAltVar( rGR, iAltVarEnd );
1140
1141 if( idIs0(tempQ) )
1142 rGR->GetNC()->SCAQuotient() = NULL;
1143 else
1144 rGR->GetNC()->SCAQuotient() = idrMoveR(tempQ, rG, rGR); // deletes tempQ!
1145
1146 nc_p_ProcsSet(rGR, rGR->p_Procs); // !!!!!!!!!!!!!!!!!
1147
1148
1149#if ((defined(PDEBUG) && OUTPUT) || MYTEST)
1150 PrintS("SCAQuotient: \n");
1151 if(tempQ != NULL)
1152 iiWriteMatrix((matrix)tempQ,"__",1, rGR, 0);
1153 else
1154 PrintS("(NULL)\n");
1155#endif
1156
1157 return true;
1158}
static int si_max(const int a, const int b)
Definition: auxiliary.h:124
static int si_min(const int a, const int b)
Definition: auxiliary.h:125
static FORCE_INLINE BOOLEAN n_IsMOne(number n, const coeffs r)
TRUE iff 'n' represents the additive inverse of the one element, i.e. -1.
Definition: coeffs.h:469
static FORCE_INLINE BOOLEAN n_IsOne(number n, const coeffs r)
TRUE iff 'n' represents the one element.
Definition: coeffs.h:465
EXTERN_VAR NF_Proc nc_NF
Definition: gb_hack.h:9
#define D(A)
Definition: gentable.cc:131
#define idPrint(id)
Definition: ideals.h:46
bool sca_Force(ring rGR, int b, int e)
Definition: sca.cc:1161
void iiWriteMatrix(matrix im, const char *n, int dim, const ring r, int spaces)
set spaces to zero by default
Definition: matpol.cc:827
#define MATELEM(mat, i, j)
1-based access to matrix
Definition: matpol.h:29
#define p_GetCoeff(p, r)
Definition: monomials.h:50
ideal idrMoveR(ideal &id, ring src_r, ring dest_r)
Definition: prCopy.cc:248
void rWrite(ring r, BOOLEAN details)
Definition: ring.cc:226
Definition: nc.h:68
matrix C
Definition: nc.h:75
matrix D
Definition: nc.h:76

◆ scaFirstAltVar() [1/2]

static short scaFirstAltVar ( ring  r)
inlinestatic

Definition at line 18 of file sca.h.

19{
20 assume(rIsSCA(r));
21
22 return (r->GetNC()->FirstAltVar());
23}

◆ scaFirstAltVar() [2/2]

static void scaFirstAltVar ( ring  r,
short  n 
)
inlinestatic

Definition at line 34 of file sca.h.

35{
36 assume(rIsSCA(r));
37
38 r->GetNC()->FirstAltVar() = n;
39}

◆ scaLastAltVar() [1/2]

static short scaLastAltVar ( ring  r)
inlinestatic

Definition at line 25 of file sca.h.

26{
27 assume(rIsSCA(r));
28
29 return (r->GetNC()->LastAltVar());
30}

◆ scaLastAltVar() [2/2]

static void scaLastAltVar ( ring  r,
short  n 
)
inlinestatic

Definition at line 41 of file sca.h.

42{
43 assume(rIsSCA(r));
44
45 r->GetNC()->LastAltVar() = n;
46}

◆ SCAQuotient()

ideal SCAQuotient ( const ring  r)
inline

Definition at line 10 of file sca.h.

11{
12 assume(rIsSCA(r));
13 return r->GetNC()->SCAQuotient();
14}