Changeset ce2576 in git
- Timestamp:
- Nov 10, 2011, 5:59:46 PM (12 years ago)
- 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
- Location:
- libpolys/polys
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
libpolys/polys/clapconv.cc
r6051d87 rce2576 17 17 #include <omalloc/omalloc.h> 18 18 #include <coeffs/coeffs.h> 19 #include <coeffs/longrat.h> 20 #include <coeffs/modulop.h> 19 21 #include <polys/monomials/p_polys.h> 20 22 #include <polys/sbuckets.h> 21 23 #include <polys/clapconv.h> 22 24 23 //typedef __mpz_struct lint; 25 #include "simpleideals.h" 26 27 #define TRANSEXT_PRIVATES 28 #include <polys/ext_fields/transext.h> 29 30 typedef __mpz_struct lint; 24 31 25 32 void out_cf(char *s1,const CanonicalForm &f,char *s2); 26 33 27 34 static void conv_RecPP ( const CanonicalForm & f, int * exp, sBucket_pt result, ring r ); 35 36 static void convRecTrP ( const CanonicalForm & f, int * exp, poly & result, int offs, const ring r ); 37 38 static void convRecGFGF ( const CanonicalForm & f, int * exp, poly & result ); 28 39 29 40 static number convFactoryNSingAN( const CanonicalForm &f, const ring r); … … 60 71 poly term = p_Init(r); 61 72 pNext( term ) = NULL; 62 int varoffset=r->cf->factoryVarOffset;63 73 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); 65 75 pGetCoeff( term )=r->cf->convFactoryNSingN(f, r->cf); 66 76 p_Setm( term, r ); … … 89 99 if (errorreported) break; 90 100 setChar=FALSE; 91 int varoffset=r->cf->factoryVarOffset;92 101 for ( int i = n; i >0; i-- ) 93 102 { 94 103 if ( (e = p_GetExp( p, i, r)) != 0 ) 95 term *= power( Variable( i +varoffset), e );104 term *= power( Variable( i ), e ); 96 105 } 97 106 result += term; … … 101 110 } 102 111 103 CanonicalForm convSingAFactoryA( number pp, Variable a, const coeffs cf ) 112 int convFactoryISingI( const CanonicalForm & f) 113 { 114 if (!f.isImm()) WerrorS("int overflow in det"); 115 return f.intval(); 116 } 117 118 CanonicalForm 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 139 static void 140 convRecAP_R ( const CanonicalForm & f, int * exp, poly & result, int par_start, int var_start, const ring r) ; 141 142 poly 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 152 poly convFactoryAPSingAP ( const CanonicalForm & f, const ring r ) 153 { 154 return convFactoryAPSingAP_R(f,0,rPar(r),r); 155 } 156 157 static 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 202 CanonicalForm convSingAFactoryA ( poly p , const Variable & a, const ring r ) 104 203 { 105 204 CanonicalForm result = 0; 106 205 int e; 107 poly p=(poly)pp;108 BOOLEAN setChar=TRUE;109 206 110 207 while ( p!=NULL ) 111 208 { 112 209 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 ); 118 239 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 245 static 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 273 poly convFactoryASingA ( const CanonicalForm & f, const ring r ) 125 274 { 126 275 poly a=NULL; … … 128 277 for( CFIterator i=f; i.hasTerms(); i++) 129 278 { 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); 136 284 } 137 285 else 138 286 { 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 303 CanonicalForm 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 331 poly 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 341 static void 342 convRecTrP ( 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 371 CanonicalForm 372 convSingGFFactoryGF( 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 394 poly 395 convFactoryGFSingGF ( 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 407 static void 408 convRecGFGF ( 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 154 435 #endif 436 #endif -
libpolys/polys/clapconv.h
r6051d87 rce2576 22 22 int convFactoryISingI( const CanonicalForm & f); 23 23 24 CanonicalForm convSingAFactoryA( number pp, Variable a, const coeffs cf ); 25 number convFactoryASingA ( const CanonicalForm & f, const coeffs cf ); 24 CanonicalForm convSingAPFactoryAP ( poly p , const Variable & a, const ring r ); 25 poly convFactoryAPSingAP ( const CanonicalForm & f, const ring r ); 26 poly 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 31 CanonicalForm convSingAFactoryA ( poly p , const Variable & a, const ring r ); 32 poly convFactoryASingA ( const CanonicalForm & f, const ring r ); 33 34 CanonicalForm convSingTrPFactoryP ( poly p, const ring r ); 35 poly convFactoryPSingTrP ( const CanonicalForm & f, const ring r ); 26 36 27 37 // HAVE_FACTORY -
libpolys/polys/clapsing.cc
r6051d87 rce2576 31 31 #include "ext_fields/transext.h" 32 32 33 // TODO(Martin, Please adapt the following code for the use in SW)34 35 33 36 34 #include "clapsing.h" … … 58 56 59 57 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 ); 68 95 Off(SW_RATIONAL); 69 96 return res; … … 111 138 if ((f==NULL) || (g==NULL)) 112 139 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 ); 117 148 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 ); 119 205 resultant_returns_res: 120 206 p_Delete(&f,r); … … 190 276 res=NULL;pa=NULL;pb=NULL; 191 277 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); 197 295 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 ); 199 341 return TRUE; 200 342 } 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);207 343 #ifndef NDEBUG 208 344 // checking the result of extgcd: … … 212 348 { 213 349 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"); 215 351 p_Delete(&dummy,r); 216 352 } … … 223 359 poly res=NULL; 224 360 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 ); 227 397 Off(SW_RATIONAL); 228 398 return res; … … 342 512 { 343 513 #ifdef FACTORIZE2_DEBUG 344 printf("start count_Factors(%d), Fdeg=%d, factor deg=%d\n",j,p Totaldegree(f),pTotaldegree(fac));514 printf("start count_Factors(%d), Fdeg=%d, factor deg=%d\n",j,p_Totaldegree(f,r),p_Totaldegree(fac,r)); 345 515 p_wrp(fac,r);PrintLn(); 346 516 #endif … … 348 518 CanonicalForm F, FAC,Q,R; 349 519 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 ); 352 543 353 544 poly q; … … 361 552 if (R.isZero()) 362 553 { 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 } 364 569 e++; p_Delete(&f,r); f=q; q=NULL; F=Q; 365 570 } … … 394 599 p_Test(f,r); 395 600 #ifdef FACTORIZE2_DEBUG 396 printf("singclap_factorize, degree %ld\n",p Totaldegree(f));601 printf("singclap_factorize, degree %ld\n",p_Totaldegree(f,r)); 397 602 #endif 398 603 // with_exps: 3,1 return only true factors, no exponents … … 461 666 return res; 462 667 } 463 //PrintS("S:");p Write(f);PrintLn();668 //PrintS("S:");p_Write(f,r);PrintLn(); 464 669 // use factory/libfac in general ============================== 465 670 Off(SW_RATIONAL); … … 482 687 N=n_Copy(n0,r->cf); 483 688 p_Cleardenom(f, r); 689 //after here f should not have a denominator!! 690 //PrintS("S:");p_Write(f,r);PrintLn(); 484 691 NN=n_Div(n0,pGetCoeff(f),r->cf); 485 692 n_Delete(&n0,r->cf); … … 519 726 else if (rField_is_Extension(r)) 520 727 { 728 if (rField_is_Q_a (r)) setCharacteristic (0); 729 else setCharacteristic( rChar(r) ); 521 730 if (r->cf->extRing->minideal!=NULL) 522 731 { … … 524 733 r->cf->extRing); 525 734 Variable a=rootOf(mipo); 526 CanonicalForm F( convSing PFactoryP( f,r ) );735 CanonicalForm F( convSingAPFactoryAP( f, a, r ) ); 527 736 if (rField_is_Zp_a(r)) 528 737 { … … 537 746 else 538 747 { 539 CanonicalForm F( convSing PFactoryP( f,r ) );748 CanonicalForm F( convSingTrPFactoryP( f,r ) ); 540 749 L = factorize( F ); 541 750 } … … 583 792 if (r->cf->extRing->minideal==NULL) 584 793 { 585 if(!count_Factors(res,w,j,ff,convFactoryPSing P( J.getItem().factor(),r ),r))794 if(!count_Factors(res,w,j,ff,convFactoryPSingTrP( J.getItem().factor(),r ),r)) 586 795 { 587 796 if (w!=NULL) … … 592 801 else 593 802 { 594 if (!count_Factors(res,w,j,ff,convFactory PSingP( J.getItem().factor(),r ),r))803 if (!count_Factors(res,w,j,ff,convFactoryAPSingAP( J.getItem().factor(),r ),r)) 595 804 { 596 805 if (w!=NULL) … … 1229 1438 #endif 1230 1439 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 gcd1250 GCD = gcd( F, G );1251 1252 // calculate lcm1253 res= convFactoryASingA( (F/GCD)*G,currRing );1254 }1255 else1256 {1257 CanonicalForm F( convSingPFactoryP( f,currRing->extRing ) ),1258 G( convSingPFactoryP( g,currRing->extRing ) );1259 CanonicalForm GCD;1260 // calculate gcd1261 GCD = gcd( F, G );1262 1263 // calculate lcm1264 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 else1297 {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 01316 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 else1341 {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 else1356 {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 #endif1372 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_FACTORY1377 if (r->type!=n_Q)1378 { Werror("nChineseRemainder only for integers"); return NULL; }1379 setCharacteristic( 0 ); // only in char 01380 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_INT1385 Q[i]=r->convSingNFactoryN(q[i],FALSE,r); // may be larger MAX_INT1386 }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 #else1402 WerrorS("not implemented");1403 return n_Init(0,r);1404 #endif1405 }
Note: See TracChangeset
for help on using the changeset viewer.