Changeset afbebe in git
- Timestamp:
- Oct 9, 2012, 11:11:29 AM (10 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
- Children:
- a25f7a7df8cf584f3b2fa702cf106448e9ceced5
- Parents:
- becbea965e6c5de8e8ab195c7f480cabc295ac0c
- git-author:
- Martin Lee <martinlee84@web.de>2012-10-09 11:11:29+02:00
- git-committer:
- Martin Lee <martinlee84@web.de>2012-10-24 12:26:22+02:00
- Location:
- factory
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/facBivar.cc
rbecbea rafbebe 184 184 i++; 185 185 } while (1); 186 }187 188 CFList189 earlyFactorDetection0 (CanonicalForm& F, CFList& factors,int& adaptedLiftBound,190 DegreePattern& degs, bool& success, int deg)191 {192 DegreePattern bufDegs1= degs;193 DegreePattern bufDegs2;194 CFList result;195 CFList T= factors;196 CanonicalForm buf= F;197 CanonicalForm LCBuf= LC (buf, Variable (1));198 CanonicalForm g, quot;199 CanonicalForm M= power (F.mvar(), deg);200 adaptedLiftBound= 0;201 int d= degree (F) + degree (LCBuf, F.mvar());202 for (CFListIterator i= factors; i.hasItem(); i++)203 {204 if (!bufDegs1.find (degree (i.getItem(), 1)))205 continue;206 else207 {208 g= i.getItem() (0, 1);209 g *= LCBuf;210 g= mod (g, M);211 if (fdivides (LC (g), LCBuf))212 {213 g= mulMod2 (i.getItem(), LCBuf, M);214 g /= content (g, Variable (1));215 if (fdivides (g, buf, quot))216 {217 result.append (g);218 buf= quot;219 d -= degree (g) + degree (LC (g, Variable (1)), F.mvar());220 LCBuf= LC (buf, Variable (1));221 T= Difference (T, CFList (i.getItem()));222 223 // compute new possible degree pattern224 bufDegs2= DegreePattern (T);225 bufDegs1.intersect (bufDegs2);226 bufDegs1.refine ();227 if (bufDegs1.getLength() <= 1)228 {229 result.append (buf);230 break;231 }232 }233 }234 }235 }236 adaptedLiftBound= d + 1;237 if (d < deg)238 {239 factors= T;240 degs= bufDegs1;241 F= buf;242 success= true;243 }244 if (bufDegs1.getLength() <= 1)245 degs= bufDegs1;246 return result;247 }248 249 250 CFList251 henselLiftAndEarly0 (CanonicalForm& A, bool& earlySuccess, CFList&252 earlyFactors, DegreePattern& degs, int& liftBound,253 const CFList& uniFactors, const CanonicalForm& eval)254 {255 int sizeOfLiftPre;256 int * liftPre= getLiftPrecisions (A, sizeOfLiftPre, degree (LC (A, 1), 2));257 258 Variable x= Variable (1);259 Variable y= Variable (2);260 CFArray Pi;261 CFList diophant;262 CFList bufUniFactors= uniFactors;263 bufUniFactors.insert (LC (A, x));264 CFMatrix M= CFMatrix (liftBound, bufUniFactors.length() - 1);265 earlySuccess= false;266 int newLiftBound= 0;267 int smallFactorDeg= tmin (11, liftPre [sizeOfLiftPre- 1] + 1);//this is a tunable parameter268 if (smallFactorDeg >= liftBound || degree (A,y) <= 4)269 henselLift12 (A, bufUniFactors, liftBound, Pi, diophant, M);270 else if (sizeOfLiftPre > 1 && sizeOfLiftPre < 30)271 {272 henselLift12 (A, bufUniFactors, smallFactorDeg, Pi, diophant, M);273 earlyFactors= earlyFactorDetection0 (A, bufUniFactors, newLiftBound,274 degs, earlySuccess,275 smallFactorDeg);276 if (degs.getLength() > 1 && !earlySuccess &&277 smallFactorDeg != liftPre [sizeOfLiftPre-1] + 1)278 {279 if (newLiftBound > liftPre[sizeOfLiftPre-1]+1)280 {281 bufUniFactors.insert (LC (A, x));282 henselLiftResume12 (A, bufUniFactors, smallFactorDeg,283 liftPre[sizeOfLiftPre-1] + 1, Pi, diophant, M);284 earlyFactors= earlyFactorDetection0 (A, bufUniFactors, newLiftBound,285 degs, earlySuccess, liftPre[sizeOfLiftPre-1] + 1);286 }287 }288 else if (earlySuccess)289 liftBound= newLiftBound;290 int i= sizeOfLiftPre - 1;291 while (degs.getLength() > 1 && !earlySuccess && i - 1 >= 0)292 {293 if (newLiftBound > liftPre[i] + 1)294 {295 bufUniFactors.insert (LC (A, x));296 henselLiftResume12 (A, bufUniFactors, liftPre[i] + 1,297 liftPre[i-1] + 1, Pi, diophant, M);298 earlyFactors= earlyFactorDetection0 (A, bufUniFactors, newLiftBound,299 degs, earlySuccess, liftPre[i-1] + 1);300 }301 else302 {303 liftBound= newLiftBound;304 break;305 }306 i--;307 }308 if (earlySuccess)309 liftBound= newLiftBound;310 //after here all factors are lifted to liftPre[sizeOfLiftPre-1]311 }312 else313 {314 henselLift12 (A, bufUniFactors, smallFactorDeg, Pi, diophant, M);315 earlyFactors= earlyFactorDetection0 (A, bufUniFactors, newLiftBound,316 degs, earlySuccess,317 smallFactorDeg);318 int i= 1;319 while ((degree (A,y)/4)*i + 4 <= smallFactorDeg)320 i++;321 if (degs.getLength() > 1 && !earlySuccess)322 {323 bufUniFactors.insert (LC (A, x));324 henselLiftResume12 (A, bufUniFactors, smallFactorDeg,325 (degree (A, y)/4)*i + 4, Pi, diophant, M);326 earlyFactors= earlyFactorDetection0 (A, bufUniFactors, newLiftBound,327 degs, earlySuccess, (degree (A, y)/4)*i + 4);328 }329 while (degs.getLength() > 1 && !earlySuccess && i < 4)330 {331 if (newLiftBound > (degree (A, y)/4)*i + 4)332 {333 bufUniFactors.insert (LC (A, x));334 henselLiftResume12 (A, bufUniFactors, (degree (A,y)/4)*i + 4,335 (degree (A, y)/4)*(i+1) + 4, Pi, diophant, M);336 earlyFactors= earlyFactorDetection0 (A, bufUniFactors, newLiftBound,337 degs, earlySuccess, (degree (A, y)/4)*(i+1) + 4);338 }339 else340 {341 liftBound= newLiftBound;342 break;343 }344 i++;345 }346 if (earlySuccess)347 liftBound= newLiftBound;348 }349 350 return bufUniFactors;351 186 } 352 187 -
factory/facFactorize.cc
rbecbea rafbebe 149 149 Aeval [j]= factors; 150 150 } 151 else if (!Aeval[j].isEmpty())152 Aeval[j]=CFList();153 151 } 154 152 } 155 156 int157 testFactors (const CanonicalForm& G, const CFList& uniFactors,158 CanonicalForm& sqrfPartF, CFList& factors,159 CFFList*& bufSqrfFactors, CFList& evalSqrfPartF,160 const CFArray& evalPoint)161 {162 CanonicalForm tmp;163 CFListIterator j;164 for (CFListIterator i= uniFactors; i.hasItem(); i++)165 {166 tmp= i.getItem();167 if (i.hasItem())168 i++;169 else170 break;171 for (j= i; j.hasItem(); j++)172 {173 if (tmp == j.getItem())174 return 0;175 }176 }177 178 CanonicalForm F= G;179 CFFList sqrfFactorization= sqrFree (F);180 181 sqrfPartF= 1;182 for (CFFListIterator i= sqrfFactorization; i.hasItem(); i++)183 sqrfPartF *= i.getItem().factor();184 185 evalSqrfPartF= evaluateAtEval (sqrfPartF, evalPoint);186 187 CanonicalForm test= evalSqrfPartF.getFirst() (evalPoint[0], 2);188 189 if (degree (test) != degree (sqrfPartF, 1) || test.inCoeffDomain())190 return 0;191 192 CFFList sqrfFactors;193 CFList tmp2;194 int k= 0;195 factors= uniFactors;196 CFFListIterator iter;197 for (CFListIterator i= factors; i.hasItem(); i++, k++)198 {199 tmp= 1;200 sqrfFactors= sqrFree (i.getItem());201 202 for (iter= sqrfFactors; iter.hasItem(); iter++)203 {204 tmp2.append (iter.getItem().factor());205 tmp *= iter.getItem().factor();206 }207 i.getItem()= tmp/Lc(tmp);208 bufSqrfFactors [k]= sqrfFactors;209 }210 211 for (int i= 0; i < factors.length() - 1; i++)212 {213 for (int k= i + 1; k < factors.length(); k++)214 {215 gcdFreeBasis (bufSqrfFactors [i], bufSqrfFactors[k]);216 }217 }218 219 factors= CFList();220 for (int i= 0; i < uniFactors.length(); i++)221 {222 if (i == 0)223 {224 for (iter= bufSqrfFactors [i]; iter.hasItem(); iter++)225 {226 if (iter.getItem().factor().inCoeffDomain())227 continue;228 iter.getItem()= CFFactor (iter.getItem().factor()/229 Lc (iter.getItem().factor()),230 iter.getItem().exp());231 factors.append (iter.getItem().factor());232 }233 }234 else235 {236 for (iter= bufSqrfFactors [i]; iter.hasItem(); iter++)237 {238 if (iter.getItem().factor().inCoeffDomain())239 continue;240 iter.getItem()= CFFactor (iter.getItem().factor()/241 Lc (iter.getItem().factor()),242 iter.getItem().exp());243 if (!find (factors, iter.getItem().factor()))244 factors.append (iter.getItem().factor());245 }246 }247 }248 249 test= prod (factors);250 tmp= evalSqrfPartF.getFirst() (evalPoint[0],2);251 if (test/Lc (test) != tmp/Lc (tmp))252 return 0;253 else254 return 1;255 }256 257 CFList258 precomputeLeadingCoeff (const CanonicalForm& LCF, const CFList& LCFFactors,259 const CFList& evaluation,CFList*& differentSecondVarLCs,260 int length, Variable& y261 )262 {263 y= Variable (1);264 if (LCF.inCoeffDomain())265 {266 CFList result;267 for (int i= 1; i <= LCFFactors.length() + 1; i++)268 result.append (1);269 return result;270 }271 272 CFMap N, M;273 CFArray dummy= CFArray (2);274 dummy [0]= LCF;275 dummy [1]= Variable (2);276 compress (dummy, M, N);277 CanonicalForm F= M (LCF);278 if (LCF.isUnivariate())279 {280 CFList result;281 int LCFLevel= LCF.level();282 bool found= false;283 if (LCFLevel == 2)284 {285 //bivariate leading coefficients are already the true leading coefficients286 result= LCFFactors;287 found= true;288 }289 else290 {291 CFListIterator j;292 for (int i= 0; i < length; i++)293 {294 for (j= differentSecondVarLCs[i]; j.hasItem(); j++)295 {296 if (j.getItem().level() == LCFLevel)297 {298 found= true;299 break;300 }301 }302 if (found)303 {304 result= differentSecondVarLCs [i];305 break;306 }307 }308 if (!found)309 result= LCFFactors;310 }311 if (found)312 result.insert (Lc (LCF));313 else314 {315 for (CFListIterator i= result; i.hasItem(); i++)316 i.getItem() *= LCF;317 result.insert (LCF);318 }319 return result;320 }321 322 CFList factors= LCFFactors;323 324 for (CFListIterator i= factors; i.hasItem(); i++)325 i.getItem()= M (i.getItem());326 327 CanonicalForm sqrfPartF;328 CFFList * bufSqrfFactors= new CFFList [factors.length()];329 CFList evalSqrfPartF, bufFactors;330 CFArray evalPoint= CFArray (evaluation.length() - 1);331 CFArray buf= CFArray (evaluation.length());332 CFArray swap= CFArray (evaluation.length());333 CFListIterator iter= evaluation;334 CanonicalForm vars=getVars (LCF)*Variable (2);335 for (int i= evaluation.length() +1; i > 1; i--, iter++)336 {337 buf[i-2]=iter.getItem();338 if (degree (vars, i) > 0)339 swap[M(Variable (i)).level()-1]=buf[i-2];340 }341 buf= swap;342 for (int i= 0; i < evaluation.length() - 1; i++)343 evalPoint[i]= buf[i+1];344 345 //TODO sqrfPartF einmal berechnen nicht stÀndig346 int pass= testFactors (F, factors, sqrfPartF,347 bufFactors, bufSqrfFactors, evalSqrfPartF, evalPoint);348 349 bool foundDifferent= false;350 Variable z;351 Variable x= y;352 int j= 0;353 if (!pass)354 {355 int lev= 0;356 CanonicalForm bufF;357 CFList bufBufFactors;358 for (int i= 0; i < length; i++)359 {360 if (!differentSecondVarLCs [i].isEmpty())361 {362 bool allConstant= true;363 for (iter= differentSecondVarLCs[i]; iter.hasItem(); iter++)364 {365 if (!iter.getItem().inCoeffDomain())366 {367 allConstant= false;368 y= Variable (iter.getItem().level());369 lev= M(y).level();370 }371 }372 if (allConstant)373 continue;374 375 bufFactors= differentSecondVarLCs [i];376 for (iter= bufFactors; iter.hasItem(); iter++)377 iter.getItem()= swapvar (iter.getItem(), x, y);378 bufF= F;379 z= Variable (lev);380 bufF= swapvar (bufF, x, z);381 bufBufFactors= bufFactors;382 evalPoint= CFArray (evaluation.length() - 1);383 for (int k= 0; k < evaluation.length()-1; k++)384 {385 if (N (Variable (k+1)).level() != y.level())386 evalPoint[k]= buf[k+1];387 else388 evalPoint[k]= buf[0];389 }390 pass= testFactors (bufF, bufBufFactors, sqrfPartF, bufFactors,391 bufSqrfFactors, evalSqrfPartF, evalPoint);392 if (pass)393 {394 foundDifferent= true;395 F= bufF;396 CFList l= factors;397 for (iter= l; iter.hasItem(); iter++)398 iter.getItem()= swapvar (iter.getItem(), x, y);399 differentSecondVarLCs [i]= l;400 j= i;401 break;402 }403 if (!pass && i == length - 1)404 {405 CFList result;406 result.append (LCF);407 for (int j= 1; j <= factors.length(); j++)408 result.append (1);409 result= distributeContent (result, differentSecondVarLCs, length);410 if (!result.getFirst().inCoeffDomain())411 {412 CFListIterator iter= result;413 CanonicalForm tmp= iter.getItem();414 iter++;415 for (; iter.hasItem(); iter++)416 iter.getItem() *= tmp;417 }418 419 y= Variable (1);420 delete [] bufSqrfFactors;421 return result;422 }423 }424 }425 }426 if (!pass)427 {428 CFList result;429 result.append (LCF);430 for (int j= 1; j <= factors.length(); j++)431 result.append (LCF);432 y= Variable (1);433 delete [] bufSqrfFactors;434 return result;435 }436 else437 factors= bufFactors;438 439 440 bufFactors= factors;441 442 CFMap MM, NN;443 dummy [0]= sqrfPartF;444 dummy [1]= 1;445 compress (dummy, MM, NN);446 sqrfPartF= MM (sqrfPartF);447 CanonicalForm varsSqrfPartF= getVars (sqrfPartF);448 for (CFListIterator iter= factors; iter.hasItem(); iter++)449 iter.getItem()= MM (iter.getItem());450 451 CFList evaluation2;452 for (int i= 2; i <= varsSqrfPartF.level(); i++)453 evaluation2.insert (evalPoint[NN (Variable (i)).level()-2]);454 455 CFList interMedResult;456 CanonicalForm oldSqrfPartF= sqrfPartF;457 sqrfPartF= shift2Zero (sqrfPartF, evalSqrfPartF, evaluation2);458 if (factors.length() > 1)459 {460 CanonicalForm LC1= LC (oldSqrfPartF, 1);461 CFList leadingCoeffs;462 for (int i= 0; i < factors.length(); i++)463 leadingCoeffs.append (LC1);464 465 CFList LC1eval= evaluateAtEval (LC1, evaluation2,2);466 CFList oldFactors= factors;467 for (CFListIterator i= oldFactors; i.hasItem(); i++)468 i.getItem() *= LC1eval.getFirst()/Lc (i.getItem());469 470 bool success= false;471 CanonicalForm oldSqrfPartFPowLC= oldSqrfPartF*power(LC1,factors.length()-1);472 CFList heuResult;473 if (size (oldSqrfPartFPowLC)/getNumVars (oldSqrfPartFPowLC) < 500 &&474 LucksWangSparseHeuristic (oldSqrfPartFPowLC,475 oldFactors, 2, leadingCoeffs, heuResult))476 {477 interMedResult= recoverFactors (oldSqrfPartF, heuResult);478 if (oldFactors.length() == interMedResult.length())479 success= true;480 }481 if (!success)482 {483 LC1= LC (evalSqrfPartF.getFirst(), 1);484 485 CFArray leadingCoeffs= CFArray (factors.length());486 for (int i= 0; i < factors.length(); i++)487 leadingCoeffs[i]= LC1;488 489 for (CFListIterator i= factors; i.hasItem(); i++)490 i.getItem() *= LC1 (0,2)/Lc (i.getItem());491 factors.insert (1);492 493 CanonicalForm494 newSqrfPartF= evalSqrfPartF.getFirst()*power (LC1, factors.length() - 2);495 496 int liftBound= degree (newSqrfPartF,2) + 1;497 498 CFMatrix M= CFMatrix (liftBound, factors.length() - 1);499 CFArray Pi;500 CFList diophant;501 nonMonicHenselLift12 (newSqrfPartF, factors, liftBound, Pi, diophant, M,502 leadingCoeffs, false);503 504 if (sqrfPartF.level() > 2)505 {506 int* liftBounds= new int [sqrfPartF.level() - 1];507 liftBounds [0]= liftBound;508 bool noOneToOne= false;509 CFList *leadingCoeffs2= new CFList [sqrfPartF.level()-2];510 LC1= LC (evalSqrfPartF.getLast(), 1);511 CFList LCs;512 for (int i= 0; i < factors.length(); i++)513 LCs.append (LC1);514 leadingCoeffs2 [sqrfPartF.level() - 3]= LCs;515 for (int i= sqrfPartF.level() - 1; i > 2; i--)516 {517 for (CFListIterator j= LCs; j.hasItem(); j++)518 j.getItem()= j.getItem() (0, i + 1);519 leadingCoeffs2 [i - 3]= LCs;520 }521 sqrfPartF *= power (LC1, factors.length()-1);522 523 int liftBoundsLength= sqrfPartF.level() - 1;524 for (int i= 1; i < liftBoundsLength; i++)525 liftBounds [i]= degree (sqrfPartF, i + 2) + 1;526 evalSqrfPartF= evaluateAtZero (sqrfPartF);527 evalSqrfPartF.removeFirst();528 factors= nonMonicHenselLift (evalSqrfPartF, factors, leadingCoeffs2,529 diophant, Pi, liftBounds, sqrfPartF.level() - 1, noOneToOne);530 delete [] leadingCoeffs2;531 delete [] liftBounds;532 }533 for (CFListIterator iter= factors; iter.hasItem(); iter++)534 iter.getItem()= reverseShift (iter.getItem(), evaluation2);535 536 interMedResult=537 recoverFactors (reverseShift(evalSqrfPartF.getLast(),evaluation2),538 factors);539 }540 }541 else542 {543 CanonicalForm contF=content (oldSqrfPartF,1);544 factors= CFList (oldSqrfPartF/contF);545 interMedResult= recoverFactors (oldSqrfPartF, factors);546 }547 548 for (CFListIterator iter= interMedResult; iter.hasItem(); iter++)549 iter.getItem()= NN (iter.getItem());550 551 CFList result;552 CFFListIterator k;553 CanonicalForm tmp;554 for (int i= 0; i < LCFFactors.length(); i++)555 {556 tmp= 1;557 for (k= bufSqrfFactors[i]; k.hasItem(); k++)558 {559 int pos= findItem (bufFactors, k.getItem().factor());560 if (pos)561 tmp *= power (getItem (interMedResult, pos), k.getItem().exp());562 }563 result.append (tmp);564 }565 566 for (CFListIterator i= result; i.hasItem(); i++)567 {568 F /= i.getItem();569 if (foundDifferent)570 i.getItem()= swapvar (i.getItem(), x, z);571 i.getItem()= N (i.getItem());572 }573 574 if (foundDifferent)575 {576 CFList l= differentSecondVarLCs [j];577 for (CFListIterator i= l; i.hasItem(); i++)578 i.getItem()= swapvar (i.getItem(), y, z);579 differentSecondVarLCs [j]= l;580 F= swapvar (F, x, z);581 }582 583 result.insert (N (F));584 585 result= distributeContent (result, differentSecondVarLCs, length);586 587 if (!result.getFirst().inCoeffDomain())588 {589 CFListIterator i= result;590 CanonicalForm tmp;591 if (foundDifferent)592 i.getItem()= swapvar (i.getItem(), Variable (2), y);593 594 tmp= i.getItem();595 596 i++;597 for (; i.hasItem(); i++)598 {599 if (foundDifferent)600 i.getItem()= swapvar (i.getItem(), Variable (2), y)*tmp;601 else602 i.getItem() *= tmp;603 }604 }605 else606 y= Variable (1);607 608 delete [] bufSqrfFactors;609 610 return result;611 }612 613 153 614 154 CFList … … 839 379 840 380 Variable w; 841 CFList leadingCoeffs= precomputeLeadingCoeff (LC (A, 1), biFactorsLCs, 381 CFList leadingCoeffs= precomputeLeadingCoeff (LC (A, 1), biFactorsLCs, x, 842 382 evaluation, Aeval2, lengthAeval2, w); 843 383 -
factory/facFqFactorize.cc
rbecbea rafbebe 1327 1327 1328 1328 CanonicalForm F= G; 1329 CFFList sqrfFactorization= squarefreeFactorization (F, alpha); 1329 CFFList sqrfFactorization; 1330 if (getCharacteristic() > 0) 1331 sqrfFactorization= squarefreeFactorization (F, alpha); 1332 else 1333 sqrfFactorization= sqrFree (F); 1330 1334 1331 1335 sqrfPartF= 1; … … 1348 1352 { 1349 1353 tmp= 1; 1350 sqrfFactors= squarefreeFactorization (i.getItem(), alpha); 1354 if (getCharacteristic() > 0) 1355 sqrfFactors= squarefreeFactorization (i.getItem(), alpha); 1356 else 1357 sqrfFactors= sqrFree (i.getItem()); 1351 1358 1352 1359 for (iter= sqrfFactors; iter.hasItem(); iter++) -
factory/facFqFactorize.h
rbecbea rafbebe 640 640 ); 641 641 642 /// computes a list l of length length(LCFFactors)+1 of polynomials such that 643 /// prod (l)=LCF, note that the first entry of l may be non constant. Intended 644 /// to be used to precompute coefficients of a polynomial f from its bivariate 645 /// factorizations. 646 /// 647 /// @return see above 648 CFList 649 precomputeLeadingCoeff (const CanonicalForm& LCF, ///<[in] a multivariate 650 ///< poly 651 const CFList& LCFFactors, ///<[in] a list of 652 ///< univariate factors 653 ///< of LCF of level 2 654 const Variable& alpha, ///<[in] algebraic var. 655 const CFList& evaluation, ///<[in] an evaluation 656 ///< point having 657 ///< lSecondVarLCs+1 658 ///< components 659 CFList* & differentSecondVarLCs,///<[in] LCs of factors 660 ///< of f wrt different 661 ///< second variables 662 int lSecondVarLCs, ///<[in] length of the 663 ///< above 664 Variable& y ///<[in,out] if y.level() 665 ///< is not 1 on output 666 ///< the second variable 667 ///< has been changed to 668 ///< y 669 ); 670 642 671 #endif 643 672 /* FAC_FQ_FACTORIZE_H */
Note: See TracChangeset
for help on using the changeset viewer.