Changeset cd5189 in git
- Timestamp:
- Feb 8, 2005, 4:00:05 PM (18 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a657104b677b4c461d018cbf3204d72d34ad66a9')
- Children:
- a96f4d9e2f9f0ae333c8bbfda7b2b6f5393bf913
- Parents:
- b90de5ab5fe432dc4b3427d32a7f026c001ca9e7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/fast_mult.cc
rb90de5a rcd5189 1 1 #include "fast_mult.h" 2 #include "kbuckets.h" 2 3 static void degsplit(poly p,int n,poly &p1,poly&p2){ 3 4 poly erg1_i, erg2_i; … … 5 6 erg2_i=NULL; 6 7 while(p){ 7 if(p FDeg(p)>=n){8 if(pGetExp(p,1)>=n){ 8 9 if (p1==NULL){ 9 10 p1=p; … … 32 33 static void div_by_x_power_n(poly p, int n){ 33 34 while(p){ 34 assume(p FDeg(p)>=n);35 assume(pGetExp(p,1)>=n); 35 36 int e=pGetExp(p,1); 36 37 pSetExp(p,1,e-n); … … 38 39 } 39 40 } 40 poly unifastmult(poly f,poly g){ 41 42 poly do_unifastmult(poly f,poly g){ 41 43 int n=1; 42 44 if ((f==NULL)||(g==NULL)) return NULL; 43 int df=p FDeg(f);44 int dg=pFDeg(g);45 int df=pGetExp(f,1);//pFDeg(f); 46 int dg=pGetExp(g,1);//pFDeg(g); 45 47 46 48 int dm; … … 77 79 poly pbig=unifastmult(pAdd(f0,f1),pAdd(g0,g1)); 78 80 79 poly erg= p11;81 poly erg=NULL;//=p11; 80 82 81 83 poly factor=pOne(); … … 101 103 return(erg); 102 104 } 105 106 poly do_unifastmult_buckets(poly f,poly g){ 107 108 109 // BOOLEAN corr=lenS_correct(strat); 110 111 int n=1; 112 if ((f==NULL)||(g==NULL)) return NULL; 113 int df=pGetExp(f,1);//pFDeg(f); 114 int dg=pGetExp(g,1);//pFDeg(g); 115 116 int dm; 117 if(df>dg){ 118 dm=df; 119 }else{ 120 dm=dg; 121 } 122 while(n<=dm) 123 { 124 n*=2; 125 } 126 int pseudo_len=0; 127 if(n==1){ 128 return ppMult_qq(f,g); 129 130 } 131 kBucket_pt erg_bucket= kBucketCreate(currRing); 132 kBucketInit(erg_bucket,NULL,0 /*pLength(P.p)*/); 133 //poly erg_mult=pOne(); 134 int pot=n/2; 135 assume(pot*2==n); 136 poly f1=NULL; 137 //f/(x^(pot)); 138 poly f0=NULL;//f-(x^(pot)*F1); 139 degsplit(pCopy(f),pot,f1,f0); 140 div_by_x_power_n(f1,pot); 141 // poly G1=g/(x^(pot)); 142 //poly G0=g-(x^(pot)*G1); 143 poly g1=NULL; 144 poly g0=NULL; 145 degsplit(pCopy(g),pot,g1,g0); 146 div_by_x_power_n(g1,pot); 147 148 poly p00=unifastmult(f0,g0); 149 poly p11=unifastmult(f1,g1); 150 151 poly pbig=unifastmult(pAdd(f0,f1),pAdd(g0,g1)); 152 153 //poly erg=p11; 154 155 poly factor=pOne();//pCopy(erg_mult); 156 pSetExp(factor,1,n); 157 pseudo_len=0; 158 kBucket_Add_q(erg_bucket,ppMult_mm(p11,factor),&pseudo_len); 159 pseudo_len=0; 160 kBucket_Add_q(erg_bucket,pCopy(p00),&pseudo_len); 161 pSetExp(factor,1,pot); 162 //poly sum=pbig; 163 pseudo_len=0; 164 kBucket_Add_q(erg_bucket,pMult_mm(pbig,factor),&pseudo_len); 165 pseudo_len=0; 166 kBucket_Add_q(erg_bucket,pMult_mm(pNeg(p00),factor),&pseudo_len); 167 pseudo_len=0; 168 kBucket_Add_q(erg_bucket,pMult_mm(pNeg(p11),factor),&pseudo_len); 169 // pSetExp(factor,1,pot); 170 171 // sum=pAdd(sum,pNeg(p00)); 172 173 174 //sum=pAdd(sum,pNeg(p11)); 175 176 177 //sum=pMult_mm(sum,factor); 178 179 pseudo_len=0; 180 // kBucket_Add_q(erg_bucket,sum,&pseudo_len); 181 // erg=pAdd(erg,p00); 182 183 pDelete(&factor); 184 //return(erg); 185 // pDelete(&erg_mult); 186 int len=0; 187 poly erg=NULL; 188 kBucketClear(erg_bucket,&erg,&len); 189 kBucketDestroy(&erg_bucket); 190 //pNormalize(P.p); 191 return erg; 192 } 193 poly unifastmult(poly f,poly g){ 194 if((f==NULL)||(g==NULL)) return NULL; 195 int df=pGetExp(f,1); 196 int dg=pGetExp(g,1); 197 if ((df==1)||(dg==1)) 198 return ppMult_qq(f,g); 199 if (df*dg<100) 200 return ppMult_qq(f,g); 201 // if (df*dg>10000) 202 // return 203 // do_unifastmult_buckets(f,g); 204 //else 205 return do_unifastmult(f,g); 206 207 } 208
Note: See TracChangeset
for help on using the changeset viewer.