Changeset cbea799 in git


Ignore:
Timestamp:
Feb 25, 2005, 11:19:08 AM (19 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'spielwiese', 'ec94ef7a30b928574c0c3daf41f6804dff5f6b69')
Children:
d5f9d9824fa97f70e3980e43910badd1754d7207
Parents:
9bea6ef004ce1d30a0df5771578cee93e449259d
Message:
*bricken: optimizing


git-svn-id: file:///usr/local/Singular/svn/trunk@7764 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/fast_mult.cc

    r9bea6e rcbea799  
    379379  return erg;
    380380}
    381 
     381static omBin lm_bin=NULL;
     382/*3
     383* compute for monomials p*q
     384* destroys p, keeps q
     385*/
     386static 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}
    382402static poly p_MonPowerMB(poly p, int exp, ring r)
    383403{
     
    399419  return p;
    400420}
    401 static void buildTermAndAdd(int n,number* facult,poly* f_terms,int* exp,int f_len,kBucket_pt erg_bucket,ring r, number coef){
     421static 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){
    402422 
    403423  int i;
    404   poly term=p_Init(r);
     424  //  poly term=p_Init(r);
    405425
    406426   //  number denom=n_Init(1,r);
     
    416436//   n_Delete(&denom,r);
    417437//   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);
    419441  for(i=0;i<f_len;i++){
    420442    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     
    423449      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);
    426452    }
    427453   
    428454  }
    429455  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
     462static 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){
    436463  int i;
    437464
    438465  if (pos<f_len-1){
     466    poly zw_l=NULL;
    439467    for(i=0;i<=n-sum;i++){
    440468      exp[pos]=i;
    441469      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      }
    443478      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);
    444483    }
    445484    return;
     
    449488    exp[pos]=i;
    450489    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);
    453492  }
    454493  assume(pos<=f_len-1);
     
    456495poly pFastPowerMC(poly f, int n, ring r){
    457496  //only char=0
     497 
    458498  if(rChar(r)!=0)
    459499    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");
    461502  //  number null_number=n_Init(0,r);
    462503  number* facult=(number*) omalloc((n+1)*sizeof(number));
     
    468509    n_Delete(&this_n,r);
    469510  }
     511
     512  lm_bin=omGetSpecBin(POLYSIZE + (r->ExpL_Size)*sizeof(long));
     513
    470514  kBucket_pt erg_bucket= kBucketCreate(currRing);
    471515  kBucketInit(erg_bucket,NULL,0);
     
    480524  }
    481525  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 
    489535  //free res
    490536 
    491537  //free facult
    492538  for(i=0;i<=n;i++){
    493     nDelete(&facult[i]);
    494   }
     539    n_Delete(&facult[i],r);
     540  }
     541  p_Delete(&tmp,r);
    495542  omfree(exp);
    496543  omfree(facult);
     
    500547  kBucketClear(erg_bucket,&erg, &len);
    501548  kBucketDestroy(&erg_bucket);
     549  omUnGetSpecBin(&lm_bin);
    502550  return erg;
    503551}
Note: See TracChangeset for help on using the changeset viewer.