Changeset cd5189 in git


Ignore:
Timestamp:
Feb 8, 2005, 4:00:05 PM (18 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a657104b677b4c461d018cbf3204d72d34ad66a9')
Children:
a96f4d9e2f9f0ae333c8bbfda7b2b6f5393bf913
Parents:
b90de5ab5fe432dc4b3427d32a7f026c001ca9e7
Message:
*bricken: end recursion removed


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

Legend:

Unmodified
Added
Removed
  • kernel/fast_mult.cc

    rb90de5a rcd5189  
    11#include "fast_mult.h"
     2#include "kbuckets.h"
    23static void degsplit(poly p,int n,poly &p1,poly&p2){
    34  poly erg1_i, erg2_i;
     
    56  erg2_i=NULL;
    67  while(p){
    7     if(pFDeg(p)>=n){
     8    if(pGetExp(p,1)>=n){
    89      if (p1==NULL){
    910        p1=p;
     
    3233static void div_by_x_power_n(poly p, int n){
    3334  while(p){
    34     assume(pFDeg(p)>=n);
     35    assume(pGetExp(p,1)>=n);
    3536    int e=pGetExp(p,1);
    3637    pSetExp(p,1,e-n);
     
    3839  }
    3940}
    40 poly unifastmult(poly f,poly g){
     41
     42poly do_unifastmult(poly f,poly g){
    4143  int n=1;
    4244  if ((f==NULL)||(g==NULL)) return NULL;
    43   int df=pFDeg(f);
    44   int dg=pFDeg(g);
     45  int df=pGetExp(f,1);//pFDeg(f);
     46    int dg=pGetExp(g,1);//pFDeg(g);
    4547       
    4648  int dm;
     
    7779  poly pbig=unifastmult(pAdd(f0,f1),pAdd(g0,g1));
    7880 
    79   poly erg=p11;
     81  poly erg=NULL;//=p11;
    8082 
    8183  poly factor=pOne();
     
    101103  return(erg);
    102104}
     105
     106poly 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}
     193poly 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.