164 for (i= 0; i <
j; i++)
165 storeFactors [i]=
new CFArray* [2];
173 for (i= 1; i <
j; i++)
183 evaluation.
getLast(), uniFactors);
184 for (i= j - 1; i > 0; i--)
190 moreBiFactors[i-1].length()-uniFactors.
length()+1,
195 eval[i], uniFactors);
199 tmp=
normalize (biFactors, normalizingFactors[0]);
203 for (i= j - 1; i > 0; i--)
205 tmp=
normalize (moreBiFactors [i-1], normalizingFactors [i]);
212 int k,
l,
m, mm,
count, sizeOfUniFactors= 0;
213 int*** seperator=
new int** [
j];
216 for (i= 0; i <
j; i++)
220 for (i= 0; i <
j; i++)
223 for (l= 0; l < storeFactors [
i][0][
k].
size() - 1; l++)
225 if (
degree (storeFactors[i][0][k][l], x) <
226 degree (storeFactors[i][0][k][l+1], x))
230 sizeOfUniFactors=
count;
231 else if (sizeOfUniFactors != count)
233 for (m= 0; m <
j; m++)
235 delete [] storeFactors [
m] [0];
236 delete [] storeFactors [
m] [1];
237 delete [] storeFactors [
m];
238 for (mm= 0; mm <
k; mm++)
239 delete [] seperator [m][mm];
240 delete [] seperator [
m];
242 delete [] storeFactors;
246 seperator [
i][
k]=
new int [count + 3];
247 seperator [
i][
k][0]= count + 1;
248 seperator [
i][
k][1]= 0;
250 for (l= 0; l < storeFactors [
i][0][
k].
size() - 1; l++)
252 if (
degree (storeFactors[i][0][k][l], x) <
253 degree (storeFactors[i][0][k][l+1], x))
266 int maxTerms,
n, index1, index2, mmm,
found, columns, oneCount;
272 sizeOfUniFactors= seperator [0][
k][0];
273 for (n= 1; n <= sizeOfUniFactors; n++)
278 for (i= j - 1; i >= 0; i--)
280 if (maxTerms < seperator[i][k][n+1]-seperator[i][k][n])
282 maxTerms= seperator[
i][
k][n + 1]-seperator[
i][
k][
n];
286 for (i= j - 1; i >= 0; i--)
290 columns += seperator [
i][
k][n+1]-seperator[
i][
k][
n];
292 mat=
new int *[maxTerms];
294 for (m= seperator[index1][k][n]; m < seperator[index1][
k][n+1]; m++, mm++)
296 tmp1= storeFactors [index1][1][
k][
m];
297 mat[mm]=
new int [columns];
298 for (i= 0; i < columns; i++)
301 for (i= j - 1; i >= 0; i--)
306 if ((found=
search (storeFactors[i][1][k], tmp1,
307 seperator[i][k][n], seperator[i][k][n+1])) >= 0)
308 mat[mm][index2 + found - seperator [
i][
k][
n]]= 1;
309 index2 += seperator [
i][
k][n+1]-seperator[
i][
k][
n];
314 for (i= j - 1; i >= 0; i--)
319 for (mm= 0; mm < seperator [
i][
k][n + 1] - seperator [
i][
k][
n]; mm++)
321 for (m= 0; m < maxTerms; m++)
323 if (mat[m][mm+index2] == 1)
327 if (oneCount == seperator [i][k][n+1]-seperator[i][k][n] - 1)
329 for (mm= 0; mm < seperator [
i][
k][n+1]-seperator[
i][
k][
n]; mm++)
332 for (m= 0; m < maxTerms; m++)
333 if (mat[m][mm+index2] == 1)
337 for (m= 0; m < maxTerms; m++)
340 for (mmm= 0; mmm < seperator[
i][
k][n+1]-seperator[
i][
k][
n]; mmm++)
342 if (mat[m][mmm+index2] == 1)
347 mat[
m][mm+index2]= 1;
351 index2 += seperator [
i][
k][n+1] - seperator [
i][
k][
n];
356 for (m= seperator[index1][k][n]; m < seperator[index1][
k][n+1]; m++, mm++)
358 tmp1= storeFactors [index1][0][
k][
m];
360 for (i= j - 1; i > -1; i--)
364 for (mmm= 0; mmm < seperator [
i][
k][n+1]-seperator[
i][
k][
n]; mmm++)
365 if (mat[mm][mmm+index2] == 1)
366 tmp1=
patch (tmp1, storeFactors[i][0][k][seperator[i][k][n]+mmm],
368 index2 += seperator [
i][
k][n+1]-seperator[
i][
k][
n];
373 for (m= 0; m < maxTerms; m++)
391 for (i= 0; i <
j; i++)
393 delete [] storeFactors [
i] [0];
394 delete [] storeFactors [
i] [1];
395 delete [] storeFactors [
i];
397 delete [] seperator [i][k];
398 delete [] seperator [
i];
401 delete [] storeFactors;
int status int void size_t count
CFList findNormalizingFactor1(const CFList &biFactors, const CanonicalForm &evalPoint, CFList &uniFactors)
find normalizing factors for biFactors and build monic univariate factors from biFactors ...
static poly normalize(poly next_p, ideal add_generators, syStrategy syzstr, int *g_l, int *p_l, int crit_comp)
factory's class for variables
const CanonicalForm CFMap CFMap int &both_non_zero int n
CFList int & minFactorsLength
[in,out] minimal length of < bivariate factors
CanonicalForm patch(const CanonicalForm &F1, const CanonicalForm &F2, const CanonicalForm &eval)
patch together F1 and F2 and normalize by a power of eval F1 and F2 are assumed to be bivariate with ...
int search(const CFArray &A, const CanonicalForm &F, int i, int j)
search for F in A between index i and j
CFArray evaluate(const CFArray &A, const CFList &evalPoints)
CFList recombination(const CFList &factors1, const CFList &factors2, int s, int thres, const CanonicalForm &evalPoint, const Variable &x)
recombination of bivariate factors factors1 s. t. the result evaluated at evalPoint coincides with fa...
CFArray getTerms2(const CanonicalForm &F)
get terms of F wrt. Variable (1)
bool fdivides(const CanonicalForm &f, const CanonicalForm &g)
bool fdivides ( const CanonicalForm & f, const CanonicalForm & g )
CFList findNormalizingFactor2(CFList &biFactors, const CanonicalForm &evalPoint, const CFList &uniFactors)
find normalizing factors for biFactors and sort biFactors s.t. the returned biFactors evaluated at ev...