Changeset 8256fd in git


Ignore:
Timestamp:
Jul 16, 2012, 11:15:58 AM (11 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', '1d362c315e551a5b527ab0759f8839cf0e94f3a5')
Children:
faa1b8d6e411251ef4c85b56aefa21b74f5db582
Parents:
67a39b21729f20cbd2a5d3b6e61a60d67aa387d9
git-author:
Martin Lee <martinlee84@web.de>2012-07-16 11:15:58+02:00
git-committer:
Martin Lee <martinlee84@web.de>2012-09-04 17:25:37+02:00
Message:
fix: possible hang in multivariate factorization
Location:
factory
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • factory/facFactorize.cc

    r67a39b r8256fd  
    267267  }
    268268
    269   CFMap N;
    270   CanonicalForm F= compress (LCF, N);
     269  CFMap N, M;
     270  CFArray dummy= CFArray (1);
     271  dummy [0]= LCF;
     272  compress (dummy, M, N);
     273  CanonicalForm F= M (LCF);
    271274  if (LCF.isUnivariate())
    272275  {
     
    311314  CFList factors= LCFFactors;
    312315
    313   CFMap dummy;
    314316  for (CFListIterator i= factors; i.hasItem(); i++)
    315     i.getItem()= compress (i.getItem(), dummy);
     317    i.getItem()= M (i.getItem());
    316318
    317319  CanonicalForm sqrfPartF;
     
    333335  {
    334336    int lev= 0;
    335     for (int i= 1; i <= LCF.level(); i++)
    336     {
    337       if(degree (LCF, i) > 0)
    338       {
    339         lev= i - 1;
    340         break;
    341       }
    342     }
    343337    for (int i= 0; i < length; i++)
    344338    {
     
    355349            allConstant= false;
    356350            y= Variable (iter.getItem().level());
     351            lev= M(y).level();
    357352          }
    358353        }
     
    364359          iter.getItem()= swapvar (iter.getItem(), x, y);
    365360        bufF= F;
    366         z= Variable (y.level() - lev);
     361        z= Variable (lev);
    367362        bufF= swapvar (bufF, x, z);
    368363        bufBufFactors= bufFactors;
     
    536531  else
    537532  {
    538     factors= CFList (oldSqrfPartF);
     533    CanonicalForm contF=content (oldSqrfPartF,1);
     534    factors= CFList (oldSqrfPartF/contF);
    539535    interMedResult= recoverFactors (oldSqrfPartF, factors);
    540536  }
     
    799795    if (!zeroOccured)
    800796    {
    801       factors= sparseHeuristic (A, biFactors, Aeval2, evaluation, minFactorsLength);
     797      factors= sparseHeuristic (A, biFactors, Aeval2, evaluation,
     798                                minFactorsLength);
    802799      if (factors.length() == biFactors.length())
    803800      {
     
    832829  {
    833830    A= swapvar (A, y, w);
    834     for (int i= 0; i < A.level() - 2; i++)
    835     {
    836       if (oldAeval[i].isEmpty())
    837         continue;
    838       if (oldAeval[i].getFirst().level() == w.level())
    839       {
    840         biFactors= CFList();
    841         for (CFListIterator iter= oldAeval [i]; iter.hasItem(); iter++)
    842           biFactors.append (swapvar (iter.getItem(), w, y));
    843       }
    844     }
    845831    int i= A.level();
    846832    CanonicalForm evalPoint;
     
    854840        evaluation.append (evalPoint);
    855841        break;
     842      }
     843    }
     844    for (i= 0; i < A.level() - 2; i++)
     845    {
     846      if (oldAeval[i].isEmpty())
     847        continue;
     848      if (oldAeval[i].getFirst().level() == w.level())
     849      {
     850        CFArray tmp= copy (oldAeval[i]);
     851        for (int ii= 0; ii < tmp.size(); ii++)
     852          tmp[ii]= swapvar (tmp[ii], w, y);
     853        CFArray tmp2= CFArray (tmp.size());
     854        CanonicalForm buf;
     855        for (int ii= 0; ii < tmp.size(); ii++)
     856        {
     857          buf= tmp[ii] (evaluation.getLast(),y);
     858          buf /= Lc (buf);
     859          tmp2[findItem (uniFactors, buf)-1]=tmp[ii];
     860        }
     861        biFactors= CFList();
     862        for (int j= 0; j < tmp2.size(); j++)
     863          biFactors.append (tmp2[j]);
    856864      }
    857865    }
     
    906914    if (check == factors.length())
    907915    {
     916
     917      if (w.level() != 1)
     918      {
     919        for (CFListIterator iter= factors; iter.hasItem(); iter++)
     920          iter.getItem()= swapvar (iter.getItem(), w, y);
     921      }
     922
    908923      appendSwapDecompress (factors, contentAFactors, N, 0, 0, x);
    909924      normalize (factors);
  • factory/facFqFactorize.cc

    r67a39b r8256fd  
    11821182    {
    11831183      g= gcd (i.getItem().factor(), j.getItem().factor());
    1184       if (degree (g) > 0)
     1184      if (degree (g,1) > 0)
    11851185      {
    11861186        j.getItem()= CFFactor (j.getItem().factor()/g, j.getItem().exp());
     
    14321432  }
    14331433
    1434   CFMap N;
    1435   CanonicalForm F= compress (LCF, N);
     1434  CFMap N, M;
     1435  CFArray dummy= CFArray (1);
     1436  dummy [0]= LCF;
     1437  compress (dummy, M, N);
     1438  CanonicalForm F= M (LCF);
    14361439  if (LCF.isUnivariate())
    14371440  {
     
    14761479  CFList factors= LCFFactors;
    14771480
    1478   CFMap dummy;
    14791481  for (CFListIterator i= factors; i.hasItem(); i++)
    1480     i.getItem()= compress (i.getItem(), dummy);
     1482    i.getItem()= M (i.getItem());
    14811483
    14821484  CanonicalForm sqrfPartF;
     
    14981500    int lev= 0;
    14991501    // LCF is non-constant here
    1500     for (int i= 1; i <= LCF.level(); i++)
    1501     {
    1502       if(degree (LCF, i) > 0)
    1503       {
    1504         lev= i - 1;
    1505         break;
    1506       }
    1507     }
    15081502    CFList bufBufFactors;
    15091503    CanonicalForm bufF, swap;
     
    15201514            allConstant= false;
    15211515            y= Variable (iter.getItem().level());
     1516            lev= M(y).level();
    15221517          }
    15231518        }
     
    15291524          iter.getItem()= swapvar (iter.getItem(), x, y);
    15301525        bufF= F;
    1531         z= Variable (y.level() - lev);
     1526        z= Variable (lev);
    15321527        bufF= swapvar (bufF, x, z);
    15331528        bufBufFactors= bufFactors;
     
    17001695  else
    17011696  {
    1702     factors= CFList (oldSqrfPartF);
     1697    CanonicalForm contF=content (oldSqrfPartF,1);
     1698    factors= CFList (oldSqrfPartF/contF);
    17031699    interMedResult= recoverFactors (oldSqrfPartF, factors);
    17041700  }
     
    25472543  {
    25482544    A= swapvar (A, y, v);
    2549     for (int i= 0; i < A.level() - 2; i++)
    2550     {
    2551       if (oldAeval[i].isEmpty())
    2552         continue;
    2553       if (oldAeval[i].getFirst().level() == v.level())
    2554       {
    2555         biFactors= CFList();
    2556         for (CFListIterator iter= oldAeval [i]; iter.hasItem(); iter++)
    2557           biFactors.append (swapvar (iter.getItem(), v, y));
    2558       }
    2559     }
    25602545    int i= A.level();
    25612546    CanonicalForm evalPoint;
     
    25692554        evaluation.append (evalPoint);
    25702555        break;
     2556      }
     2557    }
     2558    for (i= 0; i < A.level() - 2; i++)
     2559    {
     2560      if (oldAeval[i].isEmpty())
     2561        continue;
     2562      if (oldAeval[i].getFirst().level() == v.level())
     2563      {
     2564        CFArray tmp= copy (oldAeval[i]);
     2565        for (int ii= 0; ii < tmp.size(); ii++)
     2566          tmp[ii]= swapvar (tmp[ii], v, y);
     2567        CFArray tmp2= CFArray (tmp.size());
     2568        CanonicalForm buf;
     2569        for (int ii= 0; ii < tmp.size(); ii++)
     2570        {
     2571          buf= tmp[ii] (evaluation.getLast(),y);
     2572          buf /= Lc (buf);
     2573          tmp2[findItem (uniFactors, buf)-1]=tmp[ii];
     2574        }
     2575        biFactors= CFList();
     2576        for (int j= 0; j < tmp2.size(); j++)
     2577          biFactors.append (tmp2[j]);
    25712578      }
    25722579    }
Note: See TracChangeset for help on using the changeset viewer.