Changeset cbea799 in git
- Timestamp:
- Feb 25, 2005, 11:19:08 AM (19 years ago)
- Branches:
- (u'spielwiese', 'ec94ef7a30b928574c0c3daf41f6804dff5f6b69')
- Children:
- d5f9d9824fa97f70e3980e43910badd1754d7207
- Parents:
- 9bea6ef004ce1d30a0df5771578cee93e449259d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/fast_mult.cc
r9bea6e rcbea799 379 379 return erg; 380 380 } 381 381 static omBin lm_bin=NULL; 382 /*3 383 * compute for monomials p*q 384 * destroys p, keeps q 385 */ 386 static void p_MonMultMB(poly p, poly q,ring r) 387 { 388 number x, y; 389 // int i; 390 391 y = p_GetCoeff(p,r); 392 x = n_Mult(y,pGetCoeff(q),r); 393 n_Delete(&y,r); 394 p_SetCoeff0(p,x,r); 395 //for (i=pVariables; i!=0; i--) 396 //{ 397 // pAddExp(p,i, pGetExp(q,i)); 398 //} 399 //p->Order += q->Order; 400 p_ExpVectorAdd(p,q,r); 401 } 382 402 static poly p_MonPowerMB(poly p, int exp, ring r) 383 403 { … … 399 419 return p; 400 420 } 401 static void buildTermAndAdd(int n,number* facult,poly* f_terms,int* exp,int f_len,kBucket_pt erg_bucket,ring r, number coef ){421 static void buildTermAndAdd(int n,number* facult,poly* f_terms,int* exp,int f_len,kBucket_pt erg_bucket,ring r, number coef, poly & zw, poly tmp){ 402 422 403 423 int i; 404 poly term=p_Init(r);424 // poly term=p_Init(r); 405 425 406 426 // number denom=n_Init(1,r); … … 416 436 // n_Delete(&denom,r); 417 437 // poly erg=p_NSet(coef,r); 418 poly erg=p_NSet(n_Copy(coef,r),r); 438 poly erg=p_Init(r,lm_bin); 439 p_SetCoeff0(erg, coef,r); 440 //p_NSet(n_Copy(coef,r),r); 419 441 for(i=0;i<f_len;i++){ 420 442 if(exp[i]!=0){ 421 poly term=p_Copy(f_terms[i],r); 422 term->next=NULL; 443 ///poly term=p_Copy(f_terms[i],r); 444 poly term=tmp; 445 p_ExpVectorCopy(term,f_terms[i],r); 446 p_SetCoeff(term, n_Copy(p_GetCoeff(f_terms[i],r),r),r); 447 //term->next=NULL; 448 423 449 p_MonPowerMB(term, exp[i],r); 424 erg=p_Mult_mm(erg,term,r);425 p_Delete(&term,r);450 p_MonMultMB(erg,term,r); 451 //p_Delete(&term,r); 426 452 } 427 453 428 454 } 429 455 int pseudo_len=1; 430 kBucket_Add_q(erg_bucket,erg,&pseudo_len); 431 } 432 433 434 435 static void MC_iterate(poly f, int n, ring r, int f_len,number* facult, int* exp,poly* f_terms,kBucket_pt erg_bucket,int pos,int sum, number coef){ 456 zw=erg; 457 // kBucket_Add_q(erg_bucket,erg,&pseudo_len); 458 } 459 460 461 462 static void MC_iterate(poly f, int n, ring r, int f_len,number* facult, int* exp,poly* f_terms,kBucket_pt erg_bucket,int pos,int sum, number coef, poly & zw, poly tmp){ 436 463 int i; 437 464 438 465 if (pos<f_len-1){ 466 poly zw_l=NULL; 439 467 for(i=0;i<=n-sum;i++){ 440 468 exp[pos]=i; 441 469 number new_coef=n_IntDiv(coef,facult[i],r); 442 MC_iterate(f, n, r, f_len,facult, exp,f_terms,erg_bucket,pos+1,sum+i,new_coef); 470 poly zw_real=NULL; 471 MC_iterate(f, n, r, f_len,facult, exp,f_terms,erg_bucket,pos+1,sum+i,new_coef,zw_real,tmp); 472 if (pos==f_len-2){ 473 //get first small polys 474 475 zw_real->next=zw_l; 476 zw_l=zw_real; 477 } 443 478 n_Delete(& new_coef,r); 479 } 480 if (pos==f_len-2){ 481 int len=n-sum+1; 482 kBucket_Add_q(erg_bucket,zw_l,&len); 444 483 } 445 484 return; … … 449 488 exp[pos]=i; 450 489 number new_coef=n_IntDiv(coef,facult[i],r); 451 buildTermAndAdd(n,facult,f_terms,exp,f_len,erg_bucket,r, new_coef );452 n_Delete(& new_coef,r);490 buildTermAndAdd(n,facult,f_terms,exp,f_len,erg_bucket,r, new_coef,zw, tmp); 491 // n_Delete(& new_coef,r); 453 492 } 454 493 assume(pos<=f_len-1); … … 456 495 poly pFastPowerMC(poly f, int n, ring r){ 457 496 //only char=0 497 458 498 if(rChar(r)!=0) 459 499 Werror("Char not 0, pFastPowerMC not implemented for this case"); 460 500 if (n<=1) 501 Werror("not implemented for so small n, recursion fails"); 461 502 // number null_number=n_Init(0,r); 462 503 number* facult=(number*) omalloc((n+1)*sizeof(number)); … … 468 509 n_Delete(&this_n,r); 469 510 } 511 512 lm_bin=omGetSpecBin(POLYSIZE + (r->ExpL_Size)*sizeof(long)); 513 470 514 kBucket_pt erg_bucket= kBucketCreate(currRing); 471 515 kBucketInit(erg_bucket,NULL,0); … … 480 524 } 481 525 assume(f_iter==NULL); 482 MC_iterate(f,n,r,f_len,&facult[0], &exp[0], &f_terms[0],erg_bucket,0,0,facult[n]); 483 484 485 486 487 488 526 poly zw=NULL; 527 poly tmp=p_Init(r); 528 MC_iterate(f,n,r,f_len,&facult[0], &exp[0], &f_terms[0],erg_bucket,0,0,facult[n],zw,tmp); 529 530 531 532 533 534 489 535 //free res 490 536 491 537 //free facult 492 538 for(i=0;i<=n;i++){ 493 nDelete(&facult[i]); 494 } 539 n_Delete(&facult[i],r); 540 } 541 p_Delete(&tmp,r); 495 542 omfree(exp); 496 543 omfree(facult); … … 500 547 kBucketClear(erg_bucket,&erg, &len); 501 548 kBucketDestroy(&erg_bucket); 549 omUnGetSpecBin(&lm_bin); 502 550 return erg; 503 551 }
Note: See TracChangeset
for help on using the changeset viewer.