[BACK]Return to poly.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Diff for /OpenXM_contrib2/asir2000/builtin/poly.c between version 1.1.1.1 and 1.10

version 1.1.1.1, 1999/12/03 07:39:07 version 1.10, 2001/05/09 01:41:41
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/asir99/builtin/poly.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */  /*
    * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
    * All rights reserved.
    *
    * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
    * non-exclusive and royalty-free license to use, copy, modify and
    * redistribute, solely for non-commercial and non-profit purposes, the
    * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
    * conditions of this Agreement. For the avoidance of doubt, you acquire
    * only a limited right to use the SOFTWARE hereunder, and FLL or any
    * third party developer retains all rights, including but not limited to
    * copyrights, in and to the SOFTWARE.
    *
    * (1) FLL does not grant you a license in any way for commercial
    * purposes. You may use the SOFTWARE only for non-commercial and
    * non-profit purposes only, such as academic, research and internal
    * business use.
    * (2) The SOFTWARE is protected by the Copyright Law of Japan and
    * international copyright treaties. If you make copies of the SOFTWARE,
    * with or without modification, as permitted hereunder, you shall affix
    * to all such copies of the SOFTWARE the above copyright notice.
    * (3) An explicit reference to this SOFTWARE and its copyright owner
    * shall be made on your publication or presentation in any form of the
    * results obtained by use of the SOFTWARE.
    * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
    * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
    * for such modification or the source code of the modified part of the
    * SOFTWARE.
    *
    * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
    * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
    * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
    * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
    * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
    * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
    * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
    * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
    * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
    * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
    * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
    * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
    * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
    * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
    * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
    * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
    * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
    *
    * $OpenXM: OpenXM_contrib2/asir2000/builtin/poly.c,v 1.9 2001/05/02 09:03:52 noro Exp $
   */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
 #include "base.h"  #include "base.h"
Line 11  void Pord(), Pcoef0(), Pcoef(), Pdeg(), Pmindeg(), Pse
Line 59  void Pord(), Pcoef0(), Pcoef(), Pdeg(), Pmindeg(), Pse
 void Pcoef_gf2n();  void Pcoef_gf2n();
 void getcoef(), getdeglist(), mergedeglist(), change_mvar(), restore_mvar();  void getcoef(), getdeglist(), mergedeglist(), change_mvar(), restore_mvar();
   
 void Pp_mag();  void Pp_mag(),Pmaxblen();
 void Pmergelist(), Pch_mv(), Pre_mv(), Pdeglist();  void Pmergelist(), Pch_mv(), Pre_mv(), Pdeglist();
 void Pptomp(),Pmptop();  void Pptomp(),Pmptop();
 void Pptolmp(),Plmptop();  void Pptolmp(),Plmptop();
   void Psfptop();
 void Pptogf2n(),Pgf2ntop(),Pgf2ntovect();  void Pptogf2n(),Pgf2ntop(),Pgf2ntovect();
 void Pptogfpn(),Pgfpntop();  void Pptogfpn(),Pgfpntop();
 void Pfind_root_gf2n();  void Pfind_root_gf2n();
   void Pumul_specialmod(),Pusquare_specialmod(),Putmul_specialmod();
   
 void Pureverse(),Putrunc(),Pudecomp(),Purembymul(),Purembymul_precomp();  void Pureverse(),Putrunc(),Pudecomp(),Purembymul(),Purembymul_precomp();
 void Puinvmod(),Purevinvmod();  void Puinvmod(),Purevinvmod();
Line 48  void Pbininv_gf2n();
Line 98  void Pbininv_gf2n();
 void Prinvtest_gf2n();  void Prinvtest_gf2n();
 void Pis_irred_gf2();  void Pis_irred_gf2();
 void Pis_irred_ddd_gf2();  void Pis_irred_ddd_gf2();
   void Pget_next_fft_prime();
   void Puadj_coef();
   void Preorder();
   void Phomogeneous_part();
   void Phomogeneous_deg();
 void simp_ff(Obj,Obj *);  void simp_ff(Obj,Obj *);
 void ranp(int,UP *);  void ranp(int,UP *);
 void field_order_ff(N *);  void field_order_ff(N *);
