Changeset c70e58 in git for kernel/fast_mult.cc


Ignore:
Timestamp:
Feb 14, 2005, 11:03:41 AM (19 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
aa07a05c3a08e7bfc7d1e1326b8bfe6f74ab6430
Parents:
446c2dec291872c3568905658dd37d52142edc62
Message:
*bricken: generalized


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

Legend:

Unmodified
Added
Removed
  • kernel/fast_mult.cc

    r446c2d rc70e58  
    22#include "kbuckets.h"
    33static const int pass_option=1;
    4 static void degsplit(poly p,int n,poly &p1,poly&p2){
     4static void degsplit(poly p,int n,poly &p1,poly&p2, int vn){
    55  poly erg1_i, erg2_i;
    66  erg1_i=NULL;
    77  erg2_i=NULL;
    88  while(p){
    9     if(pGetExp(p,1)>=n){
     9    if(pGetExp(p,vn)>=n){
    1010      if (p1==NULL){
    1111        p1=p;
     
    3232 
    3333}
    34 static void div_by_x_power_n(poly p, int n){
     34static void div_by_x_power_n(poly p, int n, int vn){
    3535  while(p){
    36     assume(pGetExp(p,1)>=n);
    37     int e=pGetExp(p,1);
    38     pSetExp(p,1,e-n);
     36    assume(pGetExp(p,vn)>=n);
     37    int e=pGetExp(p,vn);
     38    pSetExp(p,vn,e-n);
    3939    p=pNext(p);
    4040  }
    4141}
    4242
    43 poly do_unifastmult(poly f,poly g){
     43poly do_unifastmult(poly f,int df,poly g,int dg, int vn){
    4444  int n=1;
    4545  if ((f==NULL)||(g==NULL)) return NULL;
    46   int df=pGetExp(f,1);//pFDeg(f);
    47     int dg=pGetExp(g,1);//pFDeg(g);
     46  //int df=pGetExp(f,vn);//pFDeg(f);
     47  //  int dg=pGetExp(g,vn);//pFDeg(g);
    4848       
    4949  int dm;
     
    6868  poly f1=NULL;
    6969  poly f0=NULL;//f-(x^(pot)*F1);
    70   degsplit(pCopy(f),pot,f1,f0);
    71   div_by_x_power_n(f1,pot);
     70  degsplit(pCopy(f),pot,f1,f0,vn);
     71  div_by_x_power_n(f1,pot,vn);
    7272
    7373  poly g1=NULL;
    7474  poly g0=NULL;
    75   degsplit(pCopy(g),pot,g1,g0);
    76   div_by_x_power_n(g1,pot);
     75  degsplit(pCopy(g),pot,g1,g0,vn);
     76  div_by_x_power_n(g1,pot,vn);
    7777 
    7878  //p00, p11
     
    8484  poly factor=pOne();
    8585
    86   pSetExp(factor,1,n);
     86  pSetExp(factor,vn,n);
    8787  erg=ppMult_mm(p11,factor);
    8888  erg=pAdd(erg,pCopy(p00));
     
    101101  //eat up pbig
    102102  poly sum=pbig;
    103   pSetExp(factor,1,pot);
     103  pSetExp(factor,vn,pot);
    104104 
    105105  //eat up p00
     
    119119    poly s1=unifastmult(f0,g1);
    120120    poly s2=unifastmult(g0,f1);
    121     pSetExp(factor,1,pot);
     121    pSetExp(factor,vn,pot);
    122122    poly h=pMult_mm(((s1!=NULL)?s1:s2),factor);
    123123    pDelete(&f1);
     
    136136}
    137137
    138 poly do_unifastmult_buckets(poly f,poly g){
     138// poly do_unifastmult_buckets(poly f,poly g){
    139139   
    140140 
    141141
    142142
    143   int n=1;
    144   if ((f==NULL)||(g==NULL)) return NULL;
    145   int df=pGetExp(f,1);//pFDeg(f);
    146     int dg=pGetExp(g,1);//pFDeg(g);
     143//   int n=1;
     144//   if ((f==NULL)||(g==NULL)) return NULL;
     145//   int df=pGetExp(f,1);//pFDeg(f);
     146//     int dg=pGetExp(g,1);//pFDeg(g);
    147147       
    148   int dm;
    149   if(df>dg){
    150     dm=df;
    151   }else{
    152     dm=dg;
    153   }
    154   while(n<=dm)
    155     {
    156       n*=2;
    157     }
    158   int pseudo_len=0;
    159   if(n==1){
    160     return ppMult_qq(f,g);
    161 
    162   }
    163   kBucket_pt erg_bucket= kBucketCreate(currRing);
    164   kBucketInit(erg_bucket,NULL,0 /*pLength(P.p)*/);
    165 
    166   int pot=n/2;
    167   assume(pot*2==n);
    168 
    169 
    170   //splitting
    171   poly f1=NULL;
    172   poly f0=NULL;//f-(x^(pot)*F1);
    173   degsplit(pCopy(f),pot,f1,f0);
    174   div_by_x_power_n(f1,pot);
    175   poly g1=NULL;
    176   poly g0=NULL;
    177   degsplit(pCopy(g),pot,g1,g0);
    178   div_by_x_power_n(g1,pot);
    179  
    180   //p00
    181   //p11
    182   poly p00=unifastmult(f0,g0);
    183   poly p11=unifastmult(f1,g1);
    184  
    185 
    186 
    187 
    188   //eat up f0,f1,g0,g1
    189   poly pbig=unifastmult(pAdd(f0,f1),pAdd(g0,g1)); 
    190   poly factor=pOne();//pCopy(erg_mult);
    191   pSetExp(factor,1,n);
    192   pseudo_len=0;
    193   kBucket_Add_q(erg_bucket,ppMult_mm(p11,factor),&pseudo_len);
    194   pseudo_len=0;
    195   kBucket_Add_q(erg_bucket,pCopy(p00),&pseudo_len);
    196   pSetExp(factor,1,pot);
    197 
    198   //eat up pbig
    199   pseudo_len=0;
    200   kBucket_Add_q(erg_bucket,pMult_mm(pbig,factor),&pseudo_len);
    201   pseudo_len=0;
    202   //eat up p00
    203   kBucket_Add_q(erg_bucket,pMult_mm(pNeg(p00),factor),&pseudo_len);
    204   pseudo_len=0;
    205   //eat up p11
    206   kBucket_Add_q(erg_bucket,pMult_mm(pNeg(p11),factor),&pseudo_len);
    207 
    208  
    209   pseudo_len=0;
    210 
    211  
    212   pDelete(&factor);
    213 
    214   int len=0;
    215   poly erg=NULL;
    216   kBucketClear(erg_bucket,&erg,&len);
    217   kBucketDestroy(&erg_bucket);
    218 
    219   return erg;
    220 }
     148//   int dm;
     149//   if(df>dg){
     150//     dm=df;
     151//   }else{
     152//     dm=dg;
     153//   }
     154//   while(n<=dm)
     155//     {
     156//       n*=2;
     157//     }
     158//   int pseudo_len=0;
     159//   if(n==1){
     160//     return ppMult_qq(f,g);
     161
     162//   }
     163//   kBucket_pt erg_bucket= kBucketCreate(currRing);
     164//   kBucketInit(erg_bucket,NULL,0 /*pLength(P.p)*/);
     165
     166//   int pot=n/2;
     167//   assume(pot*2==n);
     168
     169
     170//   //splitting
     171//   poly f1=NULL;
     172//   poly f0=NULL;//f-(x^(pot)*F1);
     173//   degsplit(pCopy(f),pot,f1,f0);
     174//   div_by_x_power_n(f1,pot);
     175//   poly g1=NULL;
     176//   poly g0=NULL;
     177//   degsplit(pCopy(g),pot,g1,g0);
     178//   div_by_x_power_n(g1,pot);
     179 
     180//   //p00
     181//   //p11
     182//   poly p00=unifastmult(f0,g0);
     183//   poly p11=unifastmult(f1,g1);
     184 
     185
     186
     187
     188//   //eat up f0,f1,g0,g1
     189//   poly pbig=unifastmult(pAdd(f0,f1),pAdd(g0,g1)); 
     190//   poly factor=pOne();//pCopy(erg_mult);
     191//   pSetExp(factor,1,n);
     192//   pseudo_len=0;
     193//   kBucket_Add_q(erg_bucket,ppMult_mm(p11,factor),&pseudo_len);
     194//   pseudo_len=0;
     195//   kBucket_Add_q(erg_bucket,pCopy(p00),&pseudo_len);
     196//   pSetExp(factor,1,pot);
     197
     198//   //eat up pbig
     199//   pseudo_len=0;
     200//   kBucket_Add_q(erg_bucket,pMult_mm(pbig,factor),&pseudo_len);
     201//   pseudo_len=0;
     202//   //eat up p00
     203//   kBucket_Add_q(erg_bucket,pMult_mm(pNeg(p00),factor),&pseudo_len);
     204//   pseudo_len=0;
     205//   //eat up p11
     206//   kBucket_Add_q(erg_bucket,pMult_mm(pNeg(p11),factor),&pseudo_len);
     207
     208 
     209//   pseudo_len=0;
     210
     211 
     212//   pDelete(&factor);
     213
     214//   int len=0;
     215//   poly erg=NULL;
     216//   kBucketClear(erg_bucket,&erg,&len);
     217//   kBucketDestroy(&erg_bucket);
     218
     219//   return erg;
     220// }
    221221poly unifastmult(poly f,poly g){
     222  int vn=1;
    222223  if((f==NULL)||(g==NULL)) return NULL;
    223   int df=pGetExp(f,1);
    224   int dg=pGetExp(g,1);
    225   if ((df==1)||(dg==1))
     224  int df=pGetExp(f,vn);
     225  int dg=pGetExp(g,vn);
     226  if ((df==0)||(dg==0))
    226227    return ppMult_qq(f,g);
    227228  if (df*dg<100)
     
    231232  //    do_unifastmult_buckets(f,g);
    232233  //else
    233   return do_unifastmult(f,g);
    234 
    235 }
    236 
     234  return do_unifastmult(f,df,g,dg,vn);
     235
     236}
     237
Note: See TracChangeset for help on using the changeset viewer.