| version 1.1, 1999/12/03 07:39:08 | 
version 1.6, 2001/10/09 01:36:14 | 
 | 
 | 
|  /* $OpenXM: OpenXM/src/asir99/engine/up_lm.c,v 1.2 1999/11/18 05:42:02 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/engine/up_lm.c,v 1.5 2001/09/03 07:01:06 noro Exp $ | 
|   | 
 */ | 
|  #include "ca.h" | 
 #include "ca.h" | 
|  #include <math.h> | 
 #include <math.h> | 
|   | 
  | 
| Line 6  extern GC_dont_gc; | 
 
  | 
| Line 54  extern GC_dont_gc; | 
 
 
 | 
|  extern struct oEGT eg_chrem,eg_fore,eg_back; | 
 extern struct oEGT eg_chrem,eg_fore,eg_back; | 
|  extern int debug_up; | 
 extern int debug_up; | 
|  extern int up_lazy; | 
 extern int up_lazy; | 
|   | 
 extern int current_ff; | 
|   | 
  | 
|  void crup_lm(ModNum **,int,int *,int,N,N,UP *); | 
 void fft_mulup_lm(UP n1,UP n2,UP *nr) | 
|   | 
  | 
|  void fft_mulup_lm(n1,n2,nr) | 
  | 
|  UP n1,n2; | 
  | 
|  UP *nr; | 
  | 
|  { | 
 { | 
|          ModNum *f1,*f2,*w,*fr; | 
         ModNum *f1,*f2,*w,*fr; | 
|          ModNum *frarray[1024]; | 
         ModNum *frarray[1024]; | 
 | 
 | 
|          error("fft_mulup : FFT_primes exhausted"); | 
         error("fft_mulup : FFT_primes exhausted"); | 
|  } | 
 } | 
|   | 
  | 
|  void fft_squareup_lm(n1,nr) | 
 void fft_squareup_lm(UP n1,UP *nr) | 
|  UP n1; | 
  | 
|  UP *nr; | 
  | 
|  { | 
 { | 
|          ModNum *f1,*w,*fr; | 
         ModNum *f1,*w,*fr; | 
|          ModNum *frarray[1024]; | 
         ModNum *frarray[1024]; | 
 | 
 | 
|          error("fft_squareup : FFT_primes exhausted"); | 
         error("fft_squareup : FFT_primes exhausted"); | 
|  } | 
 } | 
|   | 
  | 
|  void trunc_fft_mulup_lm(n1,n2,dbd,nr) | 
 void trunc_fft_mulup_lm(UP n1,UP n2,int dbd,UP *nr) | 
|  UP n1,n2; | 
  | 
|  int dbd; | 
  | 
|  UP *nr; | 
  | 
|  { | 
 { | 
|          ModNum *f1,*f2,*fr,*w; | 
         ModNum *f1,*f2,*fr,*w; | 
|          ModNum *frarray[1024]; | 
         ModNum *frarray[1024]; | 
 | 
 | 
|          error("trunc_fft_mulup : FFT_primes exhausted"); | 
         error("trunc_fft_mulup : FFT_primes exhausted"); | 
|  } | 
 } | 
|   | 
  | 
|  void crup_lm(f,d,mod,index,m,lm_mod,r) | 
 void crup_lm(ModNum **f,int d,int *mod,int index,N m,N lm_mod,UP *r) | 
|  ModNum **f; | 
  | 
|  int d; | 
  | 
|  int *mod; | 
  | 
|  int index; | 
  | 
|  N m; | 
  | 
|  N lm_mod; | 
  | 
|  UP *r; | 
  | 
|  { | 
 { | 
|          double *k; | 
         double *k; | 
|          double c2; | 
         double c2; | 
 | 
 | 
|          unsigned int **sum; | 
         unsigned int **sum; | 
|          unsigned int *sum_b; | 
         unsigned int *sum_b; | 
|          Q q; | 
         Q q; | 
|          struct oEGT eg0,eg1; | 
  | 
|   | 
  | 
|          if ( !lm_mod ) | 
         if ( !lm_mod ) | 
|                  error("crup_lm : current_mod_lm is not set"); | 
                 error("crup_lm : current_mod_lm is not set"); | 
 | 
 | 
|          addup(s,s1,r); | 
         addup(s,s1,r); | 
|  } | 
 } | 
