=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/up_lm.c,v retrieving revision 1.1.1.1 retrieving revision 1.11 diff -u -p -r1.1.1.1 -r1.11 --- OpenXM_contrib2/asir2000/engine/up_lm.c 1999/12/03 07:39:08 1.1.1.1 +++ OpenXM_contrib2/asir2000/engine/up_lm.c 2015/08/14 13:51:55 1.11 @@ -1,4 +1,52 @@ -/* $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.10 2015/08/08 14:19:41 fujimoto Exp $ +*/ #include "ca.h" #include @@ -6,12 +54,9 @@ extern GC_dont_gc; extern struct oEGT eg_chrem,eg_fore,eg_back; extern int debug_up; extern int up_lazy; +extern int current_ff; -void crup_lm(ModNum **,int,int *,int,N,N,UP *); - -void fft_mulup_lm(n1,n2,nr) -UP n1,n2; -UP *nr; +void fft_mulup_lm(UP n1,UP n2,UP *nr) { ModNum *f1,*f2,*w,*fr; ModNum *frarray[1024]; @@ -60,9 +105,7 @@ UP *nr; error("fft_mulup : FFT_primes exhausted"); } -void fft_squareup_lm(n1,nr) -UP n1; -UP *nr; +void fft_squareup_lm(UP n1,UP *nr) { ModNum *f1,*w,*fr; ModNum *frarray[1024]; @@ -109,10 +152,7 @@ UP *nr; error("fft_squareup : FFT_primes exhausted"); } -void trunc_fft_mulup_lm(n1,n2,dbd,nr) -UP n1,n2; -int dbd; -UP *nr; +void trunc_fft_mulup_lm(UP n1,UP n2,int dbd,UP *nr) { ModNum *f1,*f2,*fr,*w; ModNum *frarray[1024]; @@ -162,14 +202,7 @@ UP *nr; error("trunc_fft_mulup : FFT_primes exhausted"); } -void crup_lm(f,d,mod,index,m,lm_mod,r) -ModNum **f; -int d; -int *mod; -int index; -N m; -N lm_mod; -UP *r; +void crup_lm(ModNum **f,int d,int *mod,int index,N m,N lm_mod,UP *r) { double *k; double c2; @@ -183,7 +216,6 @@ UP *r; unsigned int **sum; unsigned int *sum_b; Q q; - struct oEGT eg0,eg1; if ( !lm_mod ) error("crup_lm : current_mod_lm is not set"); @@ -219,13 +251,13 @@ UP *r; k[j] += c2*f[i][j]; } uiarraytoup(sum,len,d,&s); - GC_free(sum_b); + GCFREE(sum_b); u = UPALLOC(d); for ( j = 0; j <= d; j++ ) { #if 1 a = (UL)floor(k[j]); -#if defined(i386) || defined(__alpha) || defined(VISUAL) +#if defined(i386) || defined(__alpha) || defined(VISUAL) || defined(__MINGW32__) || defined(__x86_64) au = ((unsigned int *)&a)[1]; al = ((unsigned int *)&a)[0]; #else @@ -255,9 +287,7 @@ UP *r; addup(s,s1,r); } -void fft_rembymulup_special_lm(n1,n2,inv2,nr) -UP n1,n2,inv2; -UP *nr; +void fft_rembymulup_special_lm(UP n1,UP n2,UP inv2,UP *nr) { int d1,d2,d; UP r1,t,s,q,u; @@ -280,9 +310,7 @@ UP *nr; } } -void uptolmup(n,nr) -UP n; -UP *nr; +void uptolmup(UP n,UP *nr) { int i,d; Q *c; @@ -304,14 +332,13 @@ UP *nr; } } -save_up(obj,name) -UP obj; -char *name; +void save_up(UP obj,char *name) { P p; Obj ret; NODE n0,n1; STRING s; + void Pbsave(); uptop(obj,&p); MKSTR(s,name); @@ -319,16 +346,12 @@ char *name; Pbsave(n0,&ret); } -void hybrid_powermodup(f,xp) -UP f; -UP *xp; +void hybrid_powermodup(UP f,UP *xp) { N n; UP x,y,t,invf,s; int k; LM lm; - struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; - char name[BUFSIZ]; getmod_lm(&n); if ( !n ) @@ -352,25 +375,34 @@ UP *xp; *xp = y; } -void powermodup(f,xp) -UP f; -UP *xp; +void powermodup(UP f,UP *xp) { N n; UP x,y,t,invf,s; int k; - LM lm; - struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; + Num c; + if ( !current_ff ) + error("powermodup : current_ff is not set"); field_order_ff(&n); - if ( !n ) - error("powermodup : current_mod_lm is not set"); - MKLM(ONEN,lm); - x = UPALLOC(1); x->d = 1; x->c[1] = (Num)lm; - y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm; + one_ff(&c); + x = UPALLOC(1); x->d = 1; x->c[1] = c; + y = UPALLOC(0); y->d = 0; y->c[0] = c; 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-- ) { ksquareup(y,&t); rembymulup_special(t,f,invf,&s); @@ -386,16 +418,12 @@ UP *xp; /* g^d mod f */ -void hybrid_generic_powermodup(g,f,d,xp) -UP g,f; -Q d; -UP *xp; +void hybrid_generic_powermodup(UP g,UP f,Q d,UP *xp) { N e; UP x,y,t,invf,s; int k; LM lm; - struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; e = NM(d); MKLM(ONEN,lm); @@ -423,20 +451,16 @@ UP *xp; *xp = y; } -void generic_powermodup(g,f,d,xp) -UP g,f; -Q d; -UP *xp; +void generic_powermodup(UP g,UP f,Q d,UP *xp) { N e; UP x,y,t,invf,s; int k; - LM lm; - struct oEGT eg_sq,eg_rem,eg_mul,eg_inv,eg0,eg1,eg2,eg3; + Num c; e = NM(d); - MKLM(ONEN,lm); - y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm; + one_ff(&c); + y = UPALLOC(0); y->d = 0; y->c[0] = c; remup(g,f,&x); if ( !x ) { *xp = !d ? y : 0; @@ -460,15 +484,11 @@ UP *xp; *xp = y; } -void hybrid_powertabup(f,xp,tab) -UP f; -UP xp; -UP *tab; +void hybrid_powertabup(UP f,UP xp,UP *tab) { UP y,t,invf; int i,d; LM lm; - struct oEGT eg_rem,eg_mul,eg0,eg1,eg2; d = f->d; MKLM(ONEN,lm); @@ -480,26 +500,23 @@ UP *tab; invmodup(t,f->d,&invf); for ( i = 2; i < d; i++ ) { - if ( debug_up ) - fprintf(stderr,"."); - hybrid_mulup(FF_GFP,tab[i-1],xp,&t); - hybrid_rembymulup_special(FF_GFP,t,f,invf,&tab[i]); + if ( debug_up ){ + fprintf(stderr,"."); + } + hybrid_mulup(FF_GFP,tab[i-1],xp,&t); + hybrid_rembymulup_special(FF_GFP,t,f,invf,&tab[i]); } } -void powertabup(f,xp,tab) -UP f; -UP xp; -UP *tab; +void powertabup(UP f,UP xp,UP *tab) { UP y,t,invf; int i,d; - LM lm; - struct oEGT eg_rem,eg_mul,eg0,eg1,eg2; + Num c; d = f->d; - MKLM(ONEN,lm); - y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm; + one_ff(&c); + y = UPALLOC(0); y->d = 0; y->c[0] = c; tab[0] = y; tab[1] = xp; @@ -507,9 +524,10 @@ UP *tab; invmodup(t,f->d,&invf); for ( i = 2; i < d; i++ ) { - if ( debug_up ) - fprintf(stderr,"."); - kmulup(tab[i-1],xp,&t); - rembymulup_special(t,f,invf,&tab[i]); + if ( debug_up ){ + fprintf(stderr,"."); + } + kmulup(tab[i-1],xp,&t); + rembymulup_special(t,f,invf,&tab[i]); } }