Line 60  extern int lm_lazy;
Line 114  extern int lm_lazy;
 int current_ff;  int current_ff;
   
 struct ftab poly_tab[] = {  struct ftab poly_tab[] = {
           {"homogeneous_deg",Phomogeneous_deg,-2},
           {"homogeneous_part",Phomogeneous_part,-3},
           {"reorder",Preorder,3},
           {"uadj_coef",Puadj_coef,3},
         {"ranp",Pranp,2},          {"ranp",Pranp,2},
         {"p_mag",Pp_mag,1},          {"p_mag",Pp_mag,1},
           {"maxblen",Pmaxblen,1},
         {"ord",Pord,-1},          {"ord",Pord,-1},
         {"coef0",Pcoef0,-3},          {"coef0",Pcoef0,-3},
         {"coef",Pcoef,-3},          {"coef",Pcoef,-3},
Line 91  struct ftab poly_tab[] = {
Line 150  struct ftab poly_tab[] = {
         {"ptolmp",Pptolmp,1},          {"ptolmp",Pptolmp,1},
         {"lmptop",Plmptop,1},          {"lmptop",Plmptop,1},
   
           {"sfptop",Psfptop,1},
   
         {"ptogf2n",Pptogf2n,1},          {"ptogf2n",Pptogf2n,1},
         {"gf2ntop",Pgf2ntop,-2},          {"gf2ntop",Pgf2ntop,-2},
         {"gf2ntovect",Pgf2ntovect,1},          {"gf2ntovect",Pgf2ntovect,1},
Line 107  struct ftab poly_tab[] = {
Line 168  struct ftab poly_tab[] = {
         {"ureverse_inv_as_power_series",Purevinvmod,2},          {"ureverse_inv_as_power_series",Purevinvmod,2},
         {"uinv_as_power_series",Puinvmod,2},          {"uinv_as_power_series",Puinvmod,2},
   
           {"umul_specialmod",Pumul_specialmod,3},
           {"usquare_specialmod",Pusquare_specialmod,2},
           {"utmul_specialmod",Putmul_specialmod,4},
   
         {"utmul",Putmul,3},          {"utmul",Putmul,3},
         {"umul_ff",Pumul_ff,2},          {"umul_ff",Pumul_ff,2},
         {"usquare_ff",Pusquare_ff,1},          {"usquare_ff",Pusquare_ff,1},
Line 118  struct ftab poly_tab[] = {
Line 183  struct ftab poly_tab[] = {
   
         {"utrunc",Putrunc,2},          {"utrunc",Putrunc,2},
         {"udecomp",Pudecomp,2},          {"udecomp",Pudecomp,2},
         {"ureverse",Pureverse,1},          {"ureverse",Pureverse,-2},
         {"urembymul",Purembymul,2},          {"urembymul",Purembymul,2},
         {"urembymul_precomp",Purembymul_precomp,3},          {"urembymul_precomp",Purembymul_precomp,3},
   
Line 150  struct ftab poly_tab[] = {
Line 215  struct ftab poly_tab[] = {
         {"bininv_gf2n",Pbininv_gf2n,2},          {"bininv_gf2n",Pbininv_gf2n,2},
         {"invtest_gf2n",Pinvtest_gf2n,1},          {"invtest_gf2n",Pinvtest_gf2n,1},
         {"rinvtest_gf2n",Prinvtest_gf2n,0},          {"rinvtest_gf2n",Prinvtest_gf2n,0},
           {"get_next_fft_prime",Pget_next_fft_prime,2},
         {0,0,0},          {0,0,0},
 };  };
   
 extern V up_var;  extern V up_var;
   
   void Phomogeneous_part(arg,rp)
   NODE arg;
   P *rp;
   {
           if ( argc(arg) == 2 )
                   exthp(CO,(P)ARG0(arg),QTOS((Q)ARG1(arg)),rp);
           else
                   exthpc_generic(CO,(P)ARG0(arg),QTOS((Q)ARG2(arg)),
                           VR((P)ARG1(arg)),rp);
   }
   
   void Phomogeneous_deg(arg,rp)
   NODE arg;
   Q *rp;
   {
           int d;
   
           if ( argc(arg) == 1 )
                   d = homdeg((P)ARG0(arg));
           else
                   d = getchomdeg(VR((P)ARG1(arg)),(P)ARG0(arg));
           STOQ(d,*rp);
   }
   
   /*
           p1 = reorder(p,ovl,nvl) => p1 is 'sorted accoding to nvl.
   */
   
   void Preorder(arg,rp)
   NODE arg;
   P *rp;
   {
           VL ovl,nvl,tvl;
           NODE n;
   
           for ( ovl = 0, n = BDY((LIST)ARG1(arg)); n; n = NEXT(n) ) {
                   if ( !ovl ) {
                           NEWVL(ovl); tvl = ovl;
                   } else {
                           NEWVL(NEXT(tvl)); tvl = NEXT(tvl);
                   }
                           VR(tvl) = VR((P)BDY(n));
           }
           for ( nvl = 0, n = BDY((LIST)ARG2(arg)); n; n = NEXT(n) ) {
                   if ( !nvl ) {
                           NEWVL(nvl); tvl = nvl;
                   } else {
                           NEWVL(NEXT(tvl)); tvl = NEXT(tvl);
                   }
                           VR(tvl) = VR((P)BDY(n));
           }
           reorderp(nvl,ovl,(P)ARG0(arg),rp);
   }
   
   /*
           uadj_coef(F,M,M2)
           if ( F is a non-negative integer )
                   return F > M2 ? F-M : M2;
           else
                   F = CN*V^N+...+C0
                   return uadj_coef(CN,M,M2)*V^N+...+uadj_coef(C0,M,M2);
   */
   
   void Puadj_coef(arg,rp)
   NODE arg;
   P *rp;
   {
           UP f,r;
           N m,m2;
   
           ptoup((P)ARG0(arg),&f);
           m = NM((Q)ARG1(arg));
           m2 = NM((Q)ARG2(arg));
           adj_coefup(f,m,m2,&r);
           uptop(r,rp);
   }
   
   /*
           get_next_fft_prime(StartIndex,Bits)
           tries to find smallest Index >= StartIndex s.t.
                   2^(Bits-1)|FFTprime[Index]-1
           return [Index,Mod] or 0 (not exist)
   */
   
   void Pget_next_fft_prime(arg,rp)
   NODE arg;
   LIST *rp;
   {
           unsigned int mod,d;
           int start,bits,i;
           NODE n;
           Q q,ind;
   
           start = QTOS((Q)ARG0(arg));
           bits = QTOS((Q)ARG1(arg));
           for ( i = start; ; i++ ) {
                   get_fft_prime(i,&mod,&d);
                   if ( !mod ) {
                           *rp = 0; return;
                   }
                   if ( bits <= d ) {
                           UTOQ(mod,q);
                           UTOQ(i,ind);
                           n = mknode(2,ind,q);
                           MKLIST(*rp,n);
                           return;
                   }
           }
   }
   
 void Pranp(arg,rp)  void Pranp(arg,rp)
 NODE arg;  NODE arg;
 P *rp;  P *rp;
Line 193  UP *nr;
Line 369  UP *nr;
                 *nr = 0;                  *nr = 0;
 }  }
   
   void Pmaxblen(arg,rp)
   NODE arg;
   Q *rp;
   {
           int l;
           l = maxblenp(ARG0(arg));
           STOQ(l,*rp);
   }
   
 void Pp_mag(arg,rp)  void Pp_mag(arg,rp)
 NODE arg;  NODE arg;
 Q *rp;  Q *rp;
Line 541  Q *rp;
Line 726  Q *rp;
         STOQ(ret,*rp);          STOQ(ret,*rp);
 }  }
   
   extern P current_gfs_ext;
   extern int current_gfs_p;
   extern int current_gfs_q;
   extern int current_gfs_q1;
   extern int *current_gfs_plus1;
   extern int *current_gfs_ntoi;
   extern int *current_gfs_iton;
   
 void Psetmod_ff(arg,rp)  void Psetmod_ff(arg,rp)
 NODE arg;  NODE arg;
 Obj *rp;  Obj *rp;
 {  {
         int ac;          int ac;
           int d;
         Obj mod,defpoly;          Obj mod,defpoly;
         N n;          N n;
         UP up;          UP up;
         UP2 up2;          UP2 up2;
         Q q;          Q q,r;
         P p;          P p;
         NODE n0,n1;          NODE n0,n1;
         LIST list;          LIST list;
Line 563  Obj *rp;
Line 757  Obj *rp;
                 switch ( OID(mod) ) {                  switch ( OID(mod) ) {
                         case O_N:                          case O_N:
                                 current_ff = FF_GFP;                                  current_ff = FF_GFP;
                                 setmod_lm(NM((Q)mod)); break;                                  setmod_lm(NM((Q)mod));
                                   break;
                         case O_P:                          case O_P:
                                 current_ff = FF_GF2N;                                  current_ff = FF_GF2N;
                                 setmod_gf2n((P)mod); break;                                  setmod_gf2n((P)mod); break;
Line 571  Obj *rp;
Line 766  Obj *rp;
                                 error("setmod_ff : invalid argument");                                  error("setmod_ff : invalid argument");
                 }                  }
         } else if ( ac == 2 ) {          } else if ( ac == 2 ) {
                 current_ff = FF_GFPN;                  if ( OID(ARG0(arg)) == O_N ) {
                 defpoly = (Obj)ARG0(arg);                          /* small finite field; primitive root representation */
                 mod = (Obj)ARG1(arg);                          current_ff = FF_GFS;
                 if ( !mod || !defpoly )                          setmod_sf(QTOS((Q)ARG0(arg)),QTOS((Q)ARG1(arg)));
                         error("setmod_ff : invalid argument");                  } else {
                 setmod_lm(NM((Q)mod));                          mod = (Obj)ARG1(arg);
                 setmod_gfpn((P)defpoly);                          current_ff = FF_GFPN;
                           defpoly = (Obj)ARG0(arg);
                           if ( !mod || !defpoly )
                                   error("setmod_ff : invalid argument");
                           setmod_lm(NM((Q)mod));
                           setmod_gfpn((P)defpoly);
                   }
         }          }
         switch ( current_ff ) {          switch ( current_ff ) {
                 case FF_GFP:                  case FF_GFP:
Line 590  Obj *rp;
Line 791  Obj *rp;
                         MKNODE(n1,q,0); MKNODE(n0,p,n1);                          MKNODE(n1,q,0); MKNODE(n0,p,n1);
                         MKLIST(list,n0);                          MKLIST(list,n0);
                         *rp = (Obj)list; break;                          *rp = (Obj)list; break;
                   case FF_GFS:
                           STOQ(current_gfs_p,q);
                           if ( current_gfs_ext ) {
                                   enc_to_p(current_gfs_p,current_gfs_iton[1],
                                           VR(current_gfs_ext),&p);
                                   n0 = mknode(3,q,current_gfs_ext,p);
                           } else {
                                   STOQ(current_gfs_iton[1],r);
                                   n0 = mknode(3,q,current_gfs_ext,r);
                           }
                           MKLIST(list,n0);
                           *rp = (Obj)list; break;
                 default:                  default:
                         *rp = 0; break;                          *rp = 0; break;
         }          }
Line 609  Q *rp;
Line 822  Q *rp;
                         getmod_gf2n(&up2); d = degup2(up2); STOQ(d,*rp); break;                          getmod_gf2n(&up2); d = degup2(up2); STOQ(d,*rp); break;
                 case FF_GFPN:                  case FF_GFPN:
                         getmod_gfpn(&up); STOQ(up->d,*rp); break;                          getmod_gfpn(&up); STOQ(up->d,*rp); break;
                   case FF_GFS:
                           if ( !current_gfs_ext )
                                   *rp = ONE;
                           else
                                   *rp = DEG(DC(current_gfs_ext));
                           break;
                 default:                  default:
                         error("extdeg_ff : current_ff is not set");                          error("extdeg_ff : current_ff is not set");
         }          }
Line 625  Q *rp;
Line 844  Q *rp;
                         getmod_lm(&lm); NTOQ(lm,1,*rp); break;                          getmod_lm(&lm); NTOQ(lm,1,*rp); break;
                 case FF_GF2N:                  case FF_GF2N:
                         STOQ(2,*rp); break;                          STOQ(2,*rp); break;
                   case FF_GFS:
                           STOQ(current_gfs_p,*rp); break;
                 default:                  default:
                         error("characteristic_ff : current_ff is not set");                          error("characteristic_ff : current_ff is not set");
         }          }