|   | 
  | 
|  void fft_rembymulup_special_lm(n1,n2,inv2,nr) | 
 void fft_rembymulup_special_lm(UP n1,UP n2,UP inv2,UP *nr) | 
|  UP n1,n2,inv2; | 
  | 
|  UP *nr; | 
  | 
|  { | 
 { | 
|          int d1,d2,d; | 
         int d1,d2,d; | 
|          UP r1,t,s,q,u; | 
         UP r1,t,s,q,u; | 
 | 
 | 
|          } | 
         } | 
|  } | 
 } | 
|   | 
  | 
|  void uptolmup(n,nr) | 
 void uptolmup(UP n,UP *nr) | 
|  UP n; | 
  | 
|  UP *nr; | 
  | 
|  { | 
 { | 
|          int i,d; | 
         int i,d; | 
|          Q *c; | 
         Q *c; | 
 | 
 | 
|          } | 
         } | 
|  } | 
 } | 
|   | 
  | 
|  save_up(obj,name) | 
 void save_up(UP obj,char *name) | 
|  UP obj; | 
  | 
|  char *name; | 
  | 
|  { | 
 { | 
|          P p; | 
         P p; | 
|          Obj ret; | 
         Obj ret; | 
|          NODE n0,n1; | 
         NODE n0,n1; | 
|          STRING s; | 
         STRING s; | 
|   | 
         void Pbsave(); | 
|   | 
  | 
|          uptop(obj,&p); | 
         uptop(obj,&p); | 
|          MKSTR(s,name); | 
         MKSTR(s,name); | 
 | 
 | 
|          Pbsave(n0,&ret); | 
         Pbsave(n0,&ret); | 
|  } | 
 } | 
|   | 
  | 
|  void hybrid_powermodup(f,xp) | 
 void hybrid_powermodup(UP f,UP *xp) | 
|  UP f; | 
  | 
|  UP *xp; | 
  | 
|  { | 
 { | 
|          N n; | 
         N n; | 
|          UP x,y,t,invf,s; | 
         UP x,y,t,invf,s; | 
|          int k; | 
         int k; | 
|          LM lm; | 
         LM lm; | 
|          struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; | 
  | 
|          char name[BUFSIZ]; | 
  | 
|   | 
  | 
|          getmod_lm(&n); | 
         getmod_lm(&n); | 
|          if ( !n ) | 
         if ( !n ) | 
 | 
 | 
|          *xp = y; | 
         *xp = y; | 
|  } | 
 } | 
|   | 
  | 
|  void powermodup(f,xp) | 
 void powermodup(UP f,UP *xp) | 
|  UP f; | 
  | 
|  UP *xp; | 
  | 
|  { | 
 { | 
|          N n; | 
         N n; | 
|          UP x,y,t,invf,s; | 
         UP x,y,t,invf,s; | 
|          int k; | 
         int k; | 
|          LM lm; | 
         Num c; | 
|          struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; | 
  | 
|   | 
  | 
|   | 
         if ( !current_ff ) | 
|   | 
                 error("powermodup : current_ff is not set"); | 
|          field_order_ff(&n); | 
         field_order_ff(&n); | 
|          if ( !n ) | 
         one_ff(&c); | 
|                  error("powermodup : current_mod_lm is not set"); | 
         x = UPALLOC(1); x->d = 1; x->c[1] = c; | 
|          MKLM(ONEN,lm); | 
         y = UPALLOC(0); y->d = 0; y->c[0] = c; | 
|          x = UPALLOC(1); x->d = 1; x->c[1] = (Num)lm; | 
  | 
|          y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm; | 
  | 
|   | 
  | 
|          reverseup(f,f->d,&t); | 
         reverseup(f,f->d,&t); | 
|          invmodup(t,f->d,&s); uptolmup(s,&invf); | 
         invmodup(t,f->d,&s); | 
|   | 
         switch ( current_ff ) { | 
|   | 
                 case FF_GFP: | 
|   | 
                 case FF_GFPN: | 
|   | 
                         uptolmup(s,&invf); | 
|   | 
                         break; | 
|   | 
                 case FF_GFS: | 
|   | 
                 case FF_GFSN: | 
|   | 
                         invf = s; /* XXX */ | 
|   | 
                         break; | 
|   | 
                 default: | 
|   | 
                         error("powermodup : not implemented yet"); | 
|   | 
         } | 
|          for ( k = n_bits(n)-1; k >= 0; k-- ) { | 
         for ( k = n_bits(n)-1; k >= 0; k-- ) { | 
|                  ksquareup(y,&t); | 
                 ksquareup(y,&t); | 
|                  rembymulup_special(t,f,invf,&s); | 
                 rembymulup_special(t,f,invf,&s); | 
 | 
 | 
|   | 
  | 
|  /* g^d mod f */ | 
 /* g^d mod f */ | 
|   | 
  | 
|  void hybrid_generic_powermodup(g,f,d,xp) | 
 void hybrid_generic_powermodup(UP g,UP f,Q d,UP *xp) | 
|  UP g,f; | 
  | 
|  Q d; | 
  | 
|  UP *xp; | 
  | 
|  { | 
 { | 
|          N e; | 
         N e; | 
|          UP x,y,t,invf,s; | 
         UP x,y,t,invf,s; | 
|          int k; | 
         int k; | 
|          LM lm; | 
         LM lm; | 
|          struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; | 
  | 
|   | 
  | 
|          e = NM(d); | 
         e = NM(d); | 
|          MKLM(ONEN,lm); | 
         MKLM(ONEN,lm); | 
 | 
 | 
|          *xp = y; | 
         *xp = y; | 
|  } | 
 } | 
|   | 
  | 
|  void generic_powermodup(g,f,d,xp) | 
 void generic_powermodup(UP g,UP f,Q d,UP *xp) | 
|  UP g,f; | 
  | 
|  Q d; | 
  | 
|  UP *xp; | 
  | 
|  { | 
 { | 
|          N e; | 
         N e; | 
|          UP x,y,t,invf,s; | 
         UP x,y,t,invf,s; | 
|          int k; | 
         int k; | 
|          LM lm; | 
         Num c; | 
|          struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; | 
  | 
|   | 
  | 
|          e = NM(d); | 
         e = NM(d); | 
|          MKLM(ONEN,lm); | 
         one_ff(&c); | 
|          y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm; | 
         y = UPALLOC(0); y->d = 0; y->c[0] = c; | 
|          remup(g,f,&x); | 
         remup(g,f,&x); | 
|          if ( !x ) { | 
         if ( !x ) { | 
|                  *xp = !d ? y : 0; | 
                 *xp = !d ? y : 0; | 
 | 
 | 
|          *xp = y; | 
         *xp = y; | 
|  } | 
 } | 
|   | 
  | 
|  void hybrid_powertabup(f,xp,tab) | 
 void hybrid_powertabup(UP f,UP xp,UP *tab) | 
|  UP f; | 
  | 
|  UP xp; | 
  | 
|  UP *tab; | 
  | 
|  { | 
 { | 
|          UP y,t,invf; | 
         UP y,t,invf; | 
|          int i,d; | 
         int i,d; | 
|          LM lm; | 
         LM lm; | 
|          struct oEGT eg_rem,eg_mul,eg0,eg1,eg2; | 
  | 
|   | 
  | 
|          d = f->d; | 
         d = f->d; | 
|          MKLM(ONEN,lm); | 
         MKLM(ONEN,lm); | 
 | 
 | 
|          } | 
         } | 
|  } | 
 } | 
|   | 
  | 
|  void powertabup(f,xp,tab) | 
 void powertabup(UP f,UP xp,UP *tab) | 
|  UP f; | 
  | 
|  UP xp; | 
  | 
|  UP *tab; | 
  | 
|  { | 
 { | 
|          UP y,t,invf; | 
         UP y,t,invf; | 
|          int i,d; | 
         int i,d; | 
|          LM lm; | 
         Num c; | 
|          struct oEGT eg_rem,eg_mul,eg0,eg1,eg2; | 
  | 
|   | 
  | 
|          d = f->d; | 
         d = f->d; | 
|          MKLM(ONEN,lm); | 
         one_ff(&c); | 
|          y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm; | 
         y = UPALLOC(0); y->d = 0; y->c[0] = c; | 
|          tab[0] = y; | 
         tab[0] = y; | 
|          tab[1] = xp; | 
         tab[1] = xp; | 
|   | 
  |