1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
/*======================================================================
Ps <- APPEND(P,k,R)
Append.
\Input
\parm{P} is a list $(P_1,\ldots,P_r)$ where each $P_i$
is a list of distinct $i$--level integral polynomials, $ r > 0$.
\parm{k} is a positive $\beta$--integer, $k \leq r$.
\parm{R} is a list of $k$--variate integral polynomials
of positive degree in at least one variable.
\Output
\parm{P*} is a list $(P^*_1,\ldots,P^*_r)$ where each $P^*_i$
is a list obtained from $P_i$ by appending all the
$i$--level polynomials in $R$ if there are not
already there.
\SideEffect
\parm{P} is modified.
======================================================================*/
#include "qepcad.h"
BDigit PRJPNTEQUAL(Word A, Word B);
Word APPEND(Word P, Word k, Word R)
{
Word Ph,P1,Ph1,Ps,R1,Rp,Rp1,Rs1,i,ks,t;
Step1: /* Append. */
Ps = P; Rp = R;
while (Rp != NIL)
{
ADV(Rp,&R1,&Rp);
Rp1 = LELTI(R1,PO_POLY);
/* Projection points */
if (LELTI(R1,PO_TYPE) == PO_POINT) {
ks = LENGTH(Rp1);
Ph = LELTI(P,ks);
t = 0;
while (Ph != NIL)
{
ADV(Ph,&P1,&Ph);
Ph1 = LELTI(P1,PO_POLY);
if (LELTI(P1,PO_TYPE) == PO_POINT && PRJPNTEQUAL(Rp1,Ph1))
{
SLELTI(P1,PO_PARENT,CONC(LELTI(P1,PO_PARENT),LELTI(R1,PO_PARENT)));
t = 1;
break;
}
}
if (t == 0)
{
Ph = LELTI(P,ks);
i = LENGTH(Ph) + 1;
SLELTI(R1,PO_LABEL,LIST3(LFS("P"),ks,i));
Ph = SUFFIX(Ph,R1);
SLELTI(P,ks,Ph);
}
}
/* Projection polynomials */
else {
PSIMREP(k,Rp1,&ks,&Rs1);
Ph = LELTI(P,ks);
t = 0;
while (Ph != NIL)
{
ADV(Ph,&P1,&Ph);
Ph1 = LELTI(P1,PO_POLY);
if (LELTI(P1,PO_TYPE) != PO_POINT && EQUAL(Rs1,Ph1))
{
SLELTI(P1,PO_PARENT,CONC(LELTI(P1,PO_PARENT),LELTI(R1,PO_PARENT)));
t = 1;
break;
}
}
if (t == 0)
{
Ph = LELTI(P,ks);
i = LENGTH(Ph) + 1;
SLELTI(R1,PO_LABEL,LIST3(LFS("P"),ks,i));
SLELTI(R1,PO_POLY,Rs1);
Ph = SUFFIX(Ph,R1);
SLELTI(P,ks,Ph);
}
}
}
Return: /* Prepare for return. */
return(Ps);
}
|