Changeset 86acc34 in git


Ignore:
Timestamp:
May 13, 2014, 3:15:26 PM (10 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', 'fc741b6502fd8a97288eaa3eba6e5220f3c3df87')
Children:
0ac77c459123ddecaf705f0a8aead6339faa5279
Parents:
c9f357778ee9f8d227771940ccf22290fb865982
git-author:
Martin Lee <martinlee84@web.de>2014-05-13 15:15:26+02:00
git-committer:
Martin Lee <martinlee84@web.de>2014-05-21 15:06:53+02:00
Message:
chg: do not waste non-sqrfree norm
File:
1 edited

Legend:

Unmodified
Added
Removed
  • factory/facAlgFunc.cc

    rc9f357 r86acc34  
    490490  }
    491491
    492   sqrfFactors= sqrf_norm (f, Rstar, vminpoly, s, g, R);
    493 
    494   if (getCharacteristic() > 0)
    495   {
    496     if (sqrfFactors.getFirst().factor().inCoeffDomain())
    497       sqrfFactors.removeFirst();
    498 
    499     Variable X;
    500     for (iter= sqrfFactors; iter.hasItem(); iter++)
    501     {
    502       if (hasFirstAlgVar (iter.getItem().factor(), X))
    503       {
    504         // factorize over alg.extension with X
    505         tmp= factorize (iter.getItem().factor(), X);
    506       }
     492  CFGenerator * Gen;
     493  if (getCharacteristic() == 0)
     494    Gen= new IntGenerator();
     495  else if (degree (vminpoly) > 0)
     496    Gen= AlgExtGenerator (vminpoly).clone();
     497  else
     498    Gen= new FFGenerator();
     499
     500  CFFList LL= CFFList (CFFactor (f, 1));
     501
     502  Variable X;
     503  do
     504  {
     505    tmp= CFFList();
     506    for (iter= LL; iter.hasItem(); iter++)
     507    {
     508      f= iter.getItem().factor();
     509      sqrfFactors= sqrf_norm_sub (f, Rstar, *Gen, s, g, R, false);
     510
     511      if (hasFirstAlgVar (R, X))
     512        Factorlist= factorize (R, X);
    507513      else
    508       {
    509         // factorize over k
    510         tmp= factorize (iter.getItem().factor(), true);
    511       }
    512       if (tmp.getFirst().factor().inCoeffDomain())
    513         tmp.removeFirst();
    514       for (iter2= tmp; iter2.hasItem(); iter2++)
    515         Factorlist= append (Factorlist, iter2.getItem());
    516     }
    517   }
    518   else
    519     Factorlist= factorize (R, true);
    520 
    521   if (!Factorlist.getFirst().factor().inCoeffDomain())
    522     Factorlist.insert (CFFactor (1, 1));
    523   if (Factorlist.length() == 2 && Factorlist.getLast().exp() == 1)
    524   {
    525     f= backSubst (f, backSubsts, Astar);
    526     f *= bCommonDen (f);
    527     f= Prem (f, as);
    528     f /= vcontent (f, as.getFirst().mvar());
    529 
    530     L.append(CFFactor(f,1));
    531   }
    532   else
    533   {
    534     g= f;
    535     for (iter= Factorlist; iter.hasItem(); iter++)
    536     {
    537       CanonicalForm fnew= iter.getItem().factor();
    538       if (fnew.level() < Rstar.level()) //factor is a constant from the function field
    539         continue;
     514        Factorlist= factorize (R);
     515
     516      if (!Factorlist.getFirst().factor().inCoeffDomain())
     517        Factorlist.insert (CFFactor (1, 1));
     518      if (Factorlist.length() == 2 && Factorlist.getLast().exp() == 1)
     519      {
     520        f= backSubst (f, backSubsts, Astar);
     521        f *= bCommonDen (f);
     522        f= Prem (f, as);
     523        f /= vcontent (f, as.getFirst().mvar());
     524
     525        L.append (CFFactor (f, 1));
     526        break;
     527      }
    540528      else
    541529      {
    542         fnew= fnew (g.mvar() + s*Rstar.mvar(), g.mvar());
    543         fnew= reduce (fnew, Rstar);
    544       }
    545 
    546       h= alg_gcd (g, fnew, Rstarlist);
    547       numinv= QuasiInverse (Rstar, alg_LC (h, algExtLevel), Rstar.mvar());
    548       h *= numinv;
    549       h= Prem (h, Rstarlist);
    550       h /= vcontent (h, Rstar.mvar());
    551 
    552       if (h.level() >= Rstar.level())
    553       {
    554         g= divide (g, h, Rstarlist);
    555         h= backSubst (h, backSubsts, Astar);
    556         h= Prem (h, as);
    557         h *= bCommonDen (h);
    558         h /= vcontent (h, as.getFirst().mvar());
    559         L.append (CFFactor (h, 1));
    560       }
    561     }
    562     // we are not interested in a
    563     // constant (over K_r, which can be a polynomial!)
    564     if (degree (g, f.mvar()) > 0)
    565       L.append (CFFactor (g, 1));
    566   }
    567   CFFList LL;
    568   if (getCharacteristic() > 0) //do I really need this part?
    569   {
    570     CFFListIterator i=L;
    571     CanonicalForm c_fac=1;
    572     CanonicalForm c;
    573     for(;i.hasItem(); i++ )
    574     {
    575       CanonicalForm ff=i.getItem().factor();
    576       c=alg_lc(ff);
    577       int e=i.getItem().exp();
    578       ff/=c;
    579       if (!ff.isOne()) LL.append(CFFactor(ff,e));
    580       while (e>0) { c_fac*=c;e--; }
    581     }
    582     if (!c_fac.isOne()) LL.insert(CFFactor(c_fac,1));
    583   }
    584   else
    585   {
    586     LL=L;
    587   }
     530        g= f;
     531        for (iter2= Factorlist; iter2.hasItem(); iter2++)
     532        {
     533          CanonicalForm fnew= iter2.getItem().factor();
     534          if (fnew.level() < Rstar.level()) //factor is a constant from the function field
     535            continue;
     536          else
     537          {
     538            fnew= fnew (g.mvar() + s*Rstar.mvar(), g.mvar());
     539            fnew= reduce (fnew, Rstar);
     540          }
     541
     542          h= alg_gcd (g, fnew, Rstarlist);
     543          numinv= QuasiInverse (Rstar, alg_LC (h, algExtLevel), Rstar.mvar());
     544          h *= numinv;
     545          h= Prem (h, Rstarlist);
     546          h /= vcontent (h, Rstar.mvar());
     547
     548          if (h.level() >= Rstar.level())
     549          {
     550            g= divide (g, h, Rstarlist);
     551            if (degree (h) == 1 || iter2.getItem().exp() == 1)
     552            {
     553              h= backSubst (h, backSubsts, Astar);
     554              h= Prem (h, as);
     555              h *= bCommonDen (h);
     556              h /= vcontent (h, as.getFirst().mvar());
     557              L.append (CFFactor (h, 1));
     558            }
     559            else
     560              tmp.append (CFFactor (h, iter2.getItem().exp()));
     561          }
     562        }
     563      }
     564    }
     565    LL= tmp;
     566    (*Gen).next();
     567  }
     568  while (!LL.isEmpty());
    588569
    589570  if (!isRat && getCharacteristic() == 0)
    590571    Off (SW_RATIONAL);
    591572
    592   return LL;
     573  delete Gen;
     574
     575  return L;
    593576}
    594577
Note: See TracChangeset for help on using the changeset viewer.