Changeset 868240 in git
- Timestamp:
- May 9, 2014, 12:18:41 PM (10 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 3ff2cf655541d92602d3a2216f5b7a47c5523571
- Parents:
- ec04e88299a064f7c80c463bcdcf43e9db165e5b
- git-author:
- Martin Lee <martinlee84@web.de>2014-05-09 12:18:41+02:00
- git-committer:
- Martin Lee <martinlee84@web.de>2014-05-12 14:35:03+02:00
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/facAlgFunc.cc
rec04e8 r868240 211 211 // alpha is defined by the minimal polynomial Palpha 212 212 // K has more than S elements (S is defined in thesis; look getDegOfExt) 213 static void214 sqrf_norm_sub (const CanonicalForm & f, const CanonicalForm & PPalpha,215 CFGenerator & myrandom, CanonicalForm & s, CanonicalForm & g,216 CanonicalForm & R)213 static CFFList 214 sqrf_norm_sub (const CanonicalForm & f, const CanonicalForm & PPalpha, 215 CFGenerator & myrandom, CanonicalForm & s, CanonicalForm & g, 216 CanonicalForm & R) 217 217 { 218 Variable y= PPalpha.mvar(),vf=f.mvar();219 CanonicalForm temp, Palpha= PPalpha, t;220 int sqfreetest= 0;218 Variable y= PPalpha.mvar(),vf= f.mvar(); 219 CanonicalForm temp, Palpha= PPalpha, t; 220 int sqfreetest= 0; 221 221 CFFList testlist; 222 222 CFFListIterator i; 223 223 224 myrandom.reset(); s=myrandom.item(); g=f; 224 myrandom.reset(); 225 s= myrandom.item(); 226 g= f; 225 227 R= CanonicalForm(0); 226 228 227 229 // Norm, resultante taken with respect to y 228 while ( !sqfreetest ) 229 { 230 R = resultante(Palpha, g, y); R= R* bCommonDen(R); 230 while (!sqfreetest) 231 { 232 R= resultante(Palpha, g, y); 233 R= R* bCommonDen(R); 231 234 R /= content (R); 232 235 // sqfree check ; R is a polynomial in K[x] 233 if ( getCharacteristic() == 0)234 { 235 temp= gcd (R, R.deriv(vf));236 if (getCharacteristic() == 0) 237 { 238 temp= gcd (R, R.deriv(vf)); 236 239 if (degree(temp,vf) != 0 || temp == temp.genZero() ) 237 240 sqfreetest= 0; … … 242 245 { 243 246 Variable X; 244 if (hasFirstAlgVar(R,X)) 245 testlist=factorize( R, X ); 246 else 247 testlist= factorize(R); 247 testlist= sqrFree (R); 248 248 249 249 if (testlist.getFirst().factor().inCoeffDomain()) 250 250 testlist.removeFirst(); 251 sqfreetest= 1;252 for ( i=testlist; i.hasItem(); i++)253 { 254 if ( i.getItem().exp() > 1 && degree(i.getItem().factor(), R.mvar()) > 0)251 sqfreetest= 1; 252 for (i= testlist; i.hasItem(); i++) 253 { 254 if (i.getItem().exp() > 1 && degree (i.getItem().factor(), R.mvar()) > 0) 255 255 { 256 sqfreetest= 0;256 sqfreetest= 0; 257 257 break; 258 258 } 259 259 } 260 260 } 261 if ( ! sqfreetest)261 if (!sqfreetest) 262 262 { 263 263 myrandom.next(); 264 if ( getCharacteristic() == 0)265 t= CanonicalForm (mapinto(myrandom.item()));264 if (getCharacteristic() == 0) 265 t= CanonicalForm (mapinto (myrandom.item())); 266 266 else 267 t= CanonicalForm (myrandom.item());267 t= CanonicalForm (myrandom.item()); 268 268 s= t; 269 g= f(f.mvar()-t*Palpha.mvar(), f.mvar()); 270 } 271 } 269 g= f (f.mvar() - t*Palpha.mvar(), f.mvar()); 270 } 271 } 272 return testlist; 272 273 } 273 static void 274 sqrf_agnorm_sub( const CanonicalForm & f, const CanonicalForm & PPalpha, 275 AlgExtGenerator & myrandom, CanonicalForm & s, CanonicalForm & g, 276 CanonicalForm & R) 277 { 278 Variable y=PPalpha.mvar(),vf=f.mvar(); 279 CanonicalForm temp, Palpha=PPalpha, t; 280 int sqfreetest=0; 281 CFFList testlist; 282 CFFListIterator i; 283 284 myrandom.reset(); s=myrandom.item(); g=f; 285 R= CanonicalForm(0); 286 287 // Norm, resultante taken with respect to y 288 while ( !sqfreetest ) 289 { 290 R = resultante(Palpha, g, y); R= R* bCommonDen(R); 291 R /= content (R); 292 // sqfree check ; R is a polynomial in K[x] 293 if ( getCharacteristic() == 0 ) 294 { 295 temp= gcd(R, R.deriv(vf)); 296 if (degree(temp,vf) != 0 || temp == temp.genZero() ) 297 sqfreetest= 0; 298 else 299 sqfreetest= 1; 300 } 301 else 302 { 303 Variable X; 304 if (hasFirstAlgVar(R,X)) 305 testlist= factorize( R, X ); 306 else 307 testlist= factorize(R); 308 if (testlist.getFirst().factor().inCoeffDomain()) 309 testlist.removeFirst(); 310 sqfreetest=1; 311 for ( i=testlist; i.hasItem(); i++) 312 { 313 if ( i.getItem().exp() > 1 && degree(i.getItem().factor(), R.mvar()) > 0) 314 { 315 sqfreetest=0; 316 break; 317 } 318 } 319 } 320 if ( ! sqfreetest ) 321 { 322 myrandom.next(); 323 if ( getCharacteristic() == 0 ) 324 t= CanonicalForm(mapinto(myrandom.item())); 325 else 326 t= CanonicalForm(myrandom.item()); 327 s= t; 328 g= f(f.mvar()-t*Palpha.mvar(), f.mvar()); 329 } 330 } 331 } 332 333 static void 274 275 static CFFList 334 276 sqrf_norm( const CanonicalForm & f, const CanonicalForm & PPalpha, 335 277 const Variable & Extension, CanonicalForm & s, CanonicalForm & g, 336 278 CanonicalForm & R) 337 279 { 280 CFFList result; 338 281 if ( getCharacteristic() == 0 ) 339 282 { 340 283 IntGenerator myrandom; 341 sqrf_norm_sub(f,PPalpha, myrandom, s,g,R);342 } 343 else if ( degree (Extension) > 0 ) // working over Extensions344 { 345 AlgExtGenerator myrandom (Extension);346 sqrf_agnorm_sub(f,PPalpha, myrandom, s,g,R);284 result= sqrf_norm_sub (f, PPalpha, myrandom, s, g, R); 285 } 286 else if ( degree (Extension) > 0 ) // working over Extensions 287 { 288 AlgExtGenerator myrandom (Extension); 289 result= sqrf_norm_sub (f, PPalpha, myrandom, s, g, R); 347 290 } 348 291 else 349 292 { 350 293 FFGenerator myrandom; 351 sqrf_norm_sub(f,PPalpha, myrandom, s,g,R); 352 } 294 result= sqrf_norm_sub (f, PPalpha, myrandom, s, g, R); 295 } 296 return result; 353 297 } 354 298 … … 387 331 On (SW_RATIONAL); 388 332 oldR= R; 389 sqrf_norm (i.getItem(), R, Extension, s, g, R); 333 //TODO normalize i.getItem over K(R)? 334 (void) sqrf_norm (i.getItem(), R, Extension, s, g, R); 390 335 391 336 backSubst.insert (s); … … 474 419 { 475 420 bool isRat= isOn (SW_RATIONAL); 476 CFFList L, Factorlist; 421 CFFList L, sqrfFactors, Factorlist, tmp; 422 CFFListIterator iter, iter2; 477 423 CanonicalForm R, Rstar, s, g, h, f= F; 478 424 CFList substlist, backSubsts; … … 492 438 Factorlist= factorize (g, alpha); 493 439 494 for ( CFFListIterator i= Factorlist; i.hasItem(); i++)495 { 496 h= i .getItem().factor();440 for (iter= Factorlist; iter.hasItem(); iter++) 441 { 442 h= iter.getItem().factor(); 497 443 if (!h.inCoeffDomain()) 498 444 { … … 501 447 h= backSubst (h, backSubsts, Astar); 502 448 h= Prem (h, as); 503 L.append (CFFactor (h, i .getItem().exp()));449 L.append (CFFactor (h, iter.getItem().exp())); 504 450 } 505 451 } … … 533 479 } 534 480 535 sqrf_norm (f, Rstar, vminpoly, s, g, R); 536 537 Variable X; 538 if (hasFirstAlgVar (R, X)) 539 { 540 // factorize R over alg.extension with X 541 Factorlist= factorize (R, X); 481 sqrfFactors= sqrf_norm (f, Rstar, vminpoly, s, g, R); 482 483 if (getCharacteristic() > 0) 484 { 485 if (sqrfFactors.getFirst().factor().inCoeffDomain()) 486 sqrfFactors.removeFirst(); 487 488 Variable X; 489 for (iter= sqrfFactors; iter.hasItem(); iter++) 490 { 491 if (hasFirstAlgVar (iter.getItem().factor(), X)) 492 { 493 // factorize over alg.extension with X 494 tmp= factorize (iter.getItem().factor(), X); 495 } 496 else 497 { 498 // factorize over k 499 tmp= factorize (iter.getItem().factor(), true); 500 } 501 if (tmp.getFirst().factor().inCoeffDomain()) 502 tmp.removeFirst(); 503 for (iter2= tmp; iter2.hasItem(); iter2++) 504 Factorlist= append (Factorlist, iter2.getItem()); 505 } 542 506 } 543 507 else 544 { 545 // factor R over k 546 Factorlist = factorize (R); 547 } 508 Factorlist= factorize (R, true); 548 509 549 510 if (!Factorlist.getFirst().factor().inCoeffDomain()) 550 511 Factorlist.insert (CFFactor (1, 1)); 551 if (Factorlist.length() == 2 && Factorlist.getLast().exp() == 1)512 if (Factorlist.length() == 2 && Factorlist.getLast().exp() == 1) 552 513 { 553 514 f= backSubst (f, backSubsts, Astar); … … 561 522 { 562 523 g= f; 563 for ( CFFListIterator i=Factorlist; i.hasItem(); i++)564 { 565 CanonicalForm fnew= i.getItem().factor();524 for (iter= Factorlist; iter.hasItem(); iter++) 525 { 526 CanonicalForm fnew= iter.getItem().factor(); 566 527 if (fnew.level() < Rstar.level()) //factor is a constant from the function field 567 528 continue; 568 529 else 569 530 { 570 fnew= fnew (g.mvar() +s*Rstar.mvar(), g.mvar());531 fnew= fnew (g.mvar() + s*Rstar.mvar(), g.mvar()); 571 532 fnew= reduce (fnew, Rstar); 572 533 } 573 534 574 535 h= alg_gcd (g, fnew, Rstarlist); 575 numinv= QuasiInverse (Rstar, alg_LC(h, algExtLevel), Rstar.mvar());536 numinv= QuasiInverse (Rstar, alg_LC (h, algExtLevel), Rstar.mvar()); 576 537 h *= numinv; 577 538 h= Prem (h, Rstarlist); … … 710 671 if (recurse) 711 672 { 712 ii= as;673 ii= as; 713 674 for (; ii.hasItem(); ii++) 714 675 { … … 821 782 822 783 asnew.removeLast(); 823 for ( CFListIteratori= asnew; i.hasItem(); i++)784 for (i= asnew; i.hasItem(); i++) 824 785 i.getItem() /= content (i.getItem()); 825 786 … … 854 815 CFList transform; 855 816 856 for ( CFFListIterator k= tmp; k.hasItem(); k++)817 for (iter= tmp; iter.hasItem(); iter++) 857 818 { 858 819 transform= transBack; 859 CanonicalForm factor= k.getItem().factor();820 CanonicalForm factor= iter.getItem().factor(); 860 821 factor= M (factor); 861 822 transform.append (factor); … … 874 835 if (expF > 0) 875 836 { 876 int mult= tmpExp/(degree (factor)/degree ( k.getItem().factor()));877 result.append (CFFactor (factor, k.getItem().exp()*mult));837 int mult= tmpExp/(degree (factor)/degree (iter.getItem().factor())); 838 result.append (CFFactor (factor, iter.getItem().exp()*mult)); 878 839 } 879 840 else 880 result.append (CFFactor (factor, k.getItem().exp()));841 result.append (CFFactor (factor, iter.getItem().exp())); 881 842 } 882 843
Note: See TracChangeset
for help on using the changeset viewer.