Changeset 040ee80 in git for kernel/fast_mult.cc


Ignore:
Timestamp:
Feb 24, 2005, 4:47:15 PM (19 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
d2d22f37cedd1bca3c993c2cb29636ea4bb44464
Parents:
cd683c83b3e7cf7b64fe41004ea5ae3a25993846
Message:
*bricken: powers with multinomial coefs


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

Legend:

Unmodified
Added
Removed
  • kernel/fast_mult.cc

    rcd683c r040ee80  
    11#include "fast_mult.h"
    22#include "kbuckets.h"
     3#include "febase.h"
    34typedef poly fastmultrec(poly f, poly g, ring r);
    45static const int pass_option=1;
     
    378379  return erg;
    379380}
     381
     382static 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}
     401static 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
     432static 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}
     448poly 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.