Changeset 1a688ba in git


Ignore:
Timestamp:
Dec 16, 2013, 3:13:24 PM (9 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
Children:
2773fe426f803fdb541ac43df1e156eb4069affc
Parents:
1f4ed35293648146e81ceb849bb6dbba0771e8b3
git-author:
Martin Lee <martinlee84@web.de>2013-12-16 15:13:24+01:00
git-committer:
Martin Lee <martinlee84@web.de>2014-01-20 16:45:03+01:00
Message:
chg: use FLINT instead of NTL in squarefree factorization
Location:
factory
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • factory/facFqSquarefree.cc

    r1f4ed3 r1a688ba  
    3030#endif
    3131
     32#ifdef HAVE_FLINT
     33#include "FLINTconvert.h"
     34#endif
     35
    3236static inline
    3337CanonicalForm
     
    6569    power (NTLA2, NTLA2, q/p);
    6670    A= convertNTLzzpE2CF (NTLA2, alpha);
     71    return A;
     72  }
     73  else
     74  {
     75    CanonicalForm buf= 0;
     76    for (CFIterator i= A; i.hasTerms(); i++)
     77      buf= buf + power(A.mvar(), i.exp()/p)*pthRoot (i.coeff(), q, alpha);
     78    return buf;
     79  }
     80}
     81#endif
     82
     83#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     84CanonicalForm
     85pthRoot (const CanonicalForm & F, const fmpz_t& q, const Variable& alpha)
     86{
     87  CanonicalForm A= F;
     88  int p= getCharacteristic ();
     89  if (A.inCoeffDomain())
     90  {
     91    nmod_poly_t FLINTmipo;
     92    fq_nmod_ctx_t fq_con;
     93    fmpz_t qp;
     94    fq_nmod_t FLINTA;
     95
     96    nmod_poly_init (FLINTmipo, p);
     97    convertFacCF2nmod_poly_t (FLINTmipo, getMipo (alpha));
     98
     99    fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     100
     101    fq_nmod_init2 (FLINTA, fq_con);
     102
     103    convertFacCF2Fq_nmod_t (FLINTA, A, fq_con);
     104
     105    fmpz_init_set (qp, q);
     106    fmpz_divexact_si (qp, qp, p);
     107
     108    fq_nmod_pow (FLINTA, FLINTA, qp, fq_con);
     109    A= convertFq_nmod_t2FacCF (FLINTA, alpha);
     110
     111    fmpz_clear (qp);
     112    nmod_poly_clear (FLINTmipo);
     113    fq_nmod_clear (FLINTA, fq_con);
     114    fq_nmod_ctx_clear (fq_con);
    67115    return A;
    68116  }
     
    195243#endif
    196244    buffer= pthRoot (A, ipower (p, k));
    197 #ifdef HAVE_NTL
     245#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     246  else
     247  {
     248    fmpz_t qq;
     249    fmpz_init_set_ui (qq, p);
     250    fmpz_pow_ui (qq, qq, k);
     251    buffer= pthRoot (A, qq, alpha);
     252    fmpz_clear (qq);
     253  }
     254#else
    198255  else
    199256  {
  • factory/facHensel.cc

    r1f4ed3 r1a688ba  
    3636#include "NTLconvert.h"
    3737
     38#ifdef HAVE_FLINT
     39#include "FLINTconvert.h"
     40#endif
     41
    3842TIMING_DEFINE_PRINT (diotime)
    3943TIMING_DEFINE_PRINT (product1)
     
    8084}
    8185
     86#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     87static
     88CFList productsFLINT (const CFList& factors, const CanonicalForm& M)
     89{
     90  nmod_poly_t FLINTmipo;
     91  fq_nmod_ctx_t fq_con;
     92  fq_nmod_poly_t prod;
     93  fq_nmod_t buf;
     94
     95  nmod_poly_init (FLINTmipo, getCharacteristic());
     96  convertFacCF2nmod_poly_t (FLINTmipo, M);
     97
     98  fq_nmod_ctx_init_modulus (fq_con, FLINTmipo, "Z");
     99
     100  fq_nmod_poly_t * vec=new fq_nmod_poly_t [factors.length()];
     101
     102  int j= 0;
     103
     104  for (CFListIterator i= factors; i.hasItem(); i++, j++)
     105  {
     106    if (i.getItem().inCoeffDomain())
     107    {
     108      fq_nmod_poly_init (vec[j], fq_con);
     109      fq_nmod_init2 (buf, fq_con);
     110      convertFacCF2Fq_nmod_t (buf, i.getItem(), fq_con);
     111      fq_nmod_poly_set_coeff (vec[j], 0, buf, fq_con);
     112      fq_nmod_clear (buf, fq_con);
     113    }
     114    else
     115      convertFacCF2Fq_nmod_poly_t (vec[j], i.getItem(), fq_con);
     116  }
     117
     118  CFList result;
     119  Variable x= Variable (1);
     120  fq_nmod_poly_init (prod, fq_con);
     121  for (j= 0; j < factors.length(); j++)
     122  {
     123    int k= 0;
     124    fq_nmod_poly_one (prod, fq_con);
     125    for (int i= 0; i < factors.length(); i++, k++)
     126    {
     127      if (k == j)
     128        continue;
     129      fq_nmod_poly_mul (prod, prod, vec[i], fq_con);
     130    }
     131    result.append (convertFq_nmod_poly_t2FacCF (prod, x, M.mvar(), fq_con));
     132  }
     133  for (j= 0; j < factors.length(); j++)
     134    fq_nmod_poly_clear (vec[j], fq_con);
     135
     136  nmod_poly_clear (FLINTmipo);
     137  fq_nmod_poly_clear (prod, fq_con);
     138  fq_nmod_ctx_clear (fq_con);
     139  delete [] vec;
     140  return result;
     141}
     142#endif
     143
    82144static
    83145void tryDiophantine (CFList& result, const CanonicalForm& F,
     
    103165    i.getItem()= reduce (i.getItem()*inv, M);
    104166  }
     167#if (HAVE_FLINT && __FLINT_VERSION_MINOR >= 4)
     168  bufFactors= productsFLINT (bufFactors, M);
     169#else
    105170  bufFactors= productsNTL (bufFactors, M);
     171#endif
    106172
    107173  CanonicalForm buf1, buf2, buf3, S, T;
Note: See TracChangeset for help on using the changeset viewer.