Changeset 5dad7c7 in git for factory/facFactorize.cc


Ignore:
Timestamp:
Aug 21, 2012, 4:37:56 PM (11 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
Children:
c89740c263a7f55af9bd2cdbff4e77573d7eb82e
Parents:
589ef64cf8eb3dc278fc36630707eda2b0125578
git-author:
Martin Lee <martinlee84@web.de>2012-08-21 16:37:56+02:00
git-committer:
Martin Lee <martinlee84@web.de>2012-09-04 18:01:19+02:00
Message:
chg: minor improvements
chg: check if distribution of leading coeff by variables is applicable
File:
1 edited

Legend:

Unmodified
Added
Removed
  • factory/facFactorize.cc

    r589ef64 r5dad7c7  
    703703  CFList biFactors, bufBiFactors;
    704704  CanonicalForm evalPoly;
    705   int lift, bufLift;
    706   CFList* bufAeval2= new CFList [A.level() - 2];
    707   CFList* Aeval2= new CFList [A.level() - 2];
     705  int lift, bufLift, lengthAeval2= A.level()-2;
     706  CFList* bufAeval2= new CFList [lengthAeval2];
     707  CFList* Aeval2= new CFList [lengthAeval2];
    708708  int counter;
    709709  int differentSecondVar= 0;
     
    755755      biFactors= bufBiFactors;
    756756      lift= bufLift;
    757       for (int j= 0; j < A.level() - 2; j++)
     757      for (int j= 0; j < lengthAeval2; j++)
    758758        Aeval2 [j]= bufAeval2 [j];
    759759      differentSecondVar= counter;
     
    769769        biFactors= bufBiFactors;
    770770        lift= bufLift;
    771         for (int j= 0; j < A.level() - 2; j++)
     771        for (int j= 0; j < lengthAeval2; j++)
    772772          Aeval2 [j]= bufAeval2 [j];
    773773        differentSecondVar= counter;
     
    803803    refineBiFactors (A, biFactors, Aeval2, evaluation, minFactorsLength);
    804804
    805   if (differentSecondVar == A.level() - 2 && getNumVars(LC(A,1)) == A.level()-1)
     805  if (differentSecondVar == lengthAeval2 && getNumVars(LC(A,1)) == A.level()-1)
    806806  {
    807807    bool zeroOccured= false;
     
    833833  CFList uniFactors= buildUniFactors (biFactors, evaluation.getLast(), y);
    834834
    835   sortByUniFactors (Aeval2, A.level() - 2, uniFactors, evaluation);
    836 
    837   CFList * oldAeval= new CFList [A.level() - 2];
    838   for (int i= 0; i < A.level() - 2; i++)
     835  sortByUniFactors (Aeval2, lengthAeval2, uniFactors, evaluation);
     836
     837  CFList * oldAeval= new CFList [lengthAeval2];
     838  for (int i= 0; i < lengthAeval2; i++)
    839839    oldAeval[i]= Aeval2[i];
    840840
     
    847847  Variable w;
    848848  CFList leadingCoeffs= precomputeLeadingCoeff (LC (A, 1), biFactorsLCs,
    849                                           evaluation, Aeval2, A.level() - 2, w);
     849                                          evaluation, Aeval2, lengthAeval2, w);
    850850
    851851  if (w.level() != 1)
     
    865865      }
    866866    }
    867     for (i= 0; i < A.level() - 2; i++)
     867    for (i= 0; i < lengthAeval2; i++)
    868868    {
    869869      if (oldAeval[i].isEmpty())
     
    918918
    919919  //prepare leading coefficients
    920   CFList* leadingCoeffs2= new CFList [A.level() - 2];
     920  CFList* leadingCoeffs2= new CFList [lengthAeval2];
    921921  prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs, biFactors,
    922922                        evaluation);
     
    933933
    934934  CFListIterator iter2;
    935   CFList bufLeadingCoeffs2= leadingCoeffs2[A.level()-3];
     935  CFList bufLeadingCoeffs2= leadingCoeffs2[lengthAeval2-1];
    936936  bufBiFactors= biFactors;
    937937  bufA= A;
    938938  CanonicalForm bufLCmultiplier= LCmultiplier;
     939  CanonicalForm testVars;
     940  if (!LCmultiplierIsConst)
     941  {
     942    testVars= Variable (2);
     943    for (int i= 0; i < lengthAeval2; i++)
     944    {
     945      if (!oldAeval[i].isEmpty())
     946        testVars *= oldAeval[i].getFirst().mvar();
     947    }
     948  }
    939949  CFList bufFactors= CFList();
    940950  bool LCheuristic= false;
    941   if (LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2 [A.level() - 3],
     951  if (LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2[lengthAeval2-1],
    942952                                factors))
    943953  {
     
    973983            iter++;
    974984          iter.remove (1);
    975           for (int j= 0; j < A.level() -2; j++)
     985          for (int j= 0; j < lengthAeval2; j++)
    976986          {
    977987            l= leadingCoeffs2[j];
     
    988998      factors= CFList();
    989999    }
    990     else if (!LCmultiplier.inCoeffDomain() && factors.length() == 0)
     1000    else if (!LCmultiplierIsConst && factors.length() == 0)
    9911001    {
    9921002      LCheuristic= true;
     
    10051015          foundTrueMultiplier= true;
    10061016          int index2= 1;
    1007           for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem(); iter2++,
     1017          for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); iter2++,
    10081018                                                                    index2++)
    10091019          {
     
    10131023          }
    10141024          A= oldA;
    1015           leadingCoeffs= leadingCoeffs2[A.level()-3];
    1016           for (int i= A.level()-3; i > -1; i--)
     1025          leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     1026          for (int i= lengthAeval2-1; i > -1; i--)
    10171027            leadingCoeffs2[i]= CFList();
    10181028          prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs,
     
    10441054            {
    10451055              int index2= 1;
    1046               for (CFListIterator iter3= leadingCoeffs2[A.level()-3];
     1056              for (CFListIterator iter3= leadingCoeffs2[lengthAeval2-1];
    10471057                   iter3.hasItem(); iter3++, index2++)
    10481058              {
     
    10731083              {
    10741084                int index2= 1;
    1075                 for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem();
     1085                for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
    10761086                     iter2++, index2++)
    10771087                {
     
    10871097                iter.getItem()= 1;
    10881098              }
    1089               else //factor consists of just leading coeff
     1099              else if (fdivides (getVars (LCmultiplier), testVars))//factor consists of just leading coeff
    10901100              {
    10911101                Variable xx= Variable (2);
     
    10931103                vars= power (xx, degree (LC (getItem(oldBiFactors, index),1),
    10941104                                          xx));
    1095                 for (int i= 0; i < A.level() -2; i++)
     1105                for (int i= 0; i < lengthAeval2; i++)
    10961106                {
    10971107                  if (oldAeval[i].isEmpty())
     
    11011111                                             xx));
    11021112                }
    1103                 if (myGetVars(content(getItem(leadingCoeffs2[A.level()-3],index),1))
     1113                if (myGetVars(content(getItem(leadingCoeffs2[lengthAeval2-1],index),1))
    11041114                    /myGetVars (LCmultiplier) == vars)
    11051115                {
    11061116                  int index2= 1;
    1107                   for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem();
     1117                  for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
    11081118                       iter2++, index2++)
    11091119                  {
     
    11281138          {
    11291139            A= oldA;
    1130             iter2= leadingCoeffs2[A.level()-3];
     1140            iter2= leadingCoeffs2[lengthAeval2-1];
    11311141            for (iter= contents; iter.hasItem(); iter++, iter2++)
    11321142              iter2.getItem() /= iter.getItem();
    11331143            foundMultiplier= true;
    11341144          }
    1135           if (!foundMultiplier)
     1145          if (!foundMultiplier && fdivides (getVars (LCmultiplier), testVars))
    11361146          {
    11371147            Variable xx;
     
    11441154            for (iter= oldBiFactors; iter.hasItem(); iter++)
    11451155              vars1.append (power (xx, degree (LC (iter.getItem(),1), xx)));
    1146             for (int i= 0; i < A.level() -2; i++)
     1156            for (int i= 0; i < lengthAeval2; i++)
    11471157            {
    11481158              if (oldAeval[i].isEmpty())
     
    11551165            CanonicalForm tmp;
    11561166            iter2= vars1;
    1157             for (iter= leadingCoeffs2[A.level()-3]; iter.hasItem(); iter++,
     1167            for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++,
    11581168                                                                    iter2++)
    11591169            {
     
    11891199                  {
    11901200                    int index2= 1;
    1191                     for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem();
     1201                    for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
    11921202                         iter2++, index2++)
    11931203                    {
     
    12331243                  {
    12341244                    int index2= 1;
    1235                     for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem();
     1245                    for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
    12361246                         iter2++, index2++)
    12371247                    {
     
    12681278
    12691279        // patch everything together again
    1270         leadingCoeffs= leadingCoeffs2[A.level()-3];
    1271         for (int i= A.level()-3; i > -1; i--)
     1280        leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     1281        for (int i= lengthAeval2-1; i > -1; i--)
    12721282          leadingCoeffs2[i]= CFList();
    12731283        prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors,
     
    12831293      }
    12841294      factors= CFList();
    1285       if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[A.level()-3])))
     1295      if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[lengthAeval2-1])))
    12861296      {
    12871297        LCheuristic= false;
    12881298        A= bufA;
    12891299        biFactors= bufBiFactors;
    1290         leadingCoeffs2[A.level()-3]= bufLeadingCoeffs2;
     1300        leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
    12911301        LCmultiplier= bufLCmultiplier;
    12921302      }
     
    12961306    delete [] index;
    12971307  }
    1298   if (!LCheuristic && !LCmultiplierIsConst && bufFactors.isEmpty())
     1308  if (!LCheuristic && !LCmultiplierIsConst && bufFactors.isEmpty()
     1309      && fdivides (getVars (LCmultiplier), testVars))
    12991310  {
    13001311    int index;
     
    13081319    for (iter= oldBiFactors; iter.hasItem(); iter++)
    13091320      vars1.append (power (xx, degree (LC (iter.getItem(),1), xx)));
    1310     for (int i= 0; i < A.level() -2; i++)
     1321    for (int i= 0; i < lengthAeval2; i++)
    13111322    {
    13121323      if (oldAeval[i].isEmpty())
     
    13191330    CanonicalForm tmp;
    13201331    iter2= vars1;
    1321     for (iter= leadingCoeffs2[A.level()-3]; iter.hasItem(); iter++, iter2++)
     1332    for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++, iter2++)
    13221333    {
    13231334      tmp= iter.getItem()/LCmultiplier;
     
    13491360          {
    13501361            int index2= 1;
    1351             for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem(); iter2++,
     1362            for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++,
    13521363                                                                      index2++)
    13531364            {
     
    13891400          {
    13901401            int index2= 1;
    1391             for (iter2= leadingCoeffs2[A.level()-3]; iter2.hasItem(); iter2++,
     1402            for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++,
    13921403                                                                      index2++)
    13931404            {
     
    14201431    }
    14211432
    1422     leadingCoeffs= leadingCoeffs2[A.level()-3];
    1423     for (int i= A.level()-3; i > -1; i--)
     1433    leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     1434    for (int i= lengthAeval2-1; i > -1; i--)
    14241435      leadingCoeffs2[i]= CFList();
    14251436    prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors,
     
    14421453    iter.getItem()= iter.getItem () (y + evaluation.getLast(), y);
    14431454
    1444   for (int i= 0; i < A.level() - 3; i++)
     1455  for (int i= 0; i < lengthAeval2-1; i++)
    14451456    leadingCoeffs2[i]= CFList();
    1446   for (iter= leadingCoeffs2[A.level() - 3]; iter.hasItem(); iter++)
     1457  for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++)
    14471458  {
    14481459    iter.getItem()= shift2Zero (iter.getItem(), list, evaluation);
    14491460    for (int i= A.level() - 4; i > -1; i--)
    14501461    {
    1451       if (i + 1 == A.level() - 3)
     1462      if (i + 1 == lengthAeval2-1)
    14521463        leadingCoeffs2[i].append (iter.getItem() (0, i + 4));
    14531464      else
     
    14701481    commonDenominators.append (bCommonDen (iter.getItem()));
    14711482  CanonicalForm tmp1, tmp2, tmp3=1;
    1472   for (int i= 0; i < A.level() - 2; i++)
     1483  for (int i= 0; i < lengthAeval2; i++)
    14731484  {
    14741485    iter2= commonDenominators;
     
    14981509    iter.getItem() *= tmp3*power (multiplier, biFactors.length() - 1);
    14991510
    1500   for (int i= 0; i < A.level() - 2; i++)
     1511  for (int i= 0; i < lengthAeval2; i++)
    15011512  {
    15021513    iter2= commonDenominators;
     
    15251536      A= bufA;
    15261537      biFactors= bufBiFactors;
    1527       leadingCoeffs2[A.level()-3]= bufLeadingCoeffs2;
     1538      leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
    15281539      delete [] liftBounds;
    15291540      LCheuristic= false;
Note: See TracChangeset for help on using the changeset viewer.