Changeset 91bc52 in git


Ignore:
Timestamp:
Jan 23, 2021, 5:13:36 PM (2 years ago)
Author:
Daniel Schultz <tthsqe12@…>
Branches:
(u'spielwiese', '0d6b7fcd9813a1ca1ed4220cfa2b104b97a0a003')
Children:
d854d7ee2faa25bc4e7476b6668602d7f4f39384
Parents:
35c6e2c47bae1f858ec6f4a0cdab911b80a1c383
git-author:
Daniel Schultz <tthsqe12@gmail.com>2021-01-23 17:13:36+01:00
git-committer:
Hans Schoenemann <hannes@mathematik.uni-kl.de>2021-01-26 11:36:58+01:00
Message:
add flint code for diophantineQa and fix convertFacCF2Fq_t
Location:
factory
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • factory/FLINTconvert.cc

    r35c6e2c r91bc52  
    113113#include "FLINTconvert.h"
    114114
     115// TODO!! decide if the input to convertCF2Fmpz is expected to be:
     116//  initialized, or
     117//  uninitialized
    115118void convertCF2Fmpz (fmpz_t result, const CanonicalForm& f)
    116119{
    117120  if (f.isImm())
    118     *result=f.intval();
     121    *result=f.intval();                     // assumes uninitialized
    119122    //fmpz_set_si (result, f.intval());
    120123  else
     
    122125    mpz_t gmp_val;
    123126    f.mpzval(gmp_val);
    124     fmpz_set_mpz (result, gmp_val);
     127    fmpz_set_mpz (result, gmp_val);         // assumes initialized
    125128    mpz_clear (gmp_val);
    126129  }
     
    132135  _fmpz_poly_set_length(result, degree(f)+1);
    133136  for (CFIterator i= f; i.hasTerms(); i++)
    134     convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff());
     137    convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff()); // assumes initialized
    135138}
    136139
     
    299302{
    300303  for (CFIterator i= f; i.hasTerms(); i++)
    301     convertCF2Fmpz (&result[i.exp()], i.coeff());
     304    convertCF2Fmpz (&result[i.exp()], i.coeff()); // assumes ?
    302305}
    303306
     
    312315  CanonicalForm den= bCommonDen (f);
    313316  convertFacCF2Fmpz_array (fmpq_poly_numref (result), f*den);
    314   convertCF2Fmpz (fmpq_poly_denref (result), den);
     317  convertCF2Fmpz (fmpq_poly_denref (result), den); // assumes initialized
    315318
    316319  if (!isRat)
     
    409412  fmpz_t FLINTp;
    410413  fmpz_init (FLINTp);
    411   convertCF2Fmpz (FLINTp, b.getpk());
     414  convertCF2Fmpz (FLINTp, b.getpk()); // assumes initialized
    412415  fmpz_mod_ctx_t ctx;
    413416  fmpz_mod_ctx_init(ctx,FLINTp);
     
    470473{
    471474  fmpz_poly_init2 (result, fq_ctx_degree(ctx));
    472   ASSERT (degree (f) < fq_ctx_degree (ctx), "input is not reduced");
    473   _fmpz_poly_set_length(result, degree(f)+1);
     475  _fmpz_poly_set_length(result, fq_ctx_degree(ctx));
     476
    474477  for (CFIterator i= f; i.hasTerms(); i++)
    475     convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff());
    476   #if (__FLINT_RELEASE >= 20700)
    477   _fmpz_vec_scalar_mod_fmpz (result->coeffs, result->coeffs, degree (f) + 1,
    478                              ctx->ctxp->n);
    479   #else
    480   _fmpz_vec_scalar_mod_fmpz (result->coeffs, result->coeffs, degree (f) + 1,
    481                              &ctx->p);
    482   #endif
     478  {
     479    ASSERT(i.exp() < result->length, "input is not reduced");
     480    convertCF2Fmpz (fmpz_poly_get_coeff_ptr(result, i.exp()), i.coeff()); // assumes initialized
     481  }
     482
     483  _fmpz_vec_scalar_mod_fmpz (result->coeffs, result->coeffs, result->length,
     484                             fq_ctx_prime(ctx));
     485
    483486  _fmpz_poly_normalise (result);
    484487}
     
    495498{
    496499  fq_poly_init2 (result, degree (f)+1, ctx);
     500
    497501  _fq_poly_set_length (result, degree (f) + 1, ctx);
    498   fmpz_poly_t buf;
     502
    499503  for (CFIterator i= f; i.hasTerms(); i++)
    500504  {
    501     convertFacCF2Fmpz_poly_t (buf, i.coeff());
    502     #if (__FLINT_RELEASE >= 20700)
    503     _fmpz_vec_scalar_mod_fmpz (buf->coeffs, buf->coeffs, degree (i.coeff()) + 1,
    504                                ctx->ctxp->n);
    505     #else
    506     _fmpz_vec_scalar_mod_fmpz (buf->coeffs, buf->coeffs, degree (i.coeff()) + 1,
    507                                &ctx->p);
    508     #endif
    509     _fmpz_poly_normalise (buf);
     505    fq_t buf;
     506    convertFacCF2Fq_t (buf, i.coeff(), ctx);
    510507    fq_poly_set_coeff (result, i.exp(), buf, ctx);
    511     fmpz_poly_clear (buf);
     508    fq_clear (buf, ctx);
    512509  }
    513510}
     
    582579    for(j=m.columns();j>0;j--)
    583580    {
    584       convertCF2Fmpz (fmpz_mat_entry (M,i-1,j-1), m(i,j));
     581      convertCF2Fmpz (fmpz_mat_entry (M,i-1,j-1), m(i,j)); // assumes initialized
    585582    }
    586583  }
     
    728725    fmpz_t c;
    729726    fmpz_init(c);
    730     convertCF2Fmpz(c,f);
     727    convertCF2Fmpz(c,f); // assumes initialized
    731728    fmpz_mpoly_push_term_fmpz_ui(result,c,exp,ctx);
    732729    fmpz_clear(c);
  • factory/cf_factor.cc

    r35c6e2c r91bc52  
    925925    else //Q(a)[x1,...,xn]
    926926    {
    927       #ifdef HAVE_NTL
     927      #if defined(HAVE_NTL) || defined(HAVE_FLINT)
    928928      F= ratFactorize (f, alpha);
    929929      #else
    930       factoryError ("multivariate factorization over Q(alpha) depends on NTL(missing)");
     930      factoryError ("multivariate factorization over Q(alpha) depends on NTL or FLINT (missing)");
    931931      return CFFList (CFFactor (f, 1));
    932932      #endif
  • factory/facBivar.cc

    r35c6e2c r91bc52  
    185185}
    186186
    187 #ifdef HAVE_NTL // henselLiftAndEarly
     187#if defined(HAVE_NTL) || defined(HAVE_FLINT) // henselLiftAndEarly
    188188CFList biFactorize (const CanonicalForm& F, const Variable& v)
    189189{
  • factory/facFactorize.h

    r35c6e2c r91bc52  
    4343                const Variable& v           ///< [in] some algebraic variable
    4444               );
    45 #ifdef HAVE_NTL // ratBiSqrfFactorize
     45
     46#if defined(HAVE_NTL) || defined(HAVE_FLINT) // ratBiSqrfFactorize
    4647/// factorize a squarefree multivariate polynomial over \f$ Q(\alpha) \f$
    4748///
     
    6970#endif
    7071
    71 #ifdef HAVE_NTL // multiFactorize, henselLiftAndEarly, nonMonicHenselLift
     72#if defined(HAVE_NTL) || defined(HAVE_FLINT) // multiFactorize, henselLiftAndEarly, nonMonicHenselLift
    7273/// factorize a multivariate polynomial over \f$ Q(\alpha) \f$
    7374///
  • factory/facFqBivar.cc

    r35c6e2c r91bc52  
    11481148}
    11491149
    1150 #ifdef HAVE_NTL // henselLift12
     1150#if defined(HAVE_NTL) || defined(HAVE_FLINT) // henselLift12
    11511151CFList
    11521152henselLiftAndEarly (CanonicalForm& A, bool& earlySuccess, CFList&
  • factory/facHensel.cc

    r35c6e2c r91bc52  
    474474diophantine (const CanonicalForm& F, const CFList& factors);
    475475
    476 #ifdef HAVE_NTL // diophantine
     476#if defined(HAVE_NTL) || defined(HAVE_FLINT) // diophantine
    477477CFList
    478478diophantineHensel (const CanonicalForm & F, const CFList& factors,
     
    777777
    778778
     779
    779780/// solve \f$ 1=\sum_{i=1}^n{\delta_{i} \prod_{j\neq i}{f_j}} \f$ mod \f$p^k\f$
    780781/// over \f$ Q(\alpha) \f$ by first computing mod \f$p\f$ and if no zero divisor
    781782/// occurred compute it mod \f$p^k\f$
    782 #ifdef HAVE_NTL // XGCD, zzp_eX
     783#if defined(HAVE_NTL) || defined(HAVE_FLINT) // XGCD, zzp_eX
    783784CFList
    784785diophantineQa (const CanonicalForm& F, const CanonicalForm& G,
     
    862863  else
    863864    buf2= divNTL (F, i.getItem(), b);
     865
     866#ifdef HAVE_NTL
    864867  ZZ_p::init (convertFacCF2NTLZZ (b.getpk()));
    865868  ZZ_pX NTLmipo= to_ZZ_pX (convertFacCF2NTLZZX (getMipo (gamma)));
     
    871874  result.append (b (convertNTLZZ_pEX2CF (NTLS, x, gamma)));
    872875  result.append (b (convertNTLZZ_pEX2CF (NTLT, x, gamma)));
     876#else   // flint
     877  fmpz_t bigpk;
     878  fq_ctx_t fqctx;
     879  fmpz_mod_poly_t FLINTmipo;
     880  fq_poly_t FLINTS, FLINTT, FLINTbuf3, FLINTbuf1, FLINTbuf2;
     881  fq_t fcheck;
     882
     883  fmpz_init(bigpk); // does convert expect an initalized object?
     884  convertCF2Fmpz(bigpk, b.getpk());
     885
     886  convertFacCF2Fmpz_mod_poly_t(FLINTmipo, getMipo(gamma), bigpk);
     887
     888#if __FLINT_RELEASE >= 20700
     889  fmpz_mod_ctx_t bigpk_ctx;
     890  fmpz_mod_ctx_init(bigpk_ctx, bigpk);
     891  fq_ctx_init_modulus(fqctx, FLINTmipo, bigpk_ctx, "Z");
     892  fmpz_mod_ctx_clear(bigpk_ctx);
     893#else
     894  fq_ctx_init_modulus(fqctx, FLINTmipo, "Z");
     895#endif
     896
     897  fq_init(fcheck, fqctx);
     898  fq_poly_init(FLINTS, fqctx);
     899  fq_poly_init(FLINTT, fqctx);
     900  fq_poly_init(FLINTbuf3, fqctx);
     901  //fq_poly_init(FLINTbuf1, fqctx); //convert expects uninitialized!
     902  //fq_poly_init(FLINTbuf2, fqctx); //convert expects uninitialized!
     903  convertFacCF2Fq_poly_t(FLINTbuf1, buf1, fqctx);
     904  convertFacCF2Fq_poly_t(FLINTbuf2, buf2, fqctx);
     905
     906  fq_poly_xgcd_euclidean_f(fcheck, FLINTbuf3, FLINTS, FLINTT,
     907                                                  FLINTbuf1, FLINTbuf2, fqctx);
     908  if (!fq_is_one(fcheck, fqctx))
     909  {
     910    printf("factory error: non-invertible element encountered\n");
     911    abort();
     912  }
     913
     914  result.append(b(convertFq_poly_t2FacCF(FLINTS, x, alpha, fqctx)));
     915  result.append(b(convertFq_poly_t2FacCF(FLINTT, x, alpha, fqctx)));
     916#endif
     917
    873918  if (i.hasItem())
    874919    i++;
     
    879924    else
    880925      buf1= divNTL (F, i.getItem(), b);
     926
     927#ifdef HAVE_NTL
    881928    XGCD (NTLbuf3, NTLS, NTLT, NTLbuf3, convertFacCF2NTLZZ_pEX (buf1, NTLmipo));
    882929    S= convertNTLZZ_pEX2CF (NTLS, x, gamma);
     930#else // HAVE_FLINT
     931    fq_poly_clear(FLINTbuf1, fqctx); //convert expects uninitialized!
     932    convertFacCF2Fq_poly_t(FLINTbuf1, buf1, fqctx);
     933    fq_poly_xgcd_euclidean_f(fcheck, FLINTbuf3, FLINTS, FLINTT,
     934                                                  FLINTbuf3, FLINTbuf1, fqctx);
     935    if (!fq_is_one(fcheck, fqctx))
     936    {
     937      printf("factory error: non-invertible element encountered\n");
     938      abort();
     939    }
     940
     941    S= convertFq_poly_t2FacCF(FLINTS, x, alpha, fqctx);
     942#endif
     943
    883944    CFListIterator k= bufFactors;
    884945    for (CFListIterator j= result; j.hasItem(); j++, k++)
     
    887948      j.getItem()= modNTL (j.getItem(), k.getItem(), b);
    888949    }
     950#if HAVE_NTL
    889951    result.append (b (convertNTLZZ_pEX2CF (NTLT, x, gamma)));
    890   }
     952#else
     953    result.append (b (convertFq_poly_t2FacCF(FLINTT, x, alpha, fqctx)));
     954#endif
     955  }
     956
     957#if HAVE_NTL
     958  // no cleanup for ntl
     959#else
     960  fmpz_clear(bigpk);
     961  fq_clear(fcheck, fqctx);
     962  fq_poly_clear(FLINTS, fqctx);
     963  fq_poly_clear(FLINTT, fqctx);
     964  fq_poly_clear(FLINTbuf3, fqctx);
     965  fq_poly_clear(FLINTbuf1, fqctx);
     966  fq_poly_clear(FLINTbuf2, fqctx);
     967  fq_ctx_clear(fqctx);
     968#endif
     969
    891970  return result;
    892971}
    893972#endif
    894973
    895 #ifdef HAVE_NTL // diophantineQa
     974#if defined(HAVE_NTL) || defined(HAVE_FLINT) // diophantineQa
    896975CFList
    897976diophantine (const CanonicalForm& F, const CanonicalForm& G,
     
    9461025#endif
    9471026
    948 #ifdef HAVE_NTL // diophantineQa
     1027#if defined(HAVE_NTL) || defined(HAVE_FLINT) // diophantineQa
    9491028CFList
    9501029diophantine (const CanonicalForm& F, const CFList& factors)
     
    11581237}
    11591238
    1160 #ifdef HAVE_NTL // diopantineQa
     1239#if defined(HAVE_NTL) || defined(HAVE_FLINT) // diopantineQa
    11611240void
    11621241henselLift12 (const CanonicalForm& F, CFList& factors, int l, CFArray& Pi,
     
    12181297#endif
    12191298
    1220 #ifdef HAVE_NTL //henselLift12
     1299#if defined(HAVE_NTL) || defined(HAVE_FLINT) //henselLift12
    12211300void
    12221301henselLift12 (const CanonicalForm& F, CFList& factors, int l, CFArray& Pi,
Note: See TracChangeset for help on using the changeset viewer.