Changeset ce2576 in git


Ignore:
Timestamp:
Nov 10, 2011, 5:59:46 PM (12 years ago)
Author:
Martin Lee <martinlee84@…>
Branches:
(u'spielwiese', '91fdef05f09f54b8d58d92a472e9c4a43aa4656f')
Children:
3826d071b0fe1a52a0fa5cdc532b9c99960c5018
Parents:
6051d879db769fabc5f68f3052af02b306ccf1a6
git-author:
Martin Lee <martinlee84@web.de>2011-11-10 17:59:46+01:00
git-committer:
Oleksandr Motsak <motsak@mathematik.uni-kl.de>2011-11-10 18:27:53+01:00
Message:
FIX: conversion over algebraic extensions and partly transcendental
NOTE: conversion over transcendental extensions do not work due to bug in p_Cleardenom in p_polys.cc
Location:
libpolys/polys
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libpolys/polys/clapconv.cc

    r6051d87 rce2576  
    1717#include <omalloc/omalloc.h>
    1818#include <coeffs/coeffs.h>
     19#include <coeffs/longrat.h>
     20#include <coeffs/modulop.h>
    1921#include <polys/monomials/p_polys.h>
    2022#include <polys/sbuckets.h>
    2123#include <polys/clapconv.h>
    2224
    23 //typedef __mpz_struct lint;
     25#include "simpleideals.h"
     26
     27#define TRANSEXT_PRIVATES
     28#include <polys/ext_fields/transext.h>
     29
     30typedef __mpz_struct lint;
    2431
    2532void out_cf(char *s1,const CanonicalForm &f,char *s2);
    2633
    2734static void conv_RecPP ( const CanonicalForm & f, int * exp, sBucket_pt result, ring r );
     35
     36static void convRecTrP ( const CanonicalForm & f, int * exp, poly & result, int offs, const ring r );
     37
     38static void convRecGFGF ( const CanonicalForm & f, int * exp, poly & result );
    2839
    2940static number convFactoryNSingAN( const CanonicalForm &f, const ring r);
     
    6071    poly term = p_Init(r);
    6172    pNext( term ) = NULL;
    62     int varoffset=r->cf->factoryVarOffset;
    6373    for ( int i = 1; i <= r->N; i++ )
    64       p_SetExp( term, i-varoffset, exp[i], r);
     74      p_SetExp( term, i, exp[i], r);
    6575    pGetCoeff( term )=r->cf->convFactoryNSingN(f, r->cf);
    6676    p_Setm( term, r );
     
    8999    if (errorreported) break;
    90100    setChar=FALSE;
    91     int varoffset=r->cf->factoryVarOffset;
    92101    for ( int i = n; i >0; i-- )
    93102    {
    94103      if ( (e = p_GetExp( p, i, r)) != 0 )
    95         term *= power( Variable( i+varoffset ), e );
     104        term *= power( Variable( i ), e );
    96105    }
    97106    result += term;
     
    101110}
    102111
    103 CanonicalForm convSingAFactoryA( number pp, Variable a, const coeffs cf )
     112int convFactoryISingI( const CanonicalForm & f)
     113{
     114  if (!f.isImm()) WerrorS("int overflow in det");
     115  return f.intval();
     116}
     117
     118CanonicalForm convSingAPFactoryAP ( poly p , const Variable & a, const ring r)
     119{
     120  CanonicalForm result = 0;
     121  int e, n = r-> N;
     122  int off=rPar(r);
     123
     124  On(SW_RATIONAL);
     125  while ( p!=NULL)
     126  {
     127    CanonicalForm term=convSingAFactoryA(((poly)p_GetCoeff(p, r->cf->extRing)),a, r);
     128    for ( int i = 1; i <= n; i++ )
     129    {
     130      if ( (e = p_GetExp( p, i, r )) != 0 )
     131        term *= power( Variable( i + off), e );
     132    }
     133    result += term;
     134    pIter( p );
     135  }
     136  return result;
     137}
     138
     139static void
     140convRecAP_R ( const CanonicalForm & f, int * exp, poly & result, int par_start, int var_start, const ring r) ;
     141
     142poly convFactoryAPSingAP_R ( const CanonicalForm & f, int par_start, int var_start, const ring r )
     143{
     144  int n = rVar(r)+rPar(r)+1;
     145  int * exp = (int *)omAlloc0(n*sizeof(int));
     146  poly result = NULL;
     147  convRecAP_R( f, exp, result,par_start, var_start, r );
     148  omFreeSize((ADDRESS)exp,n*sizeof(int));
     149  return result;
     150}
     151
     152poly convFactoryAPSingAP ( const CanonicalForm & f, const ring r )
     153{
     154  return convFactoryAPSingAP_R(f,0,rPar(r),r);
     155}
     156
     157static void convRecAP_R ( const CanonicalForm & f, int * exp, poly & result, int par_start, int var_start, const ring r )
     158{
     159  if (f.isZero())
     160    return;
     161  if ( ! f.inCoeffDomain() )
     162  {
     163    int l = f.level();
     164    for ( CFIterator i = f; i.hasTerms(); i++ )
     165    {
     166      exp[l] = i.exp();
     167      convRecAP_R( i.coeff(), exp, result, par_start, var_start, r);
     168    }
     169    exp[l] = 0;
     170  }
     171  else
     172  {
     173    poly z=(poly)convFactoryASingA( f,r );
     174    if (z!=NULL)
     175    {
     176      poly term = p_Init(r);
     177      pNext( term ) = NULL;
     178      int i;
     179      for ( i = rVar(r); i>0 ; i-- )
     180        p_SetExp( term, i , exp[i+var_start],r);
     181      //if (rRing_has_Comp(currRing->extRing)) p_SetComp(term, 0, currRing->extRing); // done by pInit
     182      if (par_start==0)
     183      {
     184        for ( i = 1; i <= var_start; i++ )
     185        //z->e[i-1]+=exp[i];
     186          p_AddExp(z,i,exp[i],r->cf->extRing);
     187      }
     188      else
     189      {
     190        for ( i = par_start+1; i <= var_start+rPar(r); i++ )
     191        //z->e[i-1]+=exp[i];
     192          p_AddExp(z,i,exp[i-par_start],r->cf->extRing);
     193      }
     194      pGetCoeff(term)=(number)ALLOC0_RNUMBER();
     195      p_GetCoeff(term, r->cf->extRing)=(number) z;
     196      p_Setm( term,r );
     197      result = p_Add_q( result, term, r );
     198    }
     199  }
     200}
     201
     202CanonicalForm convSingAFactoryA ( poly p , const Variable & a, const ring r )
    104203{
    105204  CanonicalForm result = 0;
    106205  int e;
    107   poly p=(poly)pp;
    108   BOOLEAN setChar=TRUE;
    109206
    110207  while ( p!=NULL )
    111208  {
    112209    CanonicalForm term;
    113     term=cf->extRing->cf->convSingNFactoryN(pGetCoeff( p ),setChar, cf->extRing->cf);
    114     if (errorreported) break;
    115     setChar=FALSE;
    116     if ( (e = p_GetExp( p, 1, cf->extRing)) != 0 )
    117         term *= power( a, e );
     210    if ( rField_is_Zp_a(r) )
     211    {
     212      term = n_Int( p_GetCoeff( p, r->cf->extRing ), r->cf->extRing->cf );
     213    }
     214    else
     215    {
     216      if ( SR_HDL(p_GetCoeff( p, r->cf->extRing )) & SR_INT )
     217        term = SR_TO_INT(p_GetCoeff( p, r->cf->extRing )) ;
     218      else
     219      {
     220        if ( p_GetCoeff( p, r->cf->extRing )->s == 3 )
     221        {
     222          lint dummy;
     223          mpz_init_set( &dummy, (p_GetCoeff( p,r->cf->extRing )->z) );
     224          term = make_cf( dummy );
     225        }
     226        else
     227        {
     228          // assume s==0 or s==1
     229          lint num, den;
     230          On(SW_RATIONAL);
     231          mpz_init_set( &num, (p_GetCoeff( p, r->cf->extRing )->z) );
     232          mpz_init_set( &den, (p_GetCoeff( p, r->cf->extRing )->n) );
     233          term = make_cf( num, den, ( p_GetCoeff( p, r->cf->extRing )->s != 1 ));
     234        }
     235      }
     236    }
     237    if ( (e = p_GetExp( p, 1, r->cf->extRing )) != 0 )
     238      term *= power( a , e );
    118239    result += term;
    119     pIter( p );
    120   }
    121   return result;
    122 }
    123 
    124 number convFactoryASingA ( const CanonicalForm & f, const coeffs cf )
     240    p = pNext( p );
     241  }
     242  return result;
     243}
     244
     245static number convFactoryNSingAN( const CanonicalForm &f, const ring r)
     246{
     247  if ( f.isImm() )
     248    return n_Init( f.intval(), r->cf->extRing->cf);
     249  else
     250  {
     251    number z=ALLOC_RNUMBER();
     252#if defined(LDEBUG)
     253    z->debug=123456;
     254#endif
     255    gmp_numerator( f, z->z );
     256    if ( f.den().isOne() )
     257    {
     258      z->s = 3;
     259    }
     260    else
     261    {
     262      gmp_denominator( f, z->n );
     263      z->s = 0;
     264      nlNormalize(z,r->cf->extRing->cf);
     265    }
     266    /*#ifdef LDEBUG
     267    nlTest(z,r->cf->extRing->cf);
     268    #endif*/
     269    return z;
     270  }
     271}
     272
     273poly convFactoryASingA ( const CanonicalForm & f, const ring r )
    125274{
    126275  poly a=NULL;
     
    128277  for( CFIterator i=f; i.hasTerms(); i++)
    129278  {
    130     t=p_New(cf->extRing);
    131     // pNext( t ) = NULL; //already done by napNew
    132     pGetCoeff(t)=cf->extRing->cf->convFactoryNSingN( i.coeff(), cf->extRing->cf );
    133     if (n_IsZero(p_GetCoeff(t,cf->extRing),cf->extRing->cf))
    134     {
    135       p_Delete(&t,cf->extRing);
     279    t= p_Init (r->cf->extRing);
     280    p_GetCoeff(t, r->cf->extRing)= convFactoryNSingAN( i.coeff(), r );
     281    if (n_IsZero(p_GetCoeff(t,r->cf->extRing),r->cf->extRing->cf))
     282    {
     283      p_Delete(&t,r->cf->extRing);
    136284    }
    137285    else
    138286    {
    139       p_SetExp(t,1,i.exp(),cf->extRing);
    140       a=p_Add_q(a,t,cf->extRing);
    141     }
    142   }
    143   number aa=(number)a;
    144   n_Normalize(aa,cf);
    145   return aa;
    146 }
    147 
    148 
    149 int convFactoryISingI( const CanonicalForm & f)
    150 {
    151   if (!f.isImm()) WerrorS("int overflow in det");
    152   return f.intval();
    153 }
     287      p_SetExp(t,1,i.exp(),r->cf->extRing);
     288      a=p_Add_q(a,t,r->cf->extRing);
     289    }
     290  }
     291  if (a!=NULL)
     292  {
     293    if (r->cf->extRing->minideal->m[0]!=NULL)
     294    {
     295      poly l=r->cf->extRing->minideal->m[0];
     296      if (p_GetExp(a,1,r->cf->extRing) >= p_GetExp(l,1,r->cf->extRing))
     297        a = p_PolyDiv (a, l, FALSE, r->cf->extRing);
     298    }
     299  }
     300  return a;
     301}
     302
     303CanonicalForm convSingTrPFactoryP ( poly p, const ring r )
     304{
     305  CanonicalForm result = 0;
     306  int e, n = rVar(r);
     307  int offs = rPar(r);
     308
     309  while ( p!=NULL )
     310  {
     311    n_Normalize(p_GetCoeff(p, r), r->cf);
     312    CanonicalForm term=convSingPFactoryP(NUM(p_GetCoeff(p, r)),r->cf->extRing);
     313
     314    if ((DEN(p_GetCoeff(p,r))!=NULL)
     315    && (!errorreported))
     316    {
     317      WerrorS("conversion error: denominator!= 1");
     318    }
     319
     320    for ( int i = n; i > 0; i-- )
     321    {
     322      if ( (e = p_GetExp( p, i,r )) != 0 )
     323        term = term * power( Variable( i + offs ), e );
     324    }
     325    result += term;
     326    p = pNext( p );
     327  }
     328  return result;
     329}
     330
     331poly convFactoryPSingTrP ( const CanonicalForm & f, const ring r )
     332{
     333  int n = rVar(r)+1;
     334  int * exp = (int*)omAlloc0(n*sizeof(int));
     335  poly result = NULL;
     336  convRecTrP( f, exp, result , rPar(r), r );
     337  omFreeSize((ADDRESS)exp,n*sizeof(int));
     338  return result;
     339}
     340
     341static void
     342convRecTrP ( const CanonicalForm & f, int * exp, poly & result , int offs, const ring r)
     343{
     344  if (f.isZero())
     345    return;
     346  if ( f.level() > offs )
     347  {
     348    int l = f.level();
     349    for ( CFIterator i = f; i.hasTerms(); i++ )
     350    {
     351      exp[l-offs] = i.exp();
     352      convRecTrP( i.coeff(), exp, result, offs, r );
     353    }
     354    exp[l-offs] = 0;
     355  }
     356  else
     357  {
     358    poly term = p_Init(r);
     359    pNext( term ) = NULL;
     360    for ( int i = rVar(r); i>0; i-- )
     361      p_SetExp( term, i ,exp[i], r);
     362    //if (rRing_has_Comp(currRing)) p_SetComp(term, 0, currRing); // done by pInit
     363    pGetCoeff(term) = ALLOC0_RNUMBER(); // Q!?
     364    NUM(pGetCoeff(term))=convFactoryPSingP( f, r->cf->extRing );
     365    p_Setm( term,r );
     366    result = p_Add_q( result, term,r );
     367  }
     368}
     369
     370#if 0
     371CanonicalForm
     372convSingGFFactoryGF( poly p )
     373{
     374  CanonicalForm result=CanonicalForm(0);
     375  int e, n = pVariables;
     376
     377  while ( p != NULL )
     378  {
     379    CanonicalForm term;
     380    term = make_cf_from_gf( (int)(long)pGetCoeff( p ) );
     381    //int * A=(int *)&term;
     382    //Print("term=%x, == 0 ?: %d\n",*A, term.isZero());
     383    for ( int i = 1; i <= n; i++ )
     384    {
     385      if ( (e = pGetExp( p, i )) != 0 )
     386         term *= power( Variable( i ), e );
     387    }
     388    result += term;
     389    p = pNext( p );
     390  }
     391  return result;
     392}
     393
     394poly
     395convFactoryGFSingGF ( const CanonicalForm & f )
     396{
     397//    cerr << " f = " << f << endl;
     398  int n = pVariables+1;
     399  /* ASSERT( level( f ) <= pVariables, "illegal number of variables" ); */
     400  int * exp = (int*)omAlloc0(n*sizeof(int));
     401  poly result = NULL;
     402  convRecGFGF( f, exp, result );
     403  omFreeSize((ADDRESS)exp,n*sizeof(int));
     404  return result;
     405}
     406
     407static void
     408convRecGFGF ( const CanonicalForm & f, int * exp, poly & result )
     409{
     410  if (f.isZero())
     411    return;
     412  if ( ! f.inCoeffDomain() )
     413  {
     414    int l = f.level();
     415    for ( CFIterator i = f; i.hasTerms(); i++ )
     416    {
     417      exp[l] = i.exp();
     418      convRecGFGF( i.coeff(), exp, result );
     419    }
     420    exp[l] = 0;
     421  }
     422  else
     423  {
     424    poly term = pInit();
     425    pNext( term ) = NULL;
     426    for ( int i = 1; i <= pVariables; i++ )
     427      pSetExp( term, i, exp[i]);
     428    //if (rRing_has_Comp(currRing)) p_SetComp(term, 0, currRing); // done by pInit
     429    pGetCoeff( term ) = (number) gf_value (f);
     430    pSetm( term );
     431    result = pAdd( result, term );
     432  }
     433}
     434
    154435#endif
     436#endif
  • libpolys/polys/clapconv.h

    r6051d87 rce2576  
    2222int convFactoryISingI( const CanonicalForm & f);
    2323
    24 CanonicalForm convSingAFactoryA( number pp, Variable a, const coeffs cf );
    25 number convFactoryASingA ( const CanonicalForm & f, const coeffs cf );
     24CanonicalForm convSingAPFactoryAP ( poly p , const Variable & a, const ring r );
     25poly convFactoryAPSingAP ( const CanonicalForm & f, const ring r );
     26poly convFactoryAPSingAP_R ( const CanonicalForm & f, int par_start, int var_start );
     27
     28//CanonicalForm convSingGFFactoryGF ( poly p, const ring r );
     29//poly convFactoryGFSingGF ( const CanonicalForm & f, const ring r );
     30
     31CanonicalForm convSingAFactoryA ( poly p , const Variable & a, const ring r );
     32poly convFactoryASingA ( const CanonicalForm & f, const ring r );
     33
     34CanonicalForm convSingTrPFactoryP ( poly p, const ring r );
     35poly convFactoryPSingTrP ( const CanonicalForm & f, const ring r );
    2636
    2737// HAVE_FACTORY
  • libpolys/polys/clapsing.cc

    r6051d87 rce2576  
    3131#include "ext_fields/transext.h"
    3232
    33 // TODO(Martin, Please adapt the following code for the use in SW)
    34 
    3533
    3634#include "clapsing.h"
     
    5856
    5957  Off(SW_RATIONAL);
    60   CanonicalForm F( convSingPFactoryP( f,r ) ), G( convSingPFactoryP( g, r ) );
    61   bool b1=isOn(SW_USE_QGCD);
    62   bool b2=isOn(SW_USE_fieldGCD);
    63   if ( rField_is_Q_a(r) ) On(SW_USE_QGCD);
    64   else                   On(SW_USE_fieldGCD);
    65   res=convFactoryPSingP( gcd( F, G ) , r);
    66   if (!b1) Off(SW_USE_QGCD);
    67   if (!b2) Off(SW_USE_fieldGCD);
     58  if (rField_is_Q(r) || (rField_is_Zp(r)))
     59  {
     60    bool b1=isOn(SW_USE_EZGCD_P);
     61    Off (SW_USE_NTL_GCD_P);
     62    setCharacteristic( rChar(r) );
     63    CanonicalForm F( convSingPFactoryP( f,r ) ), G( convSingPFactoryP( g, r ) );
     64    res=convFactoryPSingP( gcd( F, G ) , r);
     65    if (!b1) Off (SW_USE_EZGCD_P);
     66  }
     67  // and over Q(a) / Fp(a)
     68  else if ( rField_is_Extension(r))
     69  {
     70    if ( rField_is_Q_a(r)) setCharacteristic( 0 );
     71    else                   setCharacteristic( rChar(r) );
     72    if (r->cf->extRing->minideal!=NULL)
     73    {
     74      bool b1=isOn(SW_USE_QGCD);
     75      bool b2=isOn(SW_USE_fieldGCD);
     76      if ( rField_is_Q_a(r) ) On(SW_USE_QGCD);
     77      else                   On(SW_USE_fieldGCD);
     78      CanonicalForm mipo=convSingPFactoryP(r->cf->extRing->minideal->m[0],
     79                                           r->cf->extRing);
     80      Variable a=rootOf(mipo);
     81      CanonicalForm F( convSingAPFactoryAP( f,a,r ) ),
     82                    G( convSingAPFactoryAP( g,a,r ) );
     83      res= convFactoryAPSingAP( gcd( F, G ),r );
     84      if (!b1) Off(SW_USE_QGCD);
     85      if (!b2) Off(SW_USE_fieldGCD);
     86    }
     87    else
     88    {
     89      CanonicalForm F( convSingTrPFactoryP( f,r ) ), G( convSingTrPFactoryP( g,r ) );
     90      res= convFactoryPSingTrP( gcd( F, G ),r );
     91    }
     92  }
     93  else
     94    WerrorS( feNotImplemented );
    6895  Off(SW_RATIONAL);
    6996  return res;
     
    111138  if ((f==NULL) || (g==NULL))
    112139    goto resultant_returns_res;
    113   { 
    114     Variable X(i); // TODO: consider extensions
    115     CanonicalForm F( convSingPFactoryP( f, r ) ), G( convSingPFactoryP( g, r ) );
    116     res=convFactoryPSingP( resultant( F, G, X ), r );
     140  // for now there is only the possibility to handle polynomials over
     141  // Q and Fp ...
     142  if (rField_is_Zp(r) || rField_is_Q(r))
     143  {
     144    Variable X(i);
     145    setCharacteristic( rChar(r) );
     146    CanonicalForm F( convSingPFactoryP( f,r ) ), G( convSingPFactoryP( g,r ) );
     147    res=convFactoryPSingP( resultant( F, G, X),r );
    117148    Off(SW_RATIONAL);
    118   }
     149    goto resultant_returns_res;
     150  }
     151  // and over Q(a) / Fp(a)
     152  else if (rField_is_Extension(r))
     153  {
     154    if (rField_is_Q_a(r)) setCharacteristic( 0 );
     155    else               setCharacteristic( rChar(r) );
     156    Variable X(i+rPar(r));
     157    if (r->cf->extRing->minideal!=NULL)
     158    {
     159      //Variable X(i);
     160      CanonicalForm mipo=convSingPFactoryP(r->cf->extRing->minideal->m[0],
     161                                           r->cf->extRing);
     162      Variable a=rootOf(mipo);
     163      CanonicalForm F( convSingAPFactoryAP( f,a,r ) ),
     164                    G( convSingAPFactoryAP( g,a,r ) );
     165      res= convFactoryAPSingAP( resultant( F, G, X ),r );
     166    }
     167    else
     168    {
     169      //Variable X(i+rPar(currRing));
     170      number nf,ng;
     171      p_Cleardenom_n(f,r,nf);p_Cleardenom_n(g,r,ng);
     172      int ef,eg;
     173      ef=pGetExp_Var(f,i,r);
     174      eg=pGetExp_Var(g,i,r);
     175      CanonicalForm F( convSingTrPFactoryP( f,r ) ), G( convSingTrPFactoryP( g,r ) );
     176      res= convFactoryPSingTrP( resultant( F, G, X ),r );
     177      if ((nf!=NULL)&&(!n_IsOne(nf,r->cf))&&(!n_IsZero(nf,r->cf)))
     178      {
     179        number n=n_Invers(nf,r->cf);
     180        while(eg>0)
     181        {
     182          res=p_Mult_nn(res,n,r);
     183          eg--;
     184        }
     185        n_Delete(&n,r->cf);
     186      }
     187      n_Delete(&nf,r->cf);
     188      if ((ng!=NULL)&&(!n_IsOne(ng,r->cf))&&(!n_IsZero(ng,r->cf)))
     189      {
     190        number n=n_Invers(ng,r->cf);
     191        while(ef>0)
     192        {
     193          res=p_Mult_nn(res,n,r);
     194          ef--;
     195        }
     196        n_Delete(&n,r->cf);
     197      }
     198      n_Delete(&ng,r->cf);
     199    }
     200    Off(SW_RATIONAL);
     201    goto resultant_returns_res;
     202  }
     203  else
     204    WerrorS( feNotImplemented );
    119205resultant_returns_res:
    120206  p_Delete(&f,r);
     
    190276  res=NULL;pa=NULL;pb=NULL;
    191277  On(SW_SYMMETRIC_FF);
    192   CanonicalForm F( convSingPFactoryP( f, r ) ), G( convSingPFactoryP( g, r ) );
    193   CanonicalForm FpG=F+G;
    194   if (!(FpG.isUnivariate()|| FpG.inCoeffDomain()))
    195   //if (!F.isUnivariate() || !G.isUnivariate() || F.mvar()!=G.mvar())
    196   {
     278  if ( rField_is_Q(r) || rField_is_Zp(r) )
     279  {
     280    setCharacteristic( rChar(r) );
     281    CanonicalForm F( convSingPFactoryP( f,r ) ), G( convSingPFactoryP( g,r) );
     282    CanonicalForm FpG=F+G;
     283    if (!(FpG.isUnivariate()|| FpG.inCoeffDomain()))
     284    //if (!F.isUnivariate() || !G.isUnivariate() || F.mvar()!=G.mvar())
     285    {
     286      Off(SW_RATIONAL);
     287      WerrorS("not univariate");
     288      return TRUE;
     289    }
     290    CanonicalForm Fa,Gb;
     291    On(SW_RATIONAL);
     292    res=convFactoryPSingP( extgcd( F, G, Fa, Gb ),r );
     293    pa=convFactoryPSingP(Fa,r);
     294    pb=convFactoryPSingP(Gb,r);
    197295    Off(SW_RATIONAL);
    198     WerrorS("not univariate");
     296  }
     297  // and over Q(a) / Fp(a)
     298  else if ( rField_is_Extension(r))
     299  {
     300    if (rField_is_Q_a(r)) setCharacteristic( 0 );
     301    else                 setCharacteristic( rChar(r) );
     302    CanonicalForm Fa,Gb;
     303    if (r->cf->extRing->minideal!=NULL)
     304    {
     305      CanonicalForm mipo=convSingPFactoryP(r->cf->extRing->minideal->m[0],
     306                                           r->cf->extRing);
     307      Variable a=rootOf(mipo);
     308      CanonicalForm F( convSingAPFactoryAP( f,a,r ) ),
     309                    G( convSingAPFactoryAP( g,a,r ) );
     310      CanonicalForm FpG=F+G;
     311      if (!(FpG.isUnivariate()|| FpG.inCoeffDomain()))
     312      //if (!F.isUnivariate() || !G.isUnivariate() || F.mvar()!=G.mvar())
     313      {
     314        WerrorS("not univariate");
     315        return TRUE;
     316      }
     317      res= convFactoryAPSingAP( extgcd( F, G, Fa, Gb ),r );
     318      pa=convFactoryAPSingAP(Fa,r);
     319      pb=convFactoryAPSingAP(Gb,r);
     320    }
     321    else
     322    {
     323      CanonicalForm F( convSingTrPFactoryP( f, r ) ), G( convSingTrPFactoryP( g, r ) );
     324      CanonicalForm FpG=F+G;
     325      if (!(FpG.isUnivariate()|| FpG.inCoeffDomain()))
     326      //if (!F.isUnivariate() || !G.isUnivariate() || F.mvar()!=G.mvar())
     327      {
     328        Off(SW_RATIONAL);
     329        WerrorS("not univariate");
     330        return TRUE;
     331      }
     332      res= convFactoryPSingTrP( extgcd( F, G, Fa, Gb ), r );
     333      pa=convFactoryPSingTrP(Fa, r);
     334      pb=convFactoryPSingTrP(Gb, r);
     335    }
     336    Off(SW_RATIONAL);
     337  }
     338  else
     339  {
     340    WerrorS( feNotImplemented );
    199341    return TRUE;
    200342  }
    201   CanonicalForm Fa,Gb;
    202   On(SW_RATIONAL);
    203   res=convFactoryPSingP( extgcd( F, G, Fa, Gb ), r );
    204   pa=convFactoryPSingP(Fa, r);
    205   pb=convFactoryPSingP(Gb, r);
    206   Off(SW_RATIONAL);
    207343#ifndef NDEBUG
    208344  // checking the result of extgcd:
     
    212348  {
    213349    PrintS("extgcd( ");p_Write(f,r);p_Write0(g,r);PrintS(" )\n");
    214     PrintS("gcd, co-factors:");p_Write(res,r); p_Write(pa,r);p_Write(pb,r);
     350    PrintS("extgcd( ");p_Write(f,r);p_Write0(g,r);PrintS(" )\n");
    215351    p_Delete(&dummy,r);
    216352  }
     
    223359  poly res=NULL;
    224360  On(SW_RATIONAL);
    225   CanonicalForm F( convSingPFactoryP( f,r ) ), G( convSingPFactoryP( g,r ) );
    226   res = convFactoryPSingP( F / G,r );
     361  if (rField_is_Zp(r) || rField_is_Q(r))
     362  {
     363    setCharacteristic( rChar(r) );
     364    CanonicalForm F( convSingPFactoryP( f,r ) ), G( convSingPFactoryP( g,r ) );
     365    res = convFactoryPSingP( F / G,r );
     366  }
     367  else if (rField_is_Extension(r))
     368  {
     369    if (rField_is_Q_a(r)) setCharacteristic( 0 );
     370    else               setCharacteristic( rChar(r) );
     371    if (r->cf->extRing->minideal!=NULL)
     372    {
     373      CanonicalForm mipo=convSingPFactoryP(r->cf->extRing->minideal->m[0],
     374                                                 r->cf->extRing);
     375      Variable a=rootOf(mipo);
     376      CanonicalForm F( convSingAPFactoryAP( f,a,r ) ),
     377                    G( convSingAPFactoryAP( g,a,r ) );
     378      res= convFactoryAPSingAP(  F / G, r  );
     379    }
     380    else
     381    {
     382      CanonicalForm F( convSingTrPFactoryP( f,r ) ), G( convSingTrPFactoryP( g,r ) );
     383      res= convFactoryPSingTrP(  F / G,r  );
     384    }
     385  }
     386  #if 0 // not yet working
     387  else if (rField_is_GF())
     388  {
     389    //Print("GF(%d^%d)\n",nfCharP,nfMinPoly[0]);
     390    setCharacteristic( nfCharP,nfMinPoly[0], currRing->parameter[0][0] );
     391    CanonicalForm F( convSingGFFactoryGF( f ) ), G( convSingGFFactoryGF( g ) );
     392    res = convFactoryGFSingGF( F / G );
     393  }
     394  #endif
     395  else
     396    WerrorS( feNotImplemented );
    227397  Off(SW_RATIONAL);
    228398  return res;
     
    342512  {
    343513#ifdef FACTORIZE2_DEBUG
    344     printf("start count_Factors(%d), Fdeg=%d, factor deg=%d\n",j,pTotaldegree(f),pTotaldegree(fac));
     514    printf("start count_Factors(%d), Fdeg=%d, factor deg=%d\n",j,p_Totaldegree(f,r),p_Totaldegree(fac,r));
    345515    p_wrp(fac,r);PrintLn();
    346516#endif
     
    348518    CanonicalForm F, FAC,Q,R;
    349519    Variable a;
    350     F=convSingPFactoryP( f,r );
    351     FAC=convSingPFactoryP( fac,r );
     520    if (rField_is_Zp(r) || rField_is_Q(r))
     521    {
     522      F=convSingPFactoryP( f,r );
     523      FAC=convSingPFactoryP( fac,r );
     524    }
     525    else if (rField_is_Extension(r))
     526    {
     527      if (r->cf->extRing->minideal!=NULL)
     528      {
     529        CanonicalForm mipo=convSingPFactoryP(r->cf->extRing->minideal->m[0],
     530                                    r->cf->extRing);
     531        a=rootOf(mipo);
     532        F=convSingAPFactoryAP( f,a,r );
     533        FAC=convSingAPFactoryAP( fac,a,r );
     534      }
     535      else
     536      {
     537        F=convSingTrPFactoryP( f,r );
     538        FAC=convSingTrPFactoryP( fac,r );
     539      }
     540    }
     541    else
     542      WerrorS( feNotImplemented );
    352543
    353544    poly q;
     
    361552      if (R.isZero())
    362553      {
    363         q = convFactoryPSingP( Q,r );
     554        if (rField_is_Zp(r) || rField_is_Q(r))
     555        {
     556          q = convFactoryPSingP( Q,r );
     557        }
     558        else if (rField_is_Extension(r))
     559        {
     560          if (r->cf->extRing->minideal!=NULL)
     561          {
     562            q= convFactoryAPSingAP( Q,r );
     563          }
     564          else
     565          {
     566            q= convFactoryPSingTrP( Q,r );
     567          }
     568        }
    364569        e++; p_Delete(&f,r); f=q; q=NULL; F=Q;
    365570      }
     
    394599  p_Test(f,r);
    395600#ifdef FACTORIZE2_DEBUG
    396   printf("singclap_factorize, degree %ld\n",pTotaldegree(f));
     601  printf("singclap_factorize, degree %ld\n",p_Totaldegree(f,r));
    397602#endif
    398603  // with_exps: 3,1 return only true factors, no exponents
     
    461666    return res;
    462667  }
    463   //PrintS("S:");pWrite(f);PrintLn();
     668  //PrintS("S:");p_Write(f,r);PrintLn();
    464669  // use factory/libfac in general ==============================
    465670  Off(SW_RATIONAL);
     
    482687        N=n_Copy(n0,r->cf);
    483688      p_Cleardenom(f, r);
     689      //after here f should not have a denominator!!
     690      //PrintS("S:");p_Write(f,r);PrintLn();
    484691      NN=n_Div(n0,pGetCoeff(f),r->cf);
    485692      n_Delete(&n0,r->cf);
     
    519726  else if (rField_is_Extension(r))
    520727  {
     728    if (rField_is_Q_a (r)) setCharacteristic (0);
     729    else                   setCharacteristic( rChar(r) );
    521730    if (r->cf->extRing->minideal!=NULL)
    522731    {
     
    524733                                           r->cf->extRing);
    525734      Variable a=rootOf(mipo);
    526       CanonicalForm F( convSingPFactoryP( f,r ) );
     735      CanonicalForm F( convSingAPFactoryAP( f, a, r ) );
    527736      if (rField_is_Zp_a(r))
    528737      {
     
    537746    else
    538747    {
    539       CanonicalForm F( convSingPFactoryP( f,r ) );
     748      CanonicalForm F( convSingTrPFactoryP( f,r ) );
    540749      L = factorize( F );
    541750    }
     
    583792        if (r->cf->extRing->minideal==NULL)
    584793        {
    585           if(!count_Factors(res,w,j,ff,convFactoryPSingP( J.getItem().factor(),r ),r))
     794          if(!count_Factors(res,w,j,ff,convFactoryPSingTrP( J.getItem().factor(),r ),r))
    586795          {
    587796            if (w!=NULL)
     
    592801        else
    593802        {
    594           if (!count_Factors(res,w,j,ff,convFactoryPSingP( J.getItem().factor(),r ),r))
     803          if (!count_Factors(res,w,j,ff,convFactoryAPSingAP( J.getItem().factor(),r ),r))
    595804          {
    596805            if (w!=NULL)
     
    12291438#endif
    12301439
    1231 /*
    1232 napoly singclap_alglcm ( napoly f, napoly g )
    1233 {
    1234 
    1235  // over Q(a) / Fp(a)
    1236  if (nGetChar()==1) setCharacteristic( 0 );
    1237  else               setCharacteristic( -nGetChar() );
    1238  napoly res;
    1239 
    1240  if (currRing->minpoly!=NULL)
    1241  {
    1242    CanonicalForm mipo=convSingPFactoryP(((lnumber)currRing->minpoly)->z,
    1243                                          currRing->extRing);
    1244    Variable a=rootOf(mipo);
    1245    CanonicalForm F( convSingAFactoryA( f,a, currRing ) ),
    1246                  G( convSingAFactoryA( g,a, currRing ) );
    1247    CanonicalForm GCD;
    1248 
    1249    // calculate gcd
    1250    GCD = gcd( F, G );
    1251 
    1252    // calculate lcm
    1253    res= convFactoryASingA( (F/GCD)*G,currRing );
    1254  }
    1255  else
    1256  {
    1257    CanonicalForm F( convSingPFactoryP( f,currRing->extRing ) ),
    1258                  G( convSingPFactoryP( g,currRing->extRing ) );
    1259    CanonicalForm GCD;
    1260    // calculate gcd
    1261    GCD = gcd( F, G );
    1262 
    1263    // calculate lcm
    1264    res= convFactoryPSingP( (F/GCD)*G, currRing->extRing );
    1265  }
    1266 
    1267  Off(SW_RATIONAL);
    1268  return res;
    1269 }
    1270 
    1271 void singclap_algdividecontent ( napoly f, napoly g, napoly &ff, napoly &gg )
    1272 {
    1273  // over Q(a) / Fp(a)
    1274  if (nGetChar()==1) setCharacteristic( 0 );
    1275  else               setCharacteristic( -nGetChar() );
    1276  ff=gg=NULL;
    1277  On(SW_RATIONAL);
    1278 
    1279  if (currRing->minpoly!=NULL)
    1280  {
    1281    CanonicalForm mipo=convSingPFactoryP(((lnumber)currRing->minpoly)->z,
    1282                          currRing->extRing);
    1283    Variable a=rootOf(mipo);
    1284    CanonicalForm F( convSingAFactoryA( f,a, currRing ) ),
    1285                  G( convSingAFactoryA( g,a, currRing ) );
    1286    CanonicalForm GCD;
    1287 
    1288    GCD=gcd( F, G );
    1289 
    1290    if ((GCD!=1) && (GCD!=0))
    1291    {
    1292      ff= convFactoryASingA( F/ GCD, currRing );
    1293      gg= convFactoryASingA( G/ GCD, currRing );
    1294    }
    1295  }
    1296  else
    1297  {
    1298    CanonicalForm F( convSingPFactoryP( f,currRing->extRing ) ),
    1299                  G( convSingPFactoryP( g,currRing->extRing ) );
    1300    CanonicalForm GCD;
    1301 
    1302    GCD=gcd( F, G );
    1303 
    1304    if ((GCD!=1) && (GCD!=0))
    1305    {
    1306      ff= convFactoryPSingP( F/ GCD, currRing->extRing );
    1307      gg= convFactoryPSingP( G/ GCD, currRing->extRing );
    1308    }
    1309  }
    1310 
    1311  Off(SW_RATIONAL);
    1312 }
    1313 */
    1314 
    1315 #if 0
    1316 lists singclap_chineseRemainder(lists x, lists q)
    1317 {
    1318   //assume(x->nr == q->nr);
    1319   //assume(x->nr >= 0);
    1320   int n=x->nr+1;
    1321   if ((x->nr<0) || (x->nr!=q->nr))
    1322   {
    1323     WerrorS("list are empty or not of equal length");
    1324     return NULL;
    1325   }
    1326   lists res=(lists)omAlloc0Bin(slists_bin);
    1327   CFArray X(1,n), Q(1,n);
    1328   int i;
    1329   for(i=0; i<n; i++)
    1330   {
    1331     if (x->m[i-1].Typ()==INT_CMD)
    1332     {
    1333       X[i]=(int)x->m[i-1].Data();
    1334     }
    1335     else if (x->m[i-1].Typ()==NUMBER_CMD)
    1336     {
    1337       number N=(number)x->m[i-1].Data();
    1338       X[i]=convSingNFactoryN(N);
    1339     }
    1340     else
    1341     {
    1342       WerrorS("illegal type in chineseRemainder");
    1343       omFreeBin(res,slists_bin);
    1344       return NULL;
    1345     }
    1346     if (q->m[i-1].Typ()==INT_CMD)
    1347     {
    1348       Q[i]=(int)q->m[i-1].Data();
    1349     }
    1350     else if (q->m[i-1].Typ()==NUMBER_CMD)
    1351     {
    1352       number N=(number)x->m[i-1].Data();
    1353       Q[i]=convSingNFactoryN(N);
    1354     }
    1355     else
    1356     {
    1357       WerrorS("illegal type in chineseRemainder");
    1358       omFreeBin(res,slists_bin);
    1359       return NULL;
    1360     }
    1361   }
    1362   CanonicalForm r, prod;
    1363   chineseRemainder( X, Q, r, prod );
    1364   res->Init(2);
    1365   res->m[0].rtyp=NUMBER_CMD;
    1366   res->m[1].rtyp=NUMBER_CMD;
    1367   res->m[0].data=(char *)convFactoryNSingN( r );
    1368   res->m[1].data=(char *)convFactoryNSingN( prod );
    1369   return res;
    1370 }
    1371 #endif
    1372 
    1373 number   nChineseRemainder(number *x, number *q,int rl, const coeffs r)
    1374 // elemenst in the array are x[0..(rl-1)], q[0..(rl-1)]
    1375 {
    1376 #ifdef HAVE_FACTORY
    1377   if (r->type!=n_Q)
    1378   { Werror("nChineseRemainder only for integers"); return NULL; }
    1379   setCharacteristic( 0 ); // only in char 0
    1380   CFArray X(rl), Q(rl);
    1381   int i;
    1382   for(i=rl-1;i>=0;i--)
    1383   {
    1384     X[i]=r->convSingNFactoryN(x[i],FALSE,r); // may be larger MAX_INT
    1385     Q[i]=r->convSingNFactoryN(q[i],FALSE,r); // may be larger MAX_INT
    1386   }
    1387   CanonicalForm xnew,qnew;
    1388   chineseRemainder(X,Q,xnew,qnew);
    1389   number n=r->convFactoryNSingN(xnew,r);
    1390   number p=r->convFactoryNSingN(qnew,r);
    1391   number p2=n_IntDiv(p,n_Init(2, r),r);
    1392   if (n_Greater(n,p2,r))
    1393   {
    1394      number n2=n_Sub(n,p,r);
    1395      n_Delete(&n,r);
    1396      n=n2;
    1397   }
    1398   n_Delete(&p,r);
    1399   n_Delete(&p2,r);
    1400   return n;
    1401 #else
    1402   WerrorS("not implemented");
    1403   return n_Init(0,r);
    1404 #endif
    1405 }
Note: See TracChangeset for help on using the changeset viewer.