Changeset 78030c in git


Ignore:
Timestamp:
Feb 14, 2005, 5:15:53 PM (18 years ago)
Author:
Michael Brickenstein <bricken@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', '00e2e9c41af3fde1273eb3633f4c0c7c3db2579d')
Children:
49bfb1f50e3b7d2ed4c371ec6ee986a0d6f3d2ef
Parents:
2664d0fccb132e3077f9f8feee90ee2ce139ee26
Message:
+ ring as parameter


git-svn-id: file:///usr/local/Singular/svn/trunk@7727 2c84dea3-7e68-4137-9b89-c4e89433aadc
Location:
kernel
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/fast_mult.cc

    r2664d0f r78030c  
    11#include "fast_mult.h"
    22#include "kbuckets.h"
    3 typedef poly fastmultrec(poly f, poly g);
     3typedef poly fastmultrec(poly f, poly g, ring r);
    44static const int pass_option=1;
    5 static void degsplit(poly p,int n,poly &p1,poly&p2, int vn){
     5static void degsplit(poly p,int n,poly &p1,poly&p2, int vn, ring r){
    66  poly erg1_i, erg2_i;
    77  erg1_i=NULL;
    88  erg2_i=NULL;
    99  while(p){
    10     if(pGetExp(p,vn)>=n){
     10    if(p_GetExp(p,vn,r)>=n){
    1111      if (p1==NULL){
    1212        p1=p;
     
    3333 
    3434}
    35 static void div_by_x_power_n(poly p, int n, int vn){
     35static void div_by_x_power_n(poly p, int n, int vn, ring r){
    3636  while(p){
    37     assume(pGetExp(p,vn)>=n);
    38     int e=pGetExp(p,vn);
    39     pSetExp(p,vn,e-n);
     37    assume(p_GetExp(p,vn,r)>=n);
     38    int e=p_GetExp(p,vn,r);
     39    p_SetExp(p,vn,e-n,r);
    4040    p=pNext(p);
    4141  }
    4242}
    4343
    44 static poly do_unifastmult(poly f,int df,poly g,int dg, int vn, fastmultrec rec){
     44static poly do_unifastmult(poly f,int df,poly g,int dg, int vn, fastmultrec rec, ring r){
    4545  int n=1;
    4646  if ((f==NULL)||(g==NULL)) return NULL;
     
    5959    }
    6060  if(n==1){
    61     return(ppMult_qq(f,g));
     61    return(pp_Mult_qq(f,g,r));
    6262  }
    6363 
     
    6969  poly f1=NULL;
    7070  poly f0=NULL;//f-(x^(pot)*F1);
    71   degsplit(pCopy(f),pot,f1,f0,vn);
    72   div_by_x_power_n(f1,pot,vn);
     71  degsplit(p_Copy(f,r),pot,f1,f0,vn,r);
     72  div_by_x_power_n(f1,pot,vn,r);
    7373
    7474  poly g1=NULL;
    7575  poly g0=NULL;
    76   degsplit(pCopy(g),pot,g1,g0,vn);
    77   div_by_x_power_n(g1,pot,vn);
     76  degsplit(p_Copy(g,r),pot,g1,g0,vn,r);
     77  div_by_x_power_n(g1,pot,vn,r);
    7878 
    7979  //p00, p11
    80   poly p00=rec(f0,g0);//unifastmult(f0,g0);
    81   poly p11=rec(f1,g1);
     80  poly p00=rec(f0,g0,r);//unifastmult(f0,g0);
     81  poly p11=rec(f1,g1,r);
    8282
    8383  //construct erg, factor
     
    8585  poly factor=pOne();
    8686
    87   pSetExp(factor,vn,n);
    88   erg=ppMult_mm(p11,factor);
    89   erg=pAdd(erg,pCopy(p00));
     87  p_SetExp(factor,vn,n,r);
     88  erg=pp_Mult_mm(p11,factor,r);
     89  erg=p_Add_q(erg,p_Copy(p00,r),r);
    9090
    9191 
     
    9696    //if(true){
    9797    //eat up f0,f1,g0,g1
    98     poly s1=pAdd(f0,f1);
    99     poly s2=pAdd(g0,g1);
    100     poly pbig=rec(s1,s2);
    101     pDelete(&s1);
    102     pDelete(&s2);
     98    poly s1=p_Add_q(f0,f1,r);
     99    poly s2=p_Add_q(g0,g1,r);
     100    poly pbig=rec(s1,s2,r);
     101    p_Delete(&s1,r);
     102    p_Delete(&s2,r);
    103103
    104104 
    105105    //eat up pbig
    106106    poly sum=pbig;
    107     pSetExp(factor,vn,pot);
     107    p_SetExp(factor,vn,pot,r);
    108108 
    109109    //eat up p00
    110     sum=pAdd(sum,pNeg(p00));
     110    sum=p_Add_q(sum,p_Neg(p00,r),r);
    111111 
    112112    //eat up p11
    113     sum=pAdd(sum,pNeg(p11));
    114 
    115  
    116     sum=pMult_mm(sum,factor);
     113    sum=p_Add_q(sum,p_Neg(p11,r),r);
     114
     115 
     116    sum=p_Mult_mm(sum,factor,r);
    117117
    118118
    119119    //eat up sum
    120     erg=pAdd(sum,erg);
     120    erg=p_Add_q(sum,erg,r);
    121121  } else {
    122122    //eat up f0,f1,g0,g1
    123     poly s1=unifastmult(f0,g1);
    124     poly s2=unifastmult(g0,f1);
    125     pSetExp(factor,vn,pot);
    126     poly h=pMult_mm(((s1!=NULL)?s1:s2),factor);
     123    poly s1=rec(f0,g1,r);
     124    poly s2=rec(g0,f1,r);
     125    p_SetExp(factor,vn,pot,r);
     126    poly h=p_Mult_mm(((s1!=NULL)?s1:s2),factor,r);
    127127    pDelete(&f1);
    128128    pDelete(&f0);
    129129    pDelete(&g0);
    130130    pDelete(&g1);
    131     erg=pAdd(erg,h);
    132   }
    133  
    134  
    135   pDelete(&factor);
     131    erg=p_Add_q(erg,h,r);
     132  }
     133 
     134 
     135  p_Delete(&factor,r);
    136136                 
    137137                 
     
    230230  return (a>b)? b:a;
    231231}
    232 poly unifastmult(poly f,poly g){
     232poly unifastmult(poly f,poly g, ring r){
    233233  int vn=1;
    234234  if((f==NULL)||(g==NULL)) return NULL;
    235   int df=pGetExp(f,vn);
    236   int dg=pGetExp(g,vn);
     235  int df=p_GetExp(f,vn,r);
     236  int dg=p_GetExp(g,vn,r);
    237237  if ((df==0)||(dg==0))
    238     return ppMult_qq(f,g);
     238    return pp_Mult_qq(f,g,r);
    239239  if (df*dg<100)
    240     return ppMult_qq(f,g);
     240    return pp_Mult_qq(f,g,r);
    241241  // if (df*dg>10000)
    242242  //  return
    243243  //    do_unifastmult_buckets(f,g);
    244244  //else
    245   return do_unifastmult(f,df,g,dg,vn,unifastmult);
    246 
    247 }
    248 
    249 poly multifastmult(poly f, poly g){
     245  return do_unifastmult(f,df,g,dg,vn,unifastmult,r);
     246
     247}
     248
     249poly multifastmult(poly f, poly g, ring r){
    250250  if((f==NULL)||(g==NULL)) return NULL;
    251251  if (pLength(f)*pLength(g)<100)
    252     return ppMult_qq(f,g);
     252    return pp_Mult_qq(f,g,r);
    253253  //find vn
    254254  //determine df,dg simultaneously
     
    258258  int can_dg=0;
    259259  int can_crit=0;
    260   for(i=1;i<=pVariables;i++){
     260  for(i=1;i<=rVar(r);i++){
    261261    poly p;
    262262    int df=0;
     
    265265    p=f;
    266266    while(p){
    267       df=max(df,pGetExp(p,i));
     267      df=max(df,p_GetExp(p,i,r));
    268268      p=pNext(p);
    269269    }
     
    271271      p=g;
    272272      while(p){
    273         dg=max(dg,pGetExp(p,i));
     273        dg=max(dg,p_GetExp(p,i,r));
    274274        p=pNext(p);
    275275      }
     
    284284  }
    285285  if(can_crit==0)
    286     return ppMult_qq(f,g);
     286    return pp_Mult_qq(f,g,r);
    287287  else
    288     return do_unifastmult(f,can_df,g,can_dg,can_i,multifastmult);
    289 }
     288    {
     289      poly erg=do_unifastmult(f,can_df,g,can_dg,can_i,multifastmult,r);
     290      p_Normalize(erg,r);
     291      return(erg);
     292    }
     293}
  • kernel/fast_mult.h

    r2664d0f r78030c  
    33#include "mod2.h"
    44#include "polys.h"
    5 poly unifastmult(poly f,poly g);
    6 poly multifastmult(poly f, poly g);
     5poly unifastmult(poly f,poly g, ring r);
     6poly multifastmult(poly f, poly g, ring r);
    77#endif
Note: See TracChangeset for help on using the changeset viewer.