Line 667  N *order;
Line 888  N *order;
                 case FF_GFPN:                  case FF_GFPN:
                         getmod_lm(&m);                          getmod_lm(&m);
                         getmod_gfpn(&up); pwrn(m,up->d,order); break;                          getmod_gfpn(&up); pwrn(m,up->d,order); break;
                   case FF_GFS:
                           STON(current_gfs_q,*order); break;
                 default:                  default:
                         error("field_order_ff : current_ff is not set");                          error("field_order_ff : current_ff is not set");
         }          }
Line 678  Obj *rp;
Line 901  Obj *rp;
         LM l;          LM l;
         GF2N g;          GF2N g;
         GFPN p;          GFPN p;
           GFS s;
   
         switch ( current_ff ) {          switch ( current_ff ) {
                 case FF_GFP:                  case FF_GFP:
Line 686  Obj *rp;
Line 910  Obj *rp;
                         randomgf2n(&g); *rp = (Obj)g; break;                          randomgf2n(&g); *rp = (Obj)g; break;
                 case FF_GFPN:                  case FF_GFPN:
                         randomgfpn(&p); *rp = (Obj)p; break;                          randomgfpn(&p); *rp = (Obj)p; break;
                   case FF_GFS:
                           randomgfs(&s); *rp = (Obj)s; break;
                 default:                  default:
                         error("random_ff : current_ff is not set");                          error("random_ff : current_ff is not set");
         }          }
