Annotation of OpenXM_contrib2/asir2018/engine/up_gf2n.c, Revision 1.2
1.1 noro 1: /*
2: * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
3: * All rights reserved.
4: *
5: * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
6: * non-exclusive and royalty-free license to use, copy, modify and
7: * redistribute, solely for non-commercial and non-profit purposes, the
8: * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
9: * conditions of this Agreement. For the avoidance of doubt, you acquire
10: * only a limited right to use the SOFTWARE hereunder, and FLL or any
11: * third party developer retains all rights, including but not limited to
12: * copyrights, in and to the SOFTWARE.
13: *
14: * (1) FLL does not grant you a license in any way for commercial
15: * purposes. You may use the SOFTWARE only for non-commercial and
16: * non-profit purposes only, such as academic, research and internal
17: * business use.
18: * (2) The SOFTWARE is protected by the Copyright Law of Japan and
19: * international copyright treaties. If you make copies of the SOFTWARE,
20: * with or without modification, as permitted hereunder, you shall affix
21: * to all such copies of the SOFTWARE the above copyright notice.
22: * (3) An explicit reference to this SOFTWARE and its copyright owner
23: * shall be made on your publication or presentation in any form of the
24: * results obtained by use of the SOFTWARE.
25: * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
26: * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
27: * for such modification or the source code of the modified part of the
28: * SOFTWARE.
29: *
30: * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
31: * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
32: * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
33: * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
34: * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
35: * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
36: * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
37: * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
38: * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
39: * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
40: * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
41: * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
42: * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
43: * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
44: * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
45: * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
46: * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
47: *
1.2 ! noro 48: * $OpenXM: OpenXM_contrib2/asir2018/engine/up_gf2n.c,v 1.1 2018/09/19 05:45:07 noro Exp $
1.1 noro 49: */
50: #include "ca.h"
51: #include <math.h>
52:
53: extern int debug_up;
54: extern int up_lazy;
55: extern GEN_UP2 current_mod_gf2n;
56:
57: void squarep_gf2n(VL vl,P n1,P *nr)
58: {
59: UP b1,br;
60:
61: if ( !n1 )
62: *nr = 0;
63: else if ( OID(n1) == O_N )
64: mulp(vl,n1,n1,nr);
65: else {
66: ptoup(n1,&b1);
67: squareup_gf2n(b1,&br);
68: uptop(br,nr);
69: }
70: }
71:
72: void squareup_gf2n(UP n1,UP *nr)
73: {
74: UP r;
75: GF2N *c1,*c;
76: int i,d1,d;
77:
78: if ( !n1 )
79: *nr = 0;
80: else if ( !n1->d ) {
81: *nr = r = UPALLOC(0); r->d = 0;
82: squaregf2n((GF2N)n1->c[0],(GF2N *)(&r->c[0]));
83: } else {
84: d1 = n1->d;
85: d = 2*d1;
86: *nr = r = UPALLOC(d); r->d = d;
87: c1 = (GF2N *)n1->c; c = (GF2N *)r->c;
88: bzero((char *)c,(d+1)*sizeof(GF2N *));
89: for ( i = 0; i <= d1; i++ )
90: squaregf2n(c1[i],&c[2*i]);
91: }
92: }
93:
94: /* x^(2^n) mod f */
95:
96: void powermodup_gf2n(UP f,UP *xp)
97: {
98: UP x,t,invf;
99: int k,n;
100: GF2N lm;
101:
102: n = degup2(current_mod_gf2n->dense);
103: MKGF2N(ONEUP2,lm);
104: x = UPALLOC(1); x->d = 1; x->c[1] = (Num)lm;
105:
106: reverseup(f,f->d,&t);
107: invmodup(t,f->d,&invf);
108: for ( k = 0; k < n; k++ ) {
109: squareup_gf2n(x,&t);
110: rembymulup_special(t,f,invf,&x);
111: /* remup(t,f,&x); */
112: }
113: *xp = x;
114: }
115:
116: /* g^d mod f */
117:
118: void generic_powermodup_gf2n(UP g,UP f,Z e,UP *xp)
119: {
120: UP x,y,t,invf,s;
121: int k;
122: GF2N lm;
123:
124: MKGF2N(ONEUP2,lm);
125: y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm;
126: remup(g,f,&x);
127: if ( !x ) {
128: *xp = !e ? y : 0;
129: return;
130: } else if ( !x->d ) {
131: pwrup(x,e,xp);
132: return;
133: }
134: reverseup(f,f->d,&t);
135: invmodup(t,f->d,&invf);
136: for ( k = z_bits((Q)e)-1; k >= 0; k-- ) {
137: squareup_gf2n(y,&t);
138: rembymulup_special(t,f,invf,&s);
139: y = s;
140: if ( mpz_tstbit(BDY(e),k) ) {
141: mulup(y,x,&t);
142: remup(t,f,&s);
143: y = s;
144: }
145: }
146: *xp = y;
147: }
148:
149: /* g+g^2+...+g^(2^(nd-1)) mod f; where e = deg(mod) */
150:
151: void tracemodup_gf2n(UP g,UP f,Z d,UP *xp)
152: {
153: UP x,t,s,u,invf;
154: int en,i;
155:
1.2 ! noro 156: en = ZTOS(d)*degup2(current_mod_gf2n->dense);
1.1 noro 157: remup(g,f,&x);
158: if ( !x ) {
159: *xp = 0;
160: return;
161: }
162: reverseup(f,f->d,&t);
163: invmodup(t,f->d,&invf);
164: for ( i = 1, t = s = x; i < en; i++ ) {
165: squareup_gf2n(t,&u);
166: rembymulup_special(u,f,invf,&t);
167: addup(s,t,&u); s = u;
168: }
169: *xp = s;
170: }
171:
172: void tracemodup_gf2n_slow(UP g,UP f,Z d,UP *xp)
173: {
174: UP x,t,s,u;
175: int en,i;
176:
1.2 ! noro 177: en = ZTOS(d)*degup2(current_mod_gf2n->dense);
1.1 noro 178: remup(g,f,&x);
179: if ( !x ) {
180: *xp = 0;
181: return;
182: }
183: for ( i = 1, t = s = x; i < en; i++ ) {
184: squareup_gf2n(t,&u);
185: remup(u,f,&t);
186: addup(s,t,&u); s = u;
187: }
188: *xp = s;
189: }
190:
191: void tracemodup_gf2n_tab(UP g,UP f,Z d,UP *xp)
192: {
193: UP x0,x2,t,s,u;
194: int en,i;
195: UP *tab;
196: GF2N one;
197:
1.2 ! noro 198: en = ZTOS(d)*degup2(current_mod_gf2n->dense);
1.1 noro 199: remup(g,f,&t); g = t;
200: if ( !g ) {
201: *xp = 0;
202: return;
203: }
204:
205: MKGF2N(ONEUP2,one);
206: x0 = UPALLOC(0); x0->d = 0; x0->c[0] = (Num)one;
207: x2 = UPALLOC(2); x2->d = 2; x2->c[2] = (Num)one;
208:
209: tab = (UP *)ALLOCA(en*sizeof(UP));
210: tab[0] = x0;
211: remup(x2,f,&tab[1]);
212:
213: for ( i = 2; i < en; i++ ) {
214: mulup(tab[i-1],tab[1],&t); remup(t,f,&tab[i]);
215: }
216:
217: for ( i = 1, t = s = g; i < en; i++ ) {
218: square_rem_tab_up_gf2n(t,tab,&u); t = u;
219: addup(s,t,&u); s = u;
220: }
221: *xp = s;
222: }
223:
224: void square_rem_tab_up_gf2n(UP f,UP *tab,UP *rp)
225: {
226: UP s,t,u,n;
227: Num *c;
228: int i,d;
229:
230: n = UPALLOC(0); n->d = 0;
231: if ( !f )
232: *rp = 0;
233: else {
234: d = f->d; c = f->c;
235: up_lazy = 1;
236: for ( i = 0, s = 0; i <= d; i++ ) {
237: squaregf2n((GF2N)c[i],(GF2N *)(&n->c[0]));
238: mulup(tab[i],n,&t); addup(s,t,&u); s = u;
239: }
240: up_lazy = 0;
241: simpup(s,rp);
242: }
243: }
244:
245: void powertabup_gf2n(UP f,UP xp,UP *tab)
246: {
247: UP y,t,invf;
248: int i,d;
249: GF2N lm;
250:
251: d = f->d;
252: MKGF2N(ONEUP2,lm);
253: y = UPALLOC(0); y->d = 0; y->c[0] = (Num)lm;
254: tab[0] = y;
255: tab[1] = xp;
256:
257: reverseup(f,f->d,&t);
258: invmodup(t,f->d,&invf);
259:
260: for ( i = 2; i < d; i++ ) {
261: if ( debug_up ){
262: fprintf(stderr,".");
263: }
264: if ( !(i%2) )
265: squareup_gf2n(tab[i/2],&t);
266: else
267: kmulup(tab[i-1],xp,&t);
268: rembymulup_special(t,f,invf,&tab[i]);
269: /* remup(t,f,&tab[i]); */
270: }
271: }
272:
273: void find_root_gf2n(UP f,GF2N *r)
274: {
275: UP g,ut,c,t,h,rem;
276: int n;
277: GF2N rn;
278:
279: n = degup2(current_mod_gf2n->dense);
280: g = f;
281: while ( g->d > 1 ) {
282: ut = UPALLOC(1); ut->c[0] = 0;
283: randomgf2n(&rn);
284: if ( !rn )
285: continue;
286: ut->c[1] = (Num)rn; ut->d = 1;
287: tracemodup_gf2n_tab(ut,f,ONE,&c);
288: gcdup(c,g,&h);
289: if ( h->d && h->d < g->d ) {
290: if ( 2*h->d > g->d ) {
291: qrup(g,h,&t,&rem); g = t;
292: if ( rem )
293: error("find_root_gf2n : cannot happen");
294: } else
295: g = h;
296: }
297: monicup(g,&t); g = t;
298: printf("deg(g)=%d\n",g->d);
299: }
300: divgf2n((GF2N)g->c[0],(GF2N)g->c[1],r);
301: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>