| 130 | |
| 131 | |
| 132 | static ideal idSectWithElim (ideal h1,ideal h2, GbVariant alg) |
| 133 | // does not destroy h1,h2 |
| 134 | { |
| 135 | if (TEST_OPT_PROT) PrintS("intersect by elimination method\n"); |
| 136 | assume(!idIs0(h1)); |
| 137 | assume(!idIs0(h2)); |
| 138 | assume(IDELEMS(h1)<=IDELEMS(h2)); |
| 139 | assume(id_RankFreeModule(h1,currRing)==0); |
| 140 | assume(id_RankFreeModule(h2,currRing)==0); |
| 141 | // add a new variable: |
| 142 | int j; |
| 143 | ring origRing=currRing; |
| 144 | ring r=rCopy0(origRing); |
| 145 | r->N++; |
| 146 | r->block0[0]=1; |
| 147 | r->block1[0]= r->N; |
| 148 | omFree(r->order); |
| 149 | r->order=(rRingOrder_t*)omAlloc0(3*sizeof(rRingOrder_t)); |
| 150 | r->order[0]=ringorder_dp; |
| 151 | r->order[1]=ringorder_C; |
| 152 | char **names=(char**)omAlloc0(rVar(r) * sizeof(char_ptr)); |
| 153 | for (j=0;j<r->N-1;j++) names[j]=r->names[j]; |
| 154 | names[r->N-1]=omStrDup("@"); |
| 155 | omFree(r->names); |
| 156 | r->names=names; |
| 157 | rComplete(r,TRUE); |
| 158 | // fetch h1, h2 |
| 159 | ideal h; |
| 160 | h1=idrCopyR(h1,origRing,r); |
| 161 | h2=idrCopyR(h2,origRing,r); |
| 162 | // switch to temp. ring r |
| 163 | rChangeCurrRing(r); |
| 164 | // create 1-t, t |
| 165 | poly omt=p_One(currRing); |
| 166 | p_SetExp(omt,r->N,1,currRing); |
| 167 | p_Setm(omt,currRing); |
| 168 | poly t=p_Copy(omt,currRing); |
| 169 | omt=p_Neg(omt,currRing); |
| 170 | omt=p_Add_q(omt,pOne(),currRing); |
| 171 | // compute (1-t)*h1 |
| 172 | h1=(ideal)mp_MultP((matrix)h1,omt,currRing); |
| 173 | // compute t*h2 |
| 174 | h2=(ideal)mp_MultP((matrix)h2,pCopy(t),currRing); |
| 175 | // (1-t)h1 + t*h2 |
| 176 | h=idInit(IDELEMS(h1)+IDELEMS(h2),1); |
| 177 | int l; |
| 178 | for (l=IDELEMS(h1)-1; l>=0; l--) |
| 179 | { |
| 180 | h->m[l] = h1->m[l]; h1->m[l]=NULL; |
| 181 | } |
| 182 | j=IDELEMS(h1); |
| 183 | for (l=IDELEMS(h2)-1; l>=0; l--) |
| 184 | { |
| 185 | h->m[l+j] = h2->m[l]; h2->m[l]=NULL; |
| 186 | } |
| 187 | idDelete(&h1); |
| 188 | idDelete(&h2); |
| 189 | // eliminate t: |
no test coverage detected