Line 711  Obj *rp;
Line 937  Obj *rp;
         DCP dc,dcr0,dcr;          DCP dc,dcr0,dcr;
         GF2N rg,sg;          GF2N rg,sg;
         GFPN rpn,spn;          GFPN rpn,spn;
           GFS rs;
         P t;          P t;
         Obj obj;          Obj obj;
   
Line 728  Obj *rp;
Line 955  Obj *rp;
                         case FF_GFPN:                          case FF_GFPN:
                                 ntogfpn((Obj)p,&rpn); simpgfpn((GFPN)rpn,&spn); *rp = (Obj)spn;                                  ntogfpn((Obj)p,&rpn); simpgfpn((GFPN)rpn,&spn); *rp = (Obj)spn;
                                 break;                                  break;
                           case FF_GFS:
                                   if ( NID((Num)p) == N_GFS )
                                           *rp = p;
                                   else {
                                           ptomp(current_gfs_p,(P)p,&t); mqtogfs(t,&rs);
                                           *rp = (Obj)rs;
                                   }
                                   break;
                         default:                          default:
                                 *rp = (Obj)p;                                  *rp = (Obj)p;
                                 break;                                  break;
Line 941  P *rp;
Line 1176  P *rp;
         lmptop((P)ARG0(arg),rp);          lmptop((P)ARG0(arg),rp);
 }  }
   
   void Psfptop(arg,rp)
   NODE arg;
   P *rp;
   {
           sfptop((P)ARG0(arg),rp);
   }
   
 void Pptogf2n(arg,rp)  void Pptogf2n(arg,rp)
 NODE arg;  NODE arg;
 GF2N *rp;  GF2N *rp;
