95 return gcd (resultHi, resultLo);
137 int **
swap=
new int* [n + 1];
138 for (
int i= 0;
i <= n;
i++)
141 swap [
i]=
new int [3];
165 for (
i= 1;
i < n;
i++)
167 for (
int j= 1;
j < n -
i + 1;
j++)
173 buf3=
swap [
j + 1] [2];
186 buf3=
swap [
j + 1] [2];
198 for (
i= n;
i > 0;
i--)
213#if defined(HAVE_NTL) || defined(HAVE_FLINT)
223 int k=
info.getGFDegree();
225 if (factors.
length() == 1)
249 int *
v=
new int [
T.length()];
250 for (
int i= 0;
i <
T.length();
i++)
252 bool noSubset=
false;
256 bool trueFactor=
false;
257 while (
T.length() >= 2*
s)
259 while (noSubset ==
false)
320 if (
T.length() < 2*
s ||
T.length() ==
s)
336 if (
T.length() < 2*
s ||
T.length() ==
s)
343 for (
int i= 0;
i <
T.length();
i++)
347 if (
T.length() < 2*
s)
358#if defined(HAVE_NTL) || defined(HAVE_FLINT)
363 if (factors.
length() == 1)
376 int *
v=
new int [
T.length()];
377 for (
int i= 0;
i <
T.length();
i++)
379 bool noSubset=
false;
385 while (
T.length() >= 2*
s)
387 while (noSubset ==
false)
415 if (
T.length() < 2*
s ||
T.length() ==
s)
427 if (
T.length() < 2*
s ||
T.length() ==
s)
433 for (
int i= 0;
i <
T.length();
i++)
437 if (
T.length() < 2*
s)
445#if defined(HAVE_NTL) || defined(HAVE_FLINT)
448 success,
const int deg,
const CFList& MOD,
const int bound)
450 int adaptedLiftBound= 0;
476 if (adaptedLiftBound < deg)
478 if (adaptedLiftBound <
degree (F) + 1)
484 adaptedLiftBound= deg;
490 if (e + 1 <
degree (F) + 1)
491 adaptedLiftBound= deg;
493 adaptedLiftBound= e + 1;
499 adaptedLiftBound= deg;
507 return adaptedLiftBound;
511#if defined(HAVE_NTL) || defined(HAVE_FLINT)
521 int k=
info.getGFDegree();
522 int adaptedLiftBound= 0;
573 if (adaptedLiftBound < deg)
575 if (adaptedLiftBound <
degree (F) + 1)
581 adaptedLiftBound= deg;
587 if (e + 1 <
degree (F) + 1)
588 adaptedLiftBound= deg;
590 adaptedLiftBound= e + 1;
596 adaptedLiftBound= deg;
605 return adaptedLiftBound;
609#if defined(HAVE_NTL) || defined(HAVE_FLINT)
612 bool& success,
const int deg,
const CFList& MOD,
645 if (adaptedLiftBound < deg)
647 if (adaptedLiftBound <
degree (F) + 1)
650 adaptedLiftBound=
tmin (e + 1, deg);
652 adaptedLiftBound= deg;
662#if defined(HAVE_NTL) || defined(HAVE_FLINT)
672 int k=
info.getGFDegree();
730 if (adaptedLiftBound < deg)
732 if (adaptedLiftBound <
degree (F) + 1)
735 adaptedLiftBound=
tmin (e + 1, deg);
737 adaptedLiftBound= deg;
747#if defined(HAVE_NTL) || defined(HAVE_FLINT)
748#define CHAR_THRESHOLD 8
751 CFList& list,
const bool& GF,
bool& fail)
805 for (
int i= 0;
i <
k;
i++)
826 if (
find (list, random))
841 if (!
find (list, random))
851 if (!
find (list, random))
866 if (!
find (list, random))
878 if (!
find (list, random))
890 if (!
find (list, random))
901 if (!
find (list, random))
914 }
while (
find (list, random));
938 for (
int i= lev;
i <=
A.level();
i++)
973 for (
i=
i - 2;
i > 0;
i--)
982#if defined(HAVE_NTL) || defined(HAVE_FLINT)
989 bool extension=
info.isInExtension();
990 CFList bufFactors= biFactors;
997 int smallFactorDeg= 11;
999 int adaptedLiftBound= 0;
1000 int liftBound= liftBounds[1];
1002 earlySuccess=
false;
1003 CFList earlyReconstFactors;
1009 if (smallFactorDeg >= liftBound)
1013 else if (smallFactorDeg >=
degree (
buf) + 1)
1021 (
buf,
result, adaptedLiftBound, earlySuccess,
1025 (
buf,
result, adaptedLiftBound, earlySuccess,
1027 (
buf) + 1, MOD, liftBound);
1042 liftBounds[1]= adaptedLiftBound;
1043 liftBound= adaptedLiftBound;
1045 Pi, diophant, Mat, MOD);
1048 liftBounds[1]= adaptedLiftBound;
1050 else if (smallFactorDeg <
degree (
buf) + 1)
1052 liftBounds[1]= smallFactorDeg;
1058 earlySuccess, smallFactorDeg, MOD,
1063 smallFactorDeg, MOD, liftBound);
1069 smallFactorDeg, MOD, liftBound);
1080 Pi, diophant, Mat, MOD);
1107 liftBounds[1]= adaptedLiftBound;
1108 liftBound= adaptedLiftBound;
1110 Pi, diophant, Mat, MOD);
1113 liftBounds[1]= adaptedLiftBound;
1116 liftBounds[1]= adaptedLiftBound;
1129 for (
int i= 2;
i <= liftBoundsLength &&
j.hasItem();
i++,
j++)
1131 earlySuccess=
false;
1134 liftBound= liftBounds[
i];
1138 if (smallFactorDeg >= liftBound)
1140 liftBounds[
i - 1], liftBounds[
i]);
1141 else if (smallFactorDeg >=
degree (
buf) + 1)
1150 (
buf,
result, adaptedLiftBound, earlySuccess,
1154 (
buf,
result, adaptedLiftBound, earlySuccess,
1162 + 1, MOD, liftBound);
1172 liftBounds[
i]= adaptedLiftBound;
1173 liftBound= adaptedLiftBound;
1175 Pi, diophant, Mat, MOD);
1179 liftBounds[
i]= adaptedLiftBound;
1182 else if (smallFactorDeg <
degree (
buf) + 1)
1185 liftBounds[
i - 1], smallFactorDeg);
1191 (
buf,
result, adaptedLiftBound, earlySuccess,
1192 smallFactorDeg, MOD, liftBound);
1195 (
buf,
result, adaptedLiftBound, earlySuccess,
1203 smallFactorDeg, MOD, liftBound);
1207 smallFactorDeg, MOD, liftBound);
1214 degree (
buf) + 1, Pi, diophant, Mat, MOD);
1219 (
buf,
result, adaptedLiftBound, earlySuccess,
1223 (
buf,
result, adaptedLiftBound, earlySuccess,
1232 (
buf) + 1, MOD, liftBound);
1242 liftBounds[
i]= adaptedLiftBound;
1243 liftBound= adaptedLiftBound;
1245 Pi, diophant, Mat, MOD);
1248 liftBounds[
i]= adaptedLiftBound;
1251 liftBounds[
i]= adaptedLiftBound;
1281 g=
gcd (
i.getItem().factor(),
j.getItem().factor());
1284 j.getItem()=
CFFactor (
j.getItem().factor()/
g,
j.getItem().exp());
1285 i.getItem()=
CFFactor (
i.getItem().factor()/
g,
i.getItem().exp());
1304 if (
l.length() == 1)
1309 if (differentSecondVarFactors[
i].isEmpty())
1313 result= differentSecondVarFactors[
i];
1320 for (
CFListIterator iter2= differentSecondVarFactors[
i];iter2.hasItem();
1323 iter1.
getItem() *= iter2.getItem();
1338 if (differentSecondVarFactors[
i].isEmpty())
1344 for (iter2= differentSecondVarFactors[
i]; iter2.
hasItem();
1347 if (iter2.
getItem().inCoeffDomain())
1359 if (!
g.inCoeffDomain())
1372 for (iter2= multiplier; iter2.
hasItem(); iter1++, iter2++)
1394 sqrfFactorization=
sqrFree (F);
1398 sqrfPartF *=
i.getItem().factor();
1411 factors= uniFactors;
1419 sqrfFactors=
sqrFree (
i.getItem());
1426 i.getItem()= tmp/
Lc(tmp);
1427 bufSqrfFactors [
k]= sqrfFactors;
1430 for (
int i= 0;
i < factors.
length() - 1;
i++)
1439 for (
int i= 0;
i < uniFactors.
length();
i++)
1476#if defined(HAVE_NTL) || defined(HAVE_FLINT)
1480 CFList* & differentSecondVarLCs,
int lSecondVarLCs,
1488 for (
int i= 1;
i <= LCFFactors.
length() + 1;
i++)
1513 for (
int i= 0;
i < lSecondVarLCs;
i++)
1515 for (
j= differentSecondVarLCs[
i];
j.hasItem();
j++)
1517 if (
j.getItem().level() == LCFLevel)
1525 result= differentSecondVarLCs [
i];
1540 CFList factors= LCFFactors;
1543 i.getItem()=
M (
i.getItem());
1547 CFList evalSqrfPartF, bufFactors;
1564 bufFactors, bufSqrfFactors, evalSqrfPartF,
evalPoint);
1566 bool foundDifferent=
false;
1575 for (
int i= 0;
i < lSecondVarLCs;
i++)
1577 if (!differentSecondVarLCs [
i].isEmpty())
1579 bool allConstant=
true;
1592 bufFactors= differentSecondVarLCs [
i];
1598 bufBufFactors= bufFactors;
1608 bufSqrfFactors, evalSqrfPartF,
evalPoint);
1611 foundDifferent=
true;
1616 differentSecondVarLCs [
i]=
l;
1620 if (!pass &&
i == lSecondVarLCs - 1)
1624 for (
int j= 1;
j <= factors.
length();
j++)
1628 delete [] bufSqrfFactors;
1638 for (
int j= 1;
j <= factors.
length();
j++)
1642 delete [] bufSqrfFactors;
1646 factors= bufFactors;
1648 bufFactors= factors;
1651 dummy [0]= sqrfPartF;
1654 sqrfPartF= MM (sqrfPartF);
1660 for (
int i= 2;
i <= varsSqrfPartF.
level();
i++)
1665 sqrfPartF=
shift2Zero (sqrfPartF, evalSqrfPartF, evaluation2);
1666 if (factors.
length() > 1)
1670 for (
int i= 0;
i < factors.
length();
i++)
1671 leadingCoeffs.
append (LC1);
1674 CFList oldFactors= factors;
1678 bool success=
false;
1681 if (
size (oldSqrfPartFPowLC)/
getNumVars (oldSqrfPartFPowLC) < 500 &&
1683 oldFactors, 2, leadingCoeffs, heuResult))
1694 for (
int i= 0;
i < factors.
length();
i++)
1695 leadingCoeffs[
i]= LC1;
1698 i.getItem() *= LC1 (0,2)/
Lc (
i.getItem());
1704 int liftBound=
degree (newSqrfPartF,2) + 1;
1710 leadingCoeffs,
false);
1712 if (sqrfPartF.
level() > 2)
1714 int* liftBounds=
new int [sqrfPartF.
level() - 1];
1715 bool noOneToOne=
false;
1719 for (
int i= 0;
i < factors.
length();
i++)
1721 leadingCoeffs2 [sqrfPartF.
level() - 3]= LCs;
1722 for (
int i= sqrfPartF.
level() - 1;
i > 2;
i--)
1725 j.getItem()=
j.getItem() (0,
i + 1);
1726 leadingCoeffs2 [
i - 3]= LCs;
1730 int liftBoundsLength= sqrfPartF.
level() - 1;
1731 for (
int i= 0;
i < liftBoundsLength;
i++)
1732 liftBounds [
i]=
degree (sqrfPartF,
i + 2) + 1;
1736 diophant, Pi, liftBounds, sqrfPartF.
level() - 1, noOneToOne);
1737 delete [] leadingCoeffs2;
1738 delete [] liftBounds;
1751 factors=
CFList (oldSqrfPartF/contF);
1760 for (
int i= 0;
i < LCFFactors.
length();
i++)
1763 for (
k= bufSqrfFactors[
i];
k.hasItem();
k++)
1765 int pos=
findItem (bufFactors,
k.getItem().factor());
1767 tmp *=
power (
getItem (interMedResult, pos),
k.getItem().exp());
1777 i.getItem()=
N (
i.getItem());
1782 CFList l= differentSecondVarLCs [
j];
1785 differentSecondVarLCs [
j]=
l;
1793 if (!
result.getFirst().inCoeffDomain())
1800 CFList l= differentSecondVarLCs [
j];
1803 differentSecondVarLCs [
j]=
l;
1823 if (lSecondVarLCs -
level > 0)
1826 int j= lSecondVarLCs+2;
1829 for (
i= evaluation2;
i.hasItem();
i++,
j--)
1834 i.getItem()= evaluation2.
getLast();
1845 delete [] bufSqrfFactors;
1861 for (
CFListIterator iter2= evaluation2; iter2.hasItem(); iter2++,
1872 for (
int j=
level+1;
j < lSecondVarLCs;
j++)
1876 if (!differentSecondVarLCs[
j].isEmpty())
1878 differentSecondVarLCs2[
j -
level - 1]= differentSecondVarLCs[
j];
1879 i= differentSecondVarLCs2[
j-
level - 1];
1908 for (
i=newLCs;
i.hasItem();
i++)
1910 for (
int j= 1;
j < lSecondVarLCs-
level;
j++)
1912 for (
i= differentSecondVarLCs2[
j-1];
i.hasItem();
i++)
1920 differentSecondVarLCs2, lSecondVarLCs -
level - 1,
1923 if (dummyvar.
level() != 1)
1925 for (
i= recursiveResult;
i.hasItem();
i++)
1928 for (
i= recursiveResult;
i.hasItem();
i++)
1930 for (
int j= lSecondVarLCs-
level-1;
j > 0;
j--)
1938 delete [] bufSqrfFactors;
1939 delete [] differentSecondVarLCs2;
1944 iter=recursiveResult;
1949 for (;
i.hasItem();
i++,
iter++)
1951 delete [] differentSecondVarLCs2;
1958 delete [] bufSqrfFactors;
1971 bool preserveDegree=
true;
1974 for (
int i=
A.level();
i > 2;
i--)
1979 preserveDegree=
true;
1981 for (
j=
A.level();
j > 1;
j--,
iter++)
1989 if ((
degree (tmp,
i) != degAi) ||
1990 (
degree (tmp, 1) != degA1))
1992 preserveDegree=
false;
1997 if (!
content(tmp,1).inCoeffDomain())
1998 preserveDegree=
false;
1999 if (!
content(tmp).inCoeffDomain())
2000 preserveDegree=
false;
2001 if (!(
gcd (
deriv (tmp,
x), tmp)).inCoeffDomain())
2002 preserveDegree=
false;
2026 for (; iter1.
hasItem(); iter1++, iter2++)
2029 if (!g2.inCoeffDomain())
2032 l2.
append (iter2.getItem());
2048 CFList uniFactorsOfFactors1;
2066 uniFactorsOfFactors1.
append (tmp);
2075 while (!uniFactorsOfFactors1.
isEmpty())
2077 tmp= uniFactorsOfFactors1.
getFirst();
2121 int *
v=
new int [
T.length()];
2122 for (
int i= 0;
i <
T.length();
i++)
2124 bool nosubset=
false;
2126 TT=
copy (factors1);
2127 int recombinations= 0;
2128 while (
T.length() >= 2*
s &&
s <= thres)
2130 while (nosubset ==
false)
2132 if (
T.length() ==
s)
2142 if (nosubset)
break;
2152 if (nosubset)
break;
2156 if (
T.length() < 2*
s ||
T.length() ==
s)
2165 for (
int i= 0;
i <
T.length();
i++)
2171 if (
T.length() < 2*
s)
2180#if defined(HAVE_NTL) || defined(HAVE_FLINT)
2192 for (
int j= 0;
j <
A.level() - 2;
j++)
2199 else if (
info.getAlpha().level() == 1)
2210 if (factors.
length() == 1)
2226 for (
int i=
A.max();
i >=
A.min();
i--)
2237 for (
int j= 0;
j <
A.level() - 2;
j++)
2261 int pos,
index, checklength;
2262 bool leaveLoop=
false;
2264 for (
int j= 0;
j < AevalLength;
j++)
2293 checklength= biFactors.
length();
2295 if (checklength > biFactors.
length())
2344 bool leaveLoop=
false;
2345 for (
int j= 0;
j <
A.level() - 2;
j++)
2389 for (
int i= n - 1;
i > 2;
i--,
iter++)
2391 for (
j=
l;
j.hasItem();
j++)
2402 for (
int i= 0;
i < n-2;
i++)
2404 ii= normalizeFactor;
2405 for (
j= LCs [
i];
j.hasItem();
j++, ii++)
2427 int k=
info.getGFDegree();
2442 int *
v=
new int [
T.length()];
2443 for (
int i= 0;
i <
T.length();
i++)
2445 bool noSubset=
false;
2449 bool trueFactor=
false;
2450 while (
T.length() >= 2*
s)
2452 while (noSubset ==
false)
2454 if (
T.length() ==
s)
2471 if (noSubset)
break;
2503 if (
T.length() < 2*
s ||
T.length() ==
s)
2514 if (noSubset)
break;
2519 if (
T.length() < 2*
s ||
T.length() ==
s)
2527 for (
int i= 0;
i <
T.length();
i++)
2531 if (
T.length() < 2*
s)
2544 CFList*& oldAeval,
int lengthAeval2,
2562 for (
i= 0;
i < lengthAeval2;
i++)
2564 if (oldAeval[
i].isEmpty())
2569 oldAeval[
i]= biFactors;
2572 for (
int ii= 0; ii < tmp.
size(); ii++)
2576 for (
int ii= 0; ii < tmp.
size(); ii++)
2583 for (
int j= 0;
j <
tmp2.size();
j++)
2601 for (
int i=
A.level();
i > 2;
i--,
iter++)
2607 i.getItem() *= tmp/
LC (
i.getItem(), 1);
2608 i.getItem() /=
Lc (
i.getItem());
2617 const CFList& oldBiFactors)
2624 if (sqrfMultiplier.
getFirst().factor().inCoeffDomain())
2630 for (
int i= 0;
i < lengthAeval;
i++)
2632 if (oldAeval[
i].isEmpty())
2644 for (
int i=1;
i <= tmp.
level();
i++)
2660 tmp /=
myGetVars (ii.getItem().factor());
2663 if (multi == ii.getItem().exp())
2671 for (iter2= leadingCoeffs[lengthAeval-1]; iter2.
hasItem();iter2++,
2674 if (index2 ==
index)
2678 tmp= ii.getItem().factor();
2682 for (
int jj=
A.level(); jj > 2; jj--, iter3++)
2683 tmp= tmp (iter3.
getItem(), jj);
2687 for (iter3= biFactors; iter3.
hasItem(); iter3++, index3++)
2689 if (index3 == index2)
2693 if (
fdivides (ii.getItem().factor(),
A, quot3))
2720 for (iter2= leadingCoeffs[lengthAeval-1];iter2.
hasItem();iter2++,
2723 if (index2 ==
index)
2725 tmp=
power (ii.getItem().factor(), ii.getItem().exp());
2731 for (
int jj=
A.level(); jj > 2; jj--, iter3++)
2732 tmp= tmp (iter3.
getItem(), jj);
2736 for (iter3= biFactors; iter3.
hasItem(); iter3++, index3++)
2738 if (index3 == index2)
2764 bool& foundTrueMultiplier)
2767 if (
fdivides (pLCs,
LC (oldA,1)) && (
LC(oldA,1)/pLCs).inCoeffDomain())
2773 foundTrueMultiplier=
true;
2780 bool& foundTrueMultiplier)
2788 cont=
gcd (cont, LCmultiplier);
2792 foundTrueMultiplier=
true;
2794 for (iter2= leadingCoeffs; iter2.
hasItem(); iter2++, index2++)
2796 if (index2 ==
index)
2798 iter2.
getItem() /= LCmultiplier;
2811 int lengthAeval,
bool& foundMultiplier)
2819 if ((LCmultiplier/
iter.
getItem()).inCoeffDomain() &&
2826 for (
int i= 0;
i < lengthAeval;
i++)
2828 if (oldAeval[
i].isEmpty())
2834 if (vars.
level() <= 2)
2838 iter3.hasItem(); iter3++, index2++)
2840 if (index2 ==
index)
2842 iter3.getItem() /= LCmultiplier;
2847 foundMultiplier=
true;
2872 for (iter2= leadingCoeffs[lengthAeval-1]; iter2.
hasItem();
2875 if (index2 ==
index)
2878 foundMultiplier=
true;
2892 for (
int i= 0;
i < lengthAeval;
i++)
2894 if (oldAeval[
i].isEmpty())
2904 for (iter2= leadingCoeffs[lengthAeval-1]; iter2.
hasItem();
2907 if (index2 ==
index)
2909 iter2.
getItem() /= LCmultiplier;
2910 foundMultiplier=
true;
2922#if defined(HAVE_NTL) || defined(HAVE_FLINT)
2946 bool extension=
info.isInExtension();
2951 if (extension ==
false)
2965 if (
buf.getFirst().inCoeffDomain())
2982 if (
A.inCoeffDomain())
2986 if (
i.getItem().inCoeffDomain())
2990 lcmCont /=
i.getItem();
3000 return contentAFactors;
3010 if (
A.isUnivariate ())
3013 append (factors, contentAFactors);
3025 for (
int i= 1;
i <=
A.level();
i++)
3028 derivZ=
deriv (bufA, z);
3038 gcdDerivZ=
gcd (bufA, derivZ);
3063 "time to check main var over Fq: ");
3065 "time to preprocess poly and extract content over Fq: ");
3072 CFList biFactors, bufBiFactors;
3074 int lift, bufLift, lengthAeval2=
A.level()-2;
3077 logarithm= ceil (logarithm);
3078 if (factorNums < (
int) logarithm)
3079 factorNums= (int) logarithm;
3083 int differentSecondVar= 0;
3086 for (
int i= 0;
i < factorNums;
i++)
3094 "time to find evaluation point over Fq: ");
3097 if (fail && (
i == 0))
3112 delete [] bufAeval2;
3136 else if (fail && (
i > 0))
3142 "time for evaluation wrt diff second vars over Fq: ");
3144 for (
int j= 0;
j < lengthAeval2;
j++)
3146 if (!bufAeval2[
j].isEmpty())
3160 "time for bivariate factorization: ");
3163 if (bufBiFactors.
length() == 1)
3175 delete [] bufAeval2;
3184 biFactors= bufBiFactors;
3186 for (
int j= 0;
j < lengthAeval2;
j++)
3187 Aeval2 [
j]= bufAeval2 [
j];
3188 differentSecondVar= counter;
3194 counter > differentSecondVar)
3198 biFactors= bufBiFactors;
3200 for (
int j= 0;
j < lengthAeval2;
j++)
3201 Aeval2 [
j]= bufAeval2 [
j];
3202 differentSecondVar= counter;
3207 evalPoly +=
j.getItem()*
power (
x,
k);
3211 delete [] bufAeval2;
3220 "time for bivariate factorization wrt diff second vars over Fq: ");
3223 "total time for eval and bivar factors over Fq: ");
3268 if (differentSecondVar == lengthAeval2)
3270 bool zeroOccured=
false;
3302 for (
int i= 0;
i < lengthAeval2;
i++)
3303 oldAeval[
i]= Aeval2[
i];
3309 biFactorsLCs.
append (
LC (
i.getItem(), 1));
3321 CFList oldBiFactors= biFactors;
3327 if (!LCmultiplierIsConst)
3336 CFList bufLeadingCoeffs2= leadingCoeffs2[lengthAeval2-1];
3337 bufBiFactors= biFactors;
3340 if (!LCmultiplierIsConst)
3343 for (
int i= 0;
i < lengthAeval2;
i++)
3345 if (!oldAeval[
i].isEmpty())
3350 "time to precompute LC over Fq: ");
3354 bool LCheuristic=
false;
3360 CFList oldFactors= factors;
3381 "time for successful LucksWang over Fq: ");
3384 else if (factors.
length() > 0)
3393 for (
int j=1;
j <=
i-oneCount;
j++)
3396 for (
int j= 0;
j < lengthAeval2;
j++)
3398 l= leadingCoeffs2[
j];
3400 for (
int k=1;
k <=
i-oneCount;
k++)
3403 leadingCoeffs2[
j]=
l;
3408 bufFactors= factors;
3411 else if (!LCmultiplierIsConst && factors.
length() == 0)
3414 factors= oldFactors;
3416 bool foundTrueMultiplier=
false;
3417 LCHeuristic2 (LCmultiplier, factors, leadingCoeffs2[lengthAeval2-1],
3418 contents, LCs, foundTrueMultiplier);
3419 if (foundTrueMultiplier)
3422 leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
3423 for (
int i= lengthAeval2-1;
i > -1;
i--)
3430 bool foundMultiplier=
false;
3431 LCHeuristic3 (LCmultiplier, factors, oldBiFactors, contents, oldAeval,
3432 A, leadingCoeffs2, lengthAeval2, foundMultiplier);
3435 if (foundMultiplier)
3437 foundMultiplier=
false;
3438 LCHeuristic4 (oldBiFactors, oldAeval, contents, factors, testVars,
3439 lengthAeval2, leadingCoeffs2,
A, LCmultiplier,
3445 leadingCoeffs2[lengthAeval2-1], foundMultiplier);
3448 LCHeuristic (
A, LCmultiplier, biFactors, leadingCoeffs2, oldAeval,
3454 leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
3455 for (
int i= lengthAeval2-1;
i > -1;
i--)
3461 if (!
fdivides (
LC (oldA,1),
prod (leadingCoeffs2[lengthAeval2-1])))
3465 biFactors= bufBiFactors;
3466 leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
3467 LCmultiplier= bufLCmultiplier;
3477 if (!LCheuristic && !LCmultiplierIsConst && bufFactors.
isEmpty()
3481 LCHeuristic (
A, LCmultiplier, biFactors, leadingCoeffs2, oldAeval,
3484 leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
3485 for (
int i= lengthAeval2-1;
i > -1;
i--)
3490 if (!
fdivides (
LC (oldA,1),
prod (leadingCoeffs2[lengthAeval2-1])))
3494 biFactors= bufBiFactors;
3495 leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
3496 LCmultiplier= bufLCmultiplier;
3508 for (
int i= 0;
i < lengthAeval2-1;
i++)
3513 for (
int i=
A.level() - 4;
i > -1;
i--)
3515 if (
i + 1 == lengthAeval2-1)
3522 "time to shift evaluation point to zero: ");
3526 int* liftBounds=
new int [
A.level() - 1];
3527 int liftBoundsLength=
A.level() - 1;
3528 for (
int i= 0;
i < liftBoundsLength;
i++)
3532 bool noOneToOne=
false;
3535 Pi, liftBounds, liftBoundsLength, noOneToOne);
3537 "time for non monic hensel lifting over Fq: ");
3546 "time to recover factors over Fq: ");
3550 factors=
Union (factors, bufFactors);
3552 if (extension && !noOneToOne)
3557 if (!LCmultiplierIsConst && LCheuristic)
3560 biFactors= bufBiFactors;
3561 leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
3562 delete [] liftBounds;
3564 goto tryAgainWithoutHeu;
3569 biFactors= oldBiFactors;
3578 for (;
i.hasItem();
i++)
3587 for (;
i.hasItem();
i++)
3589 LCA=
LC (
i.getItem(), 1);
3590 extgcd (LCA, yToLift, LCA, dummy);
3591 i.getItem()=
mod (
i.getItem()*LCA, yToLift);
3594 liftBoundsLength= F.
level() - 1;
3599 CFList earlyFactors, liftedFactors;
3602 (
A, MOD, liftBounds, earlySuccess, earlyFactors,
3605 "time for hensel lifting over Fq: ");
3612 "time for factor recombination: ");
3619 "time for factor recombination: ");
3623 factors=
Union (factors, earlyFactors);
3631 if (
i.getItem().level() < kk)
3633 i.getItem()=
i.getItem() (
Variable (kk) -
j.getItem(), kk);
3645 swap (factors, swapLevel, swapLevel2,
x);
3646 append (factors, contentAFactors);
3651 delete[] liftBounds;
3666 int k=
info.getGFDegree();
3667 char cGFName=
info.getGFName();
3676 bool extension=
true;
3697 else if (
p >= 7 &&
p*
p < (1<<16))
3721 else if (!GF && (
alpha !=
w))
3739 bool primFail=
false;
3742 ASSERT (!primFail,
"failure in integer factorizer");
3759 bool primFail=
false;
3761 ASSERT (!primFail,
"failure in integer factorizer");
3771 bufA=
mapUp (bufA,
beta,
v, delta, imPrimElem, source, dest);
3783 bool extension=
true;
3787 if (
pow ((
double)
p, (
double) extensionDeg) < (1<<16))
3813 if (
pow ((
double)
p, (
double) 2*extensionDeg) < (1<<16))
3829 bool primFail=
false;
Rational pow(const Rational &a, int e)
const CanonicalForm CFMap CFMap & N
static const double log2exp
static Variable chooseExtension(const Variable &alpha)
static void evalPoint(const CanonicalForm &F, const CanonicalForm &G, CanonicalForm &FEval, CanonicalForm &GEval, CFGenerator &evalPoint)
CanonicalForm decompress(const CanonicalForm &F, const mpz_t *inverseM, const mpz_t *A)
decompress a bivariate poly
CanonicalForm extgcd(const CanonicalForm &f, const CanonicalForm &g, CanonicalForm &a, CanonicalForm &b)
CanonicalForm extgcd ( const CanonicalForm & f, const CanonicalForm & g, CanonicalForm & a,...
univariate Gcd over finite fields and Z, extended GCD over finite fields and Q
bool fdivides(const CanonicalForm &f, const CanonicalForm &g)
bool fdivides ( const CanonicalForm & f, const CanonicalForm & g )
CFFList FACTORY_PUBLIC sqrFree(const CanonicalForm &f, bool sort=false)
squarefree factorization
#define ASSERT(expression, message)
#define GaloisFieldDomain
CanonicalForm randomIrredpoly(int i, const Variable &x)
computes a random monic irreducible univariate polynomial in x over Fp of degree i via NTL/FLINT
generate random irreducible univariate polynomials
static CanonicalForm bound(const CFMatrix &M)
CanonicalForm compress(const CanonicalForm &f, CFMap &m)
CanonicalForm compress ( const CanonicalForm & f, CFMap & m )
int findItem(const CFList &list, const CanonicalForm &item)
helper function
CanonicalForm mapPrimElem(const CanonicalForm &primElem, const Variable &alpha, const Variable &beta)
compute the image of a primitive element of in . We assume .
CanonicalForm primitiveElement(const Variable &alpha, Variable &beta, bool &fail)
determine a primitive element of , is a primitive element of a field which is isomorphic to
static CanonicalForm mapDown(const CanonicalForm &F, const Variable &alpha, const CanonicalForm &G, CFList &source, CFList &dest)
the CanonicalForm G is the output of map_up, returns F considered as an element over ,...
CanonicalForm getItem(const CFList &list, const int &pos)
helper function
static CanonicalForm mapUp(const Variable &alpha, const Variable &beta)
and is a primitive element, returns the image of
CanonicalForm Falpha2GFRep(const CanonicalForm &F)
change representation by residue classes modulo a Conway polynomial to representation by primitive el...
CanonicalForm GFMapUp(const CanonicalForm &F, int k)
maps a polynomial over to a polynomial over , d needs to be a multiple of k
CanonicalForm GF2FalphaRep(const CanonicalForm &F, const Variable &alpha)
changes representation by primitive element to representation by residue classes modulo a Conway poly...
This file implements functions to map between extensions of finite fields.
generate random integers, random elements of finite fields
generate random elements in F_p(alpha)
CanonicalForm generate() const
class to iterate through CanonicalForm's
ExtensionInfo contains information about extension.
generate random elements in F_p
CanonicalForm generate() const
generate random elements in GF
CanonicalForm generate() const
void remove(int moveright)
factory's class for variables
functions to print debug output
const CanonicalForm int const CFList & evaluation
const CanonicalForm int s
const CanonicalForm int const CFList const Variable & y
CFFList append(const CFFList &Inputlist, const CFFactor &TheFactor)
const Variable & v
< [in] a sqrfree bivariate poly
CFList int & minFactorsLength
[in,out] minimal length of bivariate factors
CFList *& Aeval
<[in] poly
CFList int bool & irred
[in,out] Is A irreducible?
void appendTestMapDown(CFList &factors, const CanonicalForm &f, const ExtensionInfo &info, CFList &source, CFList &dest)
test if g is in a subfield of the current field, if so map it down and append it to factors
void appendSwapDecompress(CFList &factors1, const CFList &factors2, const CFList &factors3, const bool swap1, const bool swap2, const CFMap &N)
first swap Variables in factors1 if necessary, then append factors2 and factors3 on factors1 and fina...
void indexUpdate(int index[], const int &subsetSize, const int &setSize, bool &noSubset)
update index
void appendMapDown(CFList &factors, const CanonicalForm &g, const ExtensionInfo &info, CFList &source, CFList &dest)
map g down into a subfield of the current field and append it to factors
CFArray copy(const CFList &list)
write elements of list into an array
CFList subset(int index[], const int &s, const CFArray &elements, bool &noSubset)
extract a subset given by index of size s from elements, if there is no subset we have not yet consid...
bool isInExtension(const CanonicalForm &F, const CanonicalForm &gamma, const int k, const CanonicalForm &delta, CFList &source, CFList &dest)
tests if F is not contained in a subfield defined by gamma (Fq case) or k (GF case)
CFList uniFactorizer(const CanonicalForm &A, const Variable &alpha, const bool &GF)
Univariate factorization of squarefree monic polys over finite fields via NTL. If the characteristic ...
CFList FqBiSqrfFactorize(const CanonicalForm &G, const Variable &alpha)
factorize a squarefree bivariate polynomial over .
CFList biSqrfFactorizeHelper(const CanonicalForm &G, const ExtensionInfo &info)
CFList FpBiSqrfFactorize(const CanonicalForm &G)
factorize a squarefree bivariate polynomial over .
CFList GFBiSqrfFactorize(const CanonicalForm &G)
factorize a squarefree bivariate polynomial over GF
CFList recoverFactors(const CanonicalForm &F, const CFList &factors)
divides factors by their content wrt. Variable(1) and checks if these polys divide F
CanonicalForm reverseShift(const CanonicalForm &F, const CFList &evaluation, int l)
reverse shifting the evaluation point to zero
CanonicalForm shift2Zero(const CanonicalForm &F, CFList &Feval, const CFList &evaluation, int l)
shift evaluation point to zero
int * liftingBounds(const CanonicalForm &A, const int &bivarLiftBound)
compute lifting bounds
CFList evaluateAtZero(const CanonicalForm &F)
evaluate F successively n-2 at 0
bool isOnlyLeadingCoeff(const CanonicalForm &F)
check if F consists of more than just the leading coeff wrt. Variable (1)
CFFList sortCFFListByNumOfVars(CFFList &F)
sort CFFList by the number variables in a factor
CanonicalForm myGetVars(const CanonicalForm &F)
like getVars but including multiplicities
CFList evaluateAtEval(const CanonicalForm &F, const CFArray &eval)
evaluate F at evaluation
This file provides utility functions for multivariate factorization.
CFList multiFactorize(const CanonicalForm &F, const ExtensionInfo &info)
CFList factorRecombination(const CanonicalForm &F, const CFList &factors, const CFList &M)
Naive factor recombination for multivariate factorization. No precomputed is used to exclude combinat...
CFList precomputeLeadingCoeff(const CanonicalForm &LCF, const CFList &LCFFactors, const Variable &alpha, const CFList &evaluation, CFList *&differentSecondVarLCs, int lSecondVarLCs, Variable &y)
computes a list l of length length(LCFFactors)+1 of polynomials such that prod (l)=LCF,...
static CanonicalForm myContent(const CanonicalForm &F)
void LCHeuristicCheck(const CFList &LCs, const CFList &contents, CanonicalForm &A, const CanonicalForm &oldA, CFList &leadingCoeffs, bool &foundTrueMultiplier)
checks if prod(LCs)==LC (oldA,1) and if so divides elements of leadingCoeffs by elements in contents,...
int liftBoundAdaption(const CanonicalForm &F, const CFList &factors, bool &success, const int deg, const CFList &MOD, const int bound)
Lift bound adaption. Essentially an early factor detection but only the lift bound is adapted.
int testFactors(const CanonicalForm &G, const CFList &uniFactors, const Variable &alpha, CanonicalForm &sqrfPartF, CFList &factors, CFFList *&bufSqrfFactors, CFList &evalSqrfPartF, const CFArray &evalPoint)
void distributeLCmultiplier(CanonicalForm &A, CFList &leadingCoeffs, CFList &biFactors, const CFList &evaluation, const CanonicalForm &LCmultipler)
distributes a divisor LCmultiplier of LC(A,1) on the bivariate factors and the precomputed leading co...
void evaluationWRTDifferentSecondVars(CFList *&Aeval, const CFList &evaluation, const CanonicalForm &A)
evaluate a poly A with main variable at level 1 at an evaluation point in K^(n-1) wrt different secon...
void prepareLeadingCoeffs(CFList *&LCs, CanonicalForm &A, CFList &Aeval, int n, const CFList &leadingCoeffs, const CFList &biFactors, const CFList &evaluation)
normalize precomputed leading coefficients such that leading coefficients evaluated at evaluation in ...
CFList extFactorRecombination(const CFList &factors, const CanonicalForm &F, const CFList &M, const ExtensionInfo &info, const CFList &evaluation)
Naive factor recombination for multivariate factorization over an extension of the initial field....
void checkHelper(const CanonicalForm &f1, CFList &factors1, CFList &factors2, CFList &l1, CFList &l2)
CFList extEarlyFactorDetect(CanonicalForm &F, CFList &factors, int &adaptedLiftBound, bool &success, const ExtensionInfo &info, const CFList &eval, const int deg, const CFList &MOD, const int bound)
detects factors of F at stage deg of Hensel lifting. No combinations of more than one factor are test...
void LCHeuristic4(const CFList &oldBiFactors, const CFList *oldAeval, const CFList &contents, const CFList &factors, const CanonicalForm &testVars, int lengthAeval, CFList *&leadingCoeffs, CanonicalForm &A, CanonicalForm &LCmultiplier, bool &foundMultiplier)
heuristic to remove factors of LCmultiplier from factors. More precisely checks if elements of conten...
CanonicalForm myCompress(const CanonicalForm &F, CFMap &N)
compress a polynomial s.t. and no gaps between the variables occur
CFList checkOneToOne(const CFList &factors1, const CFList &factors2, CFList &factors3, const CanonicalForm &evalPoint, const Variable &x)
check if univariate factors factors2 of factors3 coincide with univariate factors of factors1 and rec...
void changeSecondVariable(CanonicalForm &A, CFList &biFactors, CFList &evaluation, CFList *&oldAeval, int lengthAeval2, const CFList &uniFactors, const Variable &w)
changes the second variable to be w and updates all relevant data
CFList distributeContent(const CFList &L, const CFList *differentSecondVarFactors, int length)
distribute content
static CanonicalForm prodEval(const CFList &l, const CanonicalForm &evalPoint, const Variable &v)
void factorizationWRTDifferentSecondVars(const CanonicalForm &A, CFList *&Aeval, const ExtensionInfo &info, int &minFactorsLength, bool &irred)
void sortByUniFactors(CFList *&Aeval, int AevalLength, CFList &uniFactors, CFList &biFactors, const CFList &evaluation)
sort bivariate factors in Aeval such that their corresponding univariate factors coincide with uniFac...
CFList conv(const CFArray &A)
CanonicalForm lcmContent(const CanonicalForm &A, CFList &contentAi)
compute the LCM of the contents of A wrt to each variable occuring in A.
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...
void gcdFreeBasis(CFFList &factors1, CFFList &factors2)
gcd free basis of two lists of factors
void getLeadingCoeffs(const CanonicalForm &A, CFList *&Aeval)
extract leading coefficients wrt Variable(1) from bivariate factors obtained from factorizations of A...
static int newMainVariableSearch(CanonicalForm &A, CFList &Aeval, CFList &evaluation, const Variable &alpha, const int lev, CanonicalForm &g)
CFList extFactorize(const CanonicalForm &F, const ExtensionInfo &info)
multivariate factorization over an extension of the initial field
int extLiftBoundAdaption(const CanonicalForm &F, const CFList &factors, bool &success, const ExtensionInfo &info, const CFList &eval, const int deg, const CFList &MOD, const int bound)
Lift bound adaption over an extension of the initial field. Essentially an early factor detection but...
CFList extNonMonicFactorRecombination(const CFList &factors, const CanonicalForm &F, const ExtensionInfo &info)
void LCHeuristic3(const CanonicalForm &LCmultiplier, const CFList &factors, const CFList &oldBiFactors, const CFList &contents, const CFList *oldAeval, CanonicalForm &A, CFList *&leadingCoeffs, int lengthAeval, bool &foundMultiplier)
heuristic to remove LCmultiplier from a factor based on the contents of factors. factors are assumed ...
CFList henselLiftAndEarly(CanonicalForm &A, CFList &MOD, int *&liftBounds, bool &earlySuccess, CFList &earlyFactors, const CFList &Aeval, const CFList &biFactors, const CFList &evaluation, const ExtensionInfo &info)
hensel Lifting and early factor detection
void LCHeuristic(CanonicalForm &A, const CanonicalForm &LCmultiplier, CFList &biFactors, CFList *&leadingCoeffs, const CFList *oldAeval, int lengthAeval, const CFList &evaluation, const CFList &oldBiFactors)
heuristic to distribute LCmultiplier onto factors based on the variables that occur in LCmultiplier a...
void refineBiFactors(const CanonicalForm &A, CFList &biFactors, CFList *const &Aeval, const CFList &evaluation, int minFactorsLength)
refine a bivariate factorization of A with l factors to one with minFactorsLength if possible
void LCHeuristic2(const CanonicalForm &LCmultiplier, const CFList &factors, CFList &leadingCoeffs, CFList &contents, CFList &LCs, bool &foundTrueMultiplier)
heuristic to distribute LCmultiplier onto factors based on the contents of factors....
static CanonicalForm listGCD(const CFList &L)
CFList buildUniFactors(const CFList &biFactors, const CanonicalForm &evalPoint, const Variable &y)
plug in evalPoint for y in a list of polys
CFList earlyFactorDetect(CanonicalForm &F, CFList &factors, int &adaptedLiftBound, bool &success, const int deg, const CFList &MOD, const int bound)
detects factors of F at stage deg of Hensel lifting. No combinations of more than one factor are test...
CFList evalPoints(const CanonicalForm &F, CFList &eval, const Variable &alpha, CFList &list, const bool &GF, bool &fail)
evaluation point search for multivariate factorization, looks for a (F.level() - 1)-tuple such that t...
This file provides functions for factorizing a multivariate polynomial over , or GF.
CFFList squarefreeFactorization(const CanonicalForm &F, const Variable &alpha)
squarefree factorization over a finite field return a list of squarefree factors with multiplicity
CFList nonMonicHenselLift(const CFList &F, const CFList &factors, const CFList &LCs, CFList &diophant, CFArray &Pi, CFMatrix &M, int lOld, int &lNew, const CFList &MOD, bool &noOneToOne)
CFList henselLift23(const CFList &eval, const CFList &factors, int *l, CFList &diophant, CFArray &Pi, CFMatrix &M)
Hensel lifting from bivariate to trivariate.
void nonMonicHenselLift12(const CanonicalForm &F, CFList &factors, int l, CFArray &Pi, CFList &diophant, CFMatrix &M, const CFArray &LCs, bool sort)
Hensel lifting from univariate to bivariate, factors need not to be monic.
CFList henselLift(const CFList &F, const CFList &factors, const CFList &MOD, CFList &diophant, CFArray &Pi, CFMatrix &M, int lOld, int lNew)
Hensel lifting.
void henselLiftResume(const CanonicalForm &F, CFList &factors, int start, int end, CFArray &Pi, const CFList &diophant, CFMatrix &M, const CFList &MOD)
resume Hensel lifting.
void sortList(CFList &list, const Variable &x)
sort a list of polynomials by their degree in x.
This file defines functions for Hensel lifting.
CanonicalForm mulMod(const CanonicalForm &A, const CanonicalForm &B, const CFList &MOD)
Karatsuba style modular multiplication for multivariate polynomials.
CanonicalForm prodMod(const CFList &L, const CanonicalForm &M)
product of all elements in L modulo M via divide-and-conquer.
This file defines functions for fast multiplication and division with remainder.
int LucksWangSparseHeuristic(const CanonicalForm &F, const CFList &factors, int level, const CFList &leadingCoeffs, CFList &result)
sparse heuristic lifting by Wang and Lucks
CFList sparseHeuristic(const CanonicalForm &A, const CFList &biFactors, CFList *&moreBiFactors, const CFList &evaluation, int minFactorsLength)
sparse heuristic which patches together bivariate factors of A wrt. different second variables by the...
This file provides functions for sparse heuristic Hensel lifting.
template CanonicalForm tmax(const CanonicalForm &, const CanonicalForm &)
template CanonicalForm tmin(const CanonicalForm &, const CanonicalForm &)
template List< Variable > Union(const List< Variable > &, const List< Variable > &)
template List< Variable > Difference(const List< Variable > &, const List< Variable > &)
template bool find(const List< CanonicalForm > &, const CanonicalForm &)
INST_VAR CanonicalForm gf_mipo
static BOOLEAN length(leftv result, leftv arg)
ideal lift(const ideal J, const ring r, const ideal inI, const ring s)
int lcm(unsigned long *l, unsigned long *a, unsigned long *b, unsigned long p, int dega, int degb)
static int index(p_Length length, p_Ord ord)
int status int void size_t count
int status int void * buf
static poly normalize(poly next_p, ideal add_generators, syStrategy syzstr, int *g_l, int *p_l, int crit_comp)
#define TIMING_DEFINE_PRINT(t)
#define TIMING_END_AND_PRINT(t, msg)
void prune(Variable &alpha)
CanonicalForm getMipo(const Variable &alpha, const Variable &x)
Variable rootOf(const CanonicalForm &mipo, char name)
returns a symbolic root of polynomial with name name Use it to define algebraic variables