Changeset 040ee80 in git for kernel/fast_mult.cc
- Timestamp:
- Feb 24, 2005, 4:47:15 PM (19 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- d2d22f37cedd1bca3c993c2cb29636ea4bb44464
- Parents:
- cd683c83b3e7cf7b64fe41004ea5ae3a25993846
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/fast_mult.cc
rcd683c r040ee80 1 1 #include "fast_mult.h" 2 2 #include "kbuckets.h" 3 #include "febase.h" 3 4 typedef poly fastmultrec(poly f, poly g, ring r); 4 5 static const int pass_option=1; … … 378 379 return erg; 379 380 } 381 382 static poly p_MonPowerMB(poly p, int exp, ring r) 383 { 384 int i; 385 386 if(!n_IsOne(p_GetCoeff(p,r),r)) 387 { 388 number x, y; 389 y = p_GetCoeff(p,r); 390 n_Power(y,exp,&x,r); 391 n_Delete(&y,r); 392 p_SetCoeff0(p,x,r); 393 } 394 for (i=rVar(r); i!=0; i--) 395 { 396 p_MultExp(p,i, exp,r); 397 } 398 p_Setm(p,r); 399 return p; 400 } 401 static void buildTermAndAdd(int n,number* facult,poly* f_terms,int* exp,int f_len,kBucket_pt erg_bucket,ring r){ 402 number denom=n_Init(1,r); 403 int i; 404 poly term=p_Init(r); 405 for(i=0;i<f_len;i++){ 406 if(exp[i]!=0){ 407 number trash=denom; 408 denom=n_Mult(denom,facult[exp[i]],r); 409 n_Delete(&trash,r); 410 } 411 412 } 413 number coef=n_IntDiv(facult[n],denom,r); //right function here? 414 n_Delete(&denom,r); 415 poly erg=p_NSet(coef,r); 416 for(i=0;i<f_len;i++){ 417 if(exp[i]!=0){ 418 poly term=p_Copy(f_terms[i],r); 419 term->next=NULL; 420 p_MonPowerMB(term, exp[i],r); 421 erg=p_Mult_mm(erg,term,r); 422 p_Delete(&term,r); 423 } 424 425 } 426 int pseudo_len=0; 427 kBucket_Add_q(erg_bucket,erg,&pseudo_len); 428 } 429 430 431 432 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){ 433 int i; 434 if (pos<f_len-1){ 435 for(i=0;i<=n-sum;i++){ 436 exp[pos]=i; 437 MC_iterate(f, n, r, f_len,facult, exp,f_terms,erg_bucket,pos+1,sum+i); 438 } 439 return; 440 } 441 if(pos==f_len-1){ 442 i=n-sum; 443 exp[pos]=i; 444 buildTermAndAdd(n,facult,f_terms,exp,f_len,erg_bucket,r); 445 } 446 assume(pos<=f_len-1); 447 } 448 poly pFastPowerMC(poly f, int n, ring r){ 449 //only char=0 450 if(rChar(r)!=0) 451 Werror("Char not 0, pFastPowerMC not implemented for this case"); 452 453 // number null_number=n_Init(0,r); 454 number* facult=(number*) omalloc((n+1)*sizeof(number)); 455 facult[0]=n_Init(1,r); 456 int i; 457 for(i=1;i<=n;i++){ 458 number this_n=n_Init(i,r); 459 facult[i]=n_Mult(this_n,facult[i-1],r); 460 n_Delete(&this_n,r); 461 } 462 kBucket_pt erg_bucket= kBucketCreate(currRing); 463 kBucketInit(erg_bucket,NULL,0); 464 const int f_len=pLength(f); 465 int* exp=(int*)omalloc(f_len*sizeof(int)); 466 //poly f_terms[f_len]; 467 poly* f_terms=(poly*)omalloc(f_len*sizeof(poly)); 468 poly f_iter=f; 469 for(i=0;i<f_len;i++){ 470 f_terms[i]=f_iter; 471 f_iter=pNext(f_iter); 472 } 473 assume(f_iter==NULL); 474 MC_iterate(f,n,r,f_len,&facult[0], &exp[0], &f_terms[0],erg_bucket,0,0); 475 476 477 478 479 480 481 //free res 482 483 //free facult 484 for(i=0;i<=n;i++){ 485 nDelete(&facult[0]); 486 } 487 omfree(exp); 488 omfree(facult); 489 omfree(f_terms); 490 int len=0; 491 poly erg; 492 kBucketClear(erg_bucket,&erg, &len); 493 return erg; 494 }
Note: See TracChangeset
for help on using the changeset viewer.