Line 991  P *rp;
Line 1233  P *rp;
         UP p,r;          UP p,r;
   
         ptoup((P)ARG0(arg),&p);          ptoup((P)ARG0(arg),&p);
         reverseup(p,p->d,&r);          if ( argc(arg) == 1 )
                   reverseup(p,p->d,&r);
           else
                   reverseup(p,QTOS((Q)ARG1(arg)),&r);
         uptop(r,rp);          uptop(r,rp);
 }  }
   
Line 1102  P *rp;
Line 1347  P *rp;
                 case FF_GF2N:                  case FF_GF2N:
                         powermodup_gf2n(p1,&p2); break;                          powermodup_gf2n(p1,&p2); break;
                 case FF_GFPN:                  case FF_GFPN:
                   case FF_GFS:
                         powermodup(p1,&p2); break;                          powermodup(p1,&p2); break;
                 default:                  default:
                         error("pwrmod_ff : current_ff is not set");                          error("pwrmod_ff : current_ff is not set");
Line 1123  P *rp;
Line 1369  P *rp;
                 case FF_GF2N:                  case FF_GF2N:
                         generic_powermodup_gf2n(g,f,(Q)ARG2(arg),&r); break;                          generic_powermodup_gf2n(g,f,(Q)ARG2(arg),&r); break;
                 case FF_GFPN:                  case FF_GFPN:
                   case FF_GFS:
                         generic_powermodup(g,f,(Q)ARG2(arg),&r); break;                          generic_powermodup(g,f,(Q)ARG2(arg),&r); break;
                 default:                  default:
                         error("generic_pwrmod_ff : current_ff is not set");                          error("generic_pwrmod_ff : current_ff is not set");
Line 1150  VECT *rp;
Line 1397  VECT *rp;
                 case FF_GF2N:                  case FF_GF2N:
                         powertabup_gf2n(f,xp,tab); break;                          powertabup_gf2n(f,xp,tab); break;
                 case FF_GFPN:                  case FF_GFPN:
                   case FF_GFS:
                         powertabup(f,xp,tab); break;                          powertabup(f,xp,tab); break;
                 default:                  default:
                         error("pwrtab_ff : current_ff is not set");                          error("pwrtab_ff : current_ff is not set");
Line 1465  P *rp;
Line 1713  P *rp;
         ptoup((P)ARG1(arg),&f);          ptoup((P)ARG1(arg),&f);
         tracemodup_gf2n(g,f,(Q)ARG2(arg),&r);          tracemodup_gf2n(g,f,(Q)ARG2(arg),&r);
         uptop(r,rp);          uptop(r,rp);
   }
   
   void Pumul_specialmod(arg,rp)
   NODE arg;
   P *rp;
   {
           P a1,a2;
           UP p1,p2,r;
           int i,nmod;
           int *modind;
           NODE t,n;
   
           a1 = (P)ARG0(arg); a2 = (P)ARG1(arg);
           if ( !a1 || !a2 || NUM(a1) || NUM(a2) )
                   mulp(CO,a1,a2,rp);
           else {
                   if ( !uzpcheck(a1) || !uzpcheck(a2) || VR(a1) != VR(a2) )
                           error("umul_specialmod : invalid argument");
                   ptoup(a1,&p1);
                   ptoup(a2,&p2);
                   n = BDY((LIST)ARG2(arg));
                   nmod = length(n);
                   modind = (int *)MALLOC_ATOMIC(nmod*sizeof(int));
                   for ( i = 0, t = n; i < nmod; i++, t = NEXT(t) )
                           modind[i] = QTOS((Q)BDY(t));
                   fft_mulup_specialmod_main(p1,p2,0,modind,nmod,&r);
                   uptop(r,rp);
           }
   }
   
   void Pusquare_specialmod(arg,rp)
   NODE arg;
   P *rp;
   {
           P a1;
           UP p1,r;
           int i,nmod;
           int *modind;
           NODE t,n;
   
           a1 = (P)ARG0(arg);
           if ( !a1 || NUM(a1) )
                   mulp(CO,a1,a1,rp);
           else {
                   if ( !uzpcheck(a1) )
                           error("usquare_specialmod : invalid argument");
                   ptoup(a1,&p1);
                   n = BDY((LIST)ARG1(arg));
                   nmod = length(n);
                   modind = (int *)MALLOC_ATOMIC(nmod*sizeof(int));
                   for ( i = 0, t = n; i < nmod; i++, t = NEXT(t) )
                           modind[i] = QTOS((Q)BDY(t));
                   fft_mulup_specialmod_main(p1,p1,0,modind,nmod,&r);
                   uptop(r,rp);
           }
   }
   
   void Putmul_specialmod(arg,rp)
   NODE arg;
   P *rp;
   {
           P a1,a2;
           UP p1,p2,r;
           int i,nmod;
           int *modind;
           NODE t,n;
   
           a1 = (P)ARG0(arg); a2 = (P)ARG1(arg);
           if ( !a1 || !a2 || NUM(a1) || NUM(a2) )
                   mulp(CO,a1,a2,rp);
           else {
                   if ( !uzpcheck(a1) || !uzpcheck(a2) || VR(a1) != VR(a2) )
                           error("utmul_specialmod : invalid argument");
                   ptoup(a1,&p1);
                   ptoup(a2,&p2);
                   n = BDY((LIST)ARG3(arg));
                   nmod = length(n);
                   modind = (int *)MALLOC_ATOMIC(nmod*sizeof(int));
                   for ( i = 0, t = n; i < nmod; i++, t = NEXT(t) )
                           modind[i] = QTOS((Q)BDY(t));
                   fft_mulup_specialmod_main(p1,p2,QTOS((Q)ARG2(arg))+1,modind,nmod,&r);
                   uptop(r,rp);
           }
 }  }

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.10

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>