Annotation of OpenXM_contrib/pari/src/modules/kummer.c, Revision 1.1.1.1
1.1 maekawa 1: /*******************************************************************/
2: /* */
3: /* KUMMER EXTENSIONS */
4: /* */
5: /*******************************************************************/
6: /* $Id: kummer.c,v 1.1.1.1 1999/09/16 13:48:13 karim Exp $ */
7: #include "pari.h"
8:
9: static long rc,gc,ell,degK,degKz,m,d,ru,rv,lraycyc,vnf,dv,nbcol,lSml2;
10: static long lSl,lSp,dK,lSl2,dc;
11: static GEN module,matexpoteta1,bnf,nf,raycyc,polnf,phiell,powtaubet,vecMsup;
12: static GEN unmodell,bnfz,nfz,U,uu,gell,cyc,gencyc,vecalpha,R,A1,A2,g,vselmer;
13: static GEN bnrz,polrel,steinitzZk,listmod,listprSp,listbid,listunif,listellrank;
14: static GEN listmodsup,listbidsup,listellranksup,vecw,Sm,Sml1,Sml2,Sl;
15: static GEN ESml2,Sp,vecbetap,vecalphap,matP,gg,mginv;
16:
17: /* row vector B x matrix T : c_j=prod_i (b_i^T_ij) */
18: static GEN
19: groupproduct(GEN B, GEN T)
20: {
21: long lB,lT,i,j;
22: GEN c,p1;
23:
24: lB=lg(B)-1;
25: lT=lg(T)-1;
26: c=cgetg(lT+1,t_VEC);
27: for (j=1; j<=lT; j++)
28: {
29: p1=gun;
30: for (i=1; i<=lB; i++) p1=gmul(p1,gpui((GEN)B[i],gcoeff(T,i,j),0));
31: c[j]=(long)p1;
32: }
33: return c;
34: }
35:
36: static GEN
37: grouppows(GEN B, long ex)
38: {
39: long lB,j;
40: GEN c;
41:
42: lB=lg(B)-1;
43: c=cgetg(lB+1,t_VEC);
44: for (j=1; j<=lB; j++) c[j]=(long)gpuigs((GEN)B[j],ex);
45: return c;
46: }
47:
48: static GEN
49: get_listx(GEN arch,GEN msign,GEN munit,GEN vecmunit2,long ell,long lSp,long lSml2,long nbvunit,long r1)
50: {
51: GEN kermat,p2,p3,p4,y,yinit,listx,unmodell = gmodulss(1,ell);
52: long i,j,k,cmpt,lker;
53:
54: kermat=lift(ker(munit)); lker=lg(kermat)-1;
55: if (!lker) return cgetg(1,t_VEC);
56: yinit=cgetg(lker,t_VEC); y=cgetg(lker,t_VEC);
57: for (i=1; i<lker; i++)
58: {
59: y[i]=lgeti(3); affii(gzero,(GEN)y[i]);
60: yinit[i]=zero;
61: }
62: listx=cgetg(1,t_VEC);
63: for(;;)
64: {
65: p2=cgetg(2,t_VEC);
66: p3=(GEN)kermat[lker];
67: for (j=1; j<lker; j++)
68: p3=lift(gmul(unmodell,gadd(p3,gmul((GEN)y[j],(GEN)kermat[j]))));
69: cmpt=0; for (j=1; j<=lSp; j++) if (gcmp0((GEN)p3[j+nbvunit])) cmpt++;
70: if (!cmpt)
71: {
72: for (k=1; k<=lSml2; k++)
73: {
74: p4=lift(gmul((GEN)vecmunit2[k],p3));
75: j=1; while (j<lg(p4) && !signe(p4[j])) j++;
76: if (j>=lg(p4)) break;
77: }
78: if (k>lSml2)
79: {
80: p4=lift(gmul(msign,p3));
81: j=1; while (j<=r1 && gegal((GEN)p4[j],(GEN)arch[j])) j++;
82: if (j>r1) { p2[1]=(long)p3; listx=concatsp(listx,p2); }
83: }
84: }
85: if (!lSp)
86: {
87: j=1; while (j<lker && !signe(y[j])) j++;
88: if (j<lker && gcmp1((GEN)y[j]))
89: {
90: p3=gsub(p3,(GEN)kermat[lker]);
91: for (k=1; k<=lSml2; k++)
92: {
93: p4=lift(gmul((GEN)vecmunit2[k],p3));
94: j=1; while (j<lg(p4) && !signe(p4[j])) j++;
95: if (j>=lg(p4)) break;
96: }
97: if (k>lSml2)
98: {
99: p4=lift(gmul(msign,p3));
100: j=1; while (j<=r1 && gegal((GEN)p4[j],(GEN)arch[j])) j++;
101: if (j>r1) { p2[1]=(long)p3; listx=concatsp(listx,p2); }
102: }
103: }
104: }
105: i=lker;
106: do
107: {
108: i--; if (!i) return listx;
109:
110: if (i<lker-1) affii((GEN)yinit[i+1],(GEN)y[i+1]);
111: gaddgsz((GEN)y[i],1,(GEN)y[i]);
112: }
113: while (cmpis((GEN)y[i],ell)>=0);
114: }
115: }
116:
117: static GEN
118: reducealpha(GEN nf,GEN x,GEN gell)
119: /* etant donne un nombre algebrique x du corps nf -- non necessairement
120: entier -- calcule un entier algebrique de la forme x*g^gell */
121: {
122: long tx=typ(x),i;
123: GEN den,fa,fac,ep,p1,y;
124:
125: nf=checknf(nf);
126: if ((tx==t_POL)||(tx==t_POLMOD)) y=algtobasis(nf,x);
127: else { y=x; x=basistoalg(nf,y); }
128: den=denom(y);
129: if (gcmp1(den)) return x;
130: fa=decomp(den);fac=(GEN)fa[1];ep=(GEN)fa[2];
131: p1=gun;
132: for (i=1; i<lg(fac); i++)
133: p1=mulii(p1,gpui((GEN)fac[i],gceil(gdiv((GEN)ep[i],gell)),0));
134: return gmul(gpui(p1,gell,0),x);
135: }
136:
137: /* si all!=0, donne toutes les equations correspondant a un sousgroupe
138: de determinant all (i.e. de degre all) */
139: static GEN
140: rnfkummersimple(GEN bnr, GEN subgroup, long all, long prec)
141: {
142: long r1,degnf,ell,j,i;
143: long nbgenclK,lprm,lprl,lSml2,lSl,lSp,lastindex,nbvunit,nbvunit0;
144: long kmax,nbgenbid,lastbid,nbcol,nblig,k,llistx,e,vp,vd,v1;
145:
146: GEN bnf,nf,p1,classgroup,cyclic,bid,module,ideal,arch;
147: GEN gell,p2,p3,p22;
148: GEN clK,cyclicK,genK,listgamma,listalpha,fa,prm,expom,Sm,Sml1,Sml2,Sl,ESml2;
149: GEN pp,p,prl,Sp,vecbeta,matexpo,unmodell,vunit,id,pr,vsml2,listalpha0;
150: GEN cycpro,cl,cycbid,munit,vecmunit2,msign,archartif,listx,listal,listgamma0;
151: GEN vecbeta0;
152:
153: checkbnrgen(bnr); bnf=(GEN)bnr[1];
154: nf=(GEN)bnf[7]; r1=itos(gmael(nf,2,1));
155: polnf=(GEN)nf[1]; vnf=varn(polnf);
156: if (vnf==0) err(talker,"main variable in kummer must not be x");
157: p1=conductor(bnr,all ? gzero : subgroup,2,prec);
158: bnr=(GEN)p1[2]; if(!all) subgroup=(GEN)p1[3];
159: classgroup=(GEN)bnr[5];
160: cyclic=(GEN)classgroup[2];
161: bid=(GEN)bnr[2]; module=(GEN)bid[1];
162: ideal=(GEN)module[1]; arch=(GEN)module[2];
163: if (!all && gcmp0(subgroup)) subgroup = diagonal(cyclic);
164: degnf=lgef(polnf)-3;
165: gell = all? stoi(all): det(subgroup);
166: if (!isprime(gell))
167: err(impl,"kummer for non prime relative degree");
168: ell=itos(gell);
169: unmodell=gmodulss(1,ell);
170: clK=gmael(bnf,8,1); cyclicK=(GEN)clK[2]; genK=(GEN)clK[3];
171: nbgenclK=lg(genK)-1;
172: i=1; while (i<=nbgenclK && gdivise((GEN)cyclicK[i],gell)) i++;
173: lastindex=i-1;
174: listgamma0=cgetg(nbgenclK+1,t_VEC);
175: listgamma=cgetg(nbgenclK+1,t_VEC);
176: listalpha0=cgetg(lastindex+1,t_VEC);
177: listalpha=cgetg(lastindex+1,t_VEC);
178: p1=gmul(gell,ideal);
179: for (i=1; i<=lastindex; i++)
180: {
181: p3=basistoalg(nf,idealcoprime(nf,(GEN)genK[i],p1));
182: listgamma[i]=listgamma0[i]=linv(p3);
183: p2=idealpow(nf,(GEN)genK[i],(GEN)cyclicK[i]);
184: listalpha0[i]=(long)basistoalg(nf,(GEN)isprincipalgen(bnf,p2)[2]);
185: listalpha[i]=lmul((GEN)listalpha0[i],gpui(p3,(GEN)cyclicK[i],0));
186: }
187: for ( ; i<=nbgenclK; i++)
188: {
189: p3=basistoalg(nf,idealcoprime(nf,(GEN)genK[i],p1));
190: p2=idealpow(nf,(GEN)genK[i],(GEN)cyclicK[i]);
191: p2=basistoalg(nf,(GEN)isprincipalgen(bnf,p2)[2]);
192: p22=lift(ginv(gmul(unmodell,(GEN)cyclicK[i])));
193: p2=gpui(p2,p22,0);listgamma0[i]=(long)p2;
194: listgamma[i]=lmul(p2,gpui(p3,addis(mulii(p22,(GEN)cyclicK[i]),-1),0));
195: }
196: /* a ce stade, module est egal au conducteur. */
197: fa=idealfactor(nf,ideal);
198: prm=(GEN)fa[1]; expom=(GEN)fa[2]; lprm=lg(prm)-1;
199: Sm=cgetg(1,t_VEC);Sml1=cgetg(1,t_VEC);Sml2=cgetg(1,t_VEC);Sl=cgetg(1,t_VEC);
200: ESml2=cgetg(1,t_VEC);
201: for (i=1; i<=lprm; i++)
202: {
203: pp=cgetg(2,t_VEC); pp[1]=prm[i];
204: p=gmael(pp,1,1); e=itos(gmael(pp,1,3));
205: if (!gegal(p,gell))
206: {
207: if (!gcmp1((GEN)expom[i]))
208: {
209: if (all) return cgetg(1,t_VEC);
210: err(talker,"bug1 in kummer");
211: }
212: Sm=concatsp(Sm,pp);
213: }
214: else
215: {
216: vp=itos((GEN)expom[i]); vd=(vp-1)*(ell-1)-ell*e;
217: if (vd > 0)
218: {
219: if (all) return cgetg(1,t_VEC);
220: err(talker,"bug4 in kummer");
221: }
222: if (vd==0)
223: Sml1=concatsp(Sml1,pp);
224: else
225: {
226: if (vp==1)
227: {
228: if (all) return cgetg(1,t_VEC);
229: err(talker,"bug2 in kummer");
230: }
231: else
232: {
233: Sml2=concatsp(Sml2,pp); ESml2=concatsp(ESml2,(GEN)expom[i]);
234: }
235: }
236: }
237: }
238: prl=primedec(nf,gell); lprl=lg(prl)-1;
239: for (i=1; i<=lprl; i++)
240: if (!idealval(nf,ideal,(GEN)prl[i]))
241: {
242: pp=cgetg(2,t_VEC); pp[1]=prl[i];
243: Sl=concatsp(Sl,pp);
244: }
245: lSml2=lg(Sml2)-1; lSl=lg(Sl)-1;
246: Sp=concatsp(Sm,Sml1); lSp=lg(Sp)-1;
247: vecbeta=cgetg(lSp+1,t_VEC); matexpo=cgetg(lSp+1,t_MAT);
248: vecbeta0=cgetg(lSp+1,t_VEC);
249: for (j=1; j<=lSp; j++)
250: {
251: p1=isprincipalgen(bnf,(GEN)Sp[j]);
252: p2=basistoalg(nf,(GEN)p1[2]);
253: for (i=1; i<=lastindex; i++)
254: p2 = gmul(p2,gpui((GEN)listgamma[i],gmael(p1,1,i),0));
255: p22=p2;
256: for ( ; i<=nbgenclK; i++)
257: {
258: p2 = gmul(p2,gpui((GEN)listgamma[i],gmael(p1,1,i),0));
259: p22 = gmul(p22,gpui((GEN)listgamma0[i],gmael(p1,1,i),0));
260: }
261: matexpo[j]=(long)p1[1];
262: vecbeta[j]=(long)p2; /* attention, ceci sont les beta modifies */
263: vecbeta0[j]=(long)p22;
264: }
265: matexpo=gmul(unmodell,matexpo);
266: vunit=gmodulcp(concatsp(gmael(bnf,8,5),gmael3(bnf,8,4,2)),polnf);
267: nbvunit0=lg(vunit)-1;
268: for (i=1; i<=lastindex; i++) vunit=concatsp(vunit,(GEN)listalpha[i]);
269: nbvunit=lg(vunit)-1;
270: id=idmat(degnf);
271: for (i=1; i<=lSl; i++)
272: {
273: pr=(GEN)Sl[i];
274: id=idealmul(nf,idealpow(nf,pr,stoi((ell*itos((GEN)pr[3]))/(ell-1))),id);
275: }
276: vsml2=cgetg(lSml2+1,t_VEC);
277: for (i=1; i<=lSml2; i++)
278: {
279: pr=(GEN)Sml2[i];
280: v1=itos((GEN)ESml2[i]);
281: kmax=(itos((GEN)pr[3])*ell)/(ell-1)+1-v1;
282: p1=idealpow(nf,pr,stoi(kmax));
283: id=idealmul(nf,id,p1);
284: p2=idealmul(nf,p1,pr);
285: p3=zidealstarinitgen(nf,p2);
286: vsml2[i]=(long)p3;
287: cycpro=gmael(p3,2,2);
288: for (j=1;j<lg(cycpro);j++)
289: if (! gdivise((GEN)cycpro[j],gell)) err(talker,"bug5 in kummer");
290: }
291: bid=zidealstarinitgen(nf,id);
292: cl=(GEN)bid[2]; cycbid=(GEN)cl[2]; nbgenbid=lg(cycbid)-1;
293: i=1; while (i<=nbgenbid && gdivise((GEN)cycbid[i],gell)) i++;
294: lastbid=i-1;
295: nbcol=nbvunit+lSp; nblig=lastbid+lastindex;
296: munit=cgetg(nbcol+1,t_MAT); vecmunit2=cgetg(lSml2+1,t_VEC);
297: msign=cgetg(nbcol+1,t_MAT);
298: for (k=1; k<=lSml2; k++) vecmunit2[k]=lgetg(nbcol+1,t_MAT);
299: archartif=cgetg(r1+1,t_VEC); for (j=1; j<=r1; j++) archartif[j]=un;
300: for (j=1; j<=nbvunit; j++)
301: {
302: p1=zideallog(nf,(GEN)vunit[j],bid);
303: p2=cgetg(nblig+1,t_COL); munit[j]=(long)p2;
304: for (i=1; i<=lastbid; i++) p2[i]=p1[i];
305: for ( ; i<=nblig; i++) p2[i]=zero;
306: for (k=1; k<=lSml2; k++)
307: ((GEN)vecmunit2[k])[j]=(long)zideallog(nf,(GEN)vunit[j],(GEN)vsml2[k]);
308: msign[j]=(long)zsigne(nf,(GEN)vunit[j],archartif);
309: }
310: p1=cgetg(nbgenclK-lastindex+1,t_VEC);
311: for (j=1; j<=lSp; j++)
312: {
313: p2=zideallog(nf,(GEN)vecbeta[j],bid);
314: p3=cgetg(nblig+1,t_COL); munit[j+nbvunit]=(long)p3;
315: for (i=1; i<=lastbid; i++) p3[i]=p2[i];
316: for ( ; i<=nblig; i++) p3[i]=coeff(matexpo,i-lastbid,j);
317: for (k=1; k<=lSml2; k++)
318: {
319: p2=zideallog(nf,(GEN)vecbeta[j],(GEN)vsml2[k]);
320: ((GEN)vecmunit2[k])[j+nbvunit]=(long)p2;
321: }
322: msign[j+nbvunit]=(long)zsigne(nf,(GEN)vecbeta[j],archartif);
323: }
324: munit=gmul(unmodell,munit); vecmunit2=gmul(unmodell,vecmunit2);
325: listx = get_listx(arch,msign,munit,vecmunit2,ell,lSp,lSml2,nbvunit,r1);
326: llistx=lg(listx)-1;
327: listal=cgetg(llistx+1,t_VEC);
328: for (i=1; i<=llistx; i++)
329: {
330: p1=gun; p3=(GEN)listx[i];
331: for (j=1; j<=nbvunit0; j++)
332: p1 = gmul(p1,gpui((GEN)vunit[j],(GEN)p3[j],0));
333: for ( ; j<=nbvunit; j++)
334: p1 = gmul(p1,gpui((GEN)listalpha0[j-nbvunit0],(GEN)p3[j],0));
335: for (j=1; j<=lSp; j++)
336: p1 = gmul(p1,gpui((GEN)vecbeta0[j],(GEN)p3[j+nbvunit],0));
337: listal[i]=(long)reducealpha(nf,p1,gell);
338: }
339: /* A ce stade, tous les alpha dans la liste listal statisfont les
340: * congruences, noncongruences et signatures, et ne sont pas des puissances
341: * l-iemes donc x^l-alpha est irreductible, sa signature est correcte ainsi
342: * que son discriminant relatif. Reste a determiner son groupe de normes.
343: * Les alpha ne sont peut-etre pas des entiers algebriques.. */
344: if (DEBUGLEVEL)
345: { fprintferr("listalpha = \n"); outerr(listal); flusherr(); }
346: p2=cgetg(1,t_VEC);
347: for (i=1; i<=llistx; i++)
348: {
349: p1=gsub(gpuigs(polx[0],ell),(GEN)listal[i]);
350: if (all || gegal(rnfnormgroup(bnr,p1),subgroup))
351: p2=concatsp(p2,p1);
352: }
353: if (all) return gcopy(p2);
354: switch(lg(p2)-1)
355: {
356: case 0: err(talker,"bug 6: no equation found in kummer");
357: case 1: return gcopy((GEN)p2[1]);
358: default: fprintferr("equations = \n"); outerr(p2);
359: err(talker,"bug 7: more than one equation found in kummer");
360: }
361: return gzero; /* not reached */
362: }
363:
364: static GEN
365: tauofideal(GEN id)
366: {
367: long j;
368: GEN p1,p2;
369:
370: p1=gsubst(gmul((GEN)nfz[7],id),vnf,U);
371: p2=cgetg(lg(p1),t_MAT);
372: for (j=1; j<lg(p1); j++) p2[j]=(long)algtobasis(nfz,(GEN)p1[j]);
373: return p2;
374: }
375:
376: static GEN
377: tauofprimeideal(GEN pr)
378: {
379: GEN p1;
380:
381: p1=gcopy(pr);
382: p1[2]=(long)algtobasis(nfz,gsubst(gmul((GEN)nfz[7],(GEN)pr[2]),vnf,U));
383: return gcoeff(idealfactor(nfz,prime_to_ideal(nfz,p1)),1,1);
384: }
385:
386: static long
387: isprimeidealconj(GEN pr1, GEN pr2)
388: {
389: GEN pr=pr1;
390:
391: do
392: {
393: if (gegal(pr,pr2)) return 1;
394: pr=tauofprimeideal(pr);
395: }
396: while (!gegal(pr,pr1));
397: return 0;
398: }
399:
400: static long
401: isconjinprimelist(GEN listpr, GEN pr2)
402: {
403: long ll=lg(listpr)-1,i;
404:
405: for (i=1; i<=ll; i++)
406: if (isprimeidealconj((GEN)listpr[i],pr2)) return 1;
407: return 0;
408: }
409:
410: static void
411: computematexpoteta1(void)
412: {
413: long i,j;
414: GEN p4,p5,p6;
415:
416: matexpoteta1=cgetg(degK+1,t_MAT);
417: p4=gmodulcp(polun[vnf],R);
418: for (j=1; j<=degK; j++)
419: {
420: p5=cgetg(degKz+1,t_COL); matexpoteta1[j]=(long)p5; p6=lift(p4);
421: for (i=1; i<=degKz; i++) p5[i]=(long)truecoeff(p6,i-1);
422: if (j<degK) p4=gmul(p4,A1);
423: }
424: }
425:
426: static GEN
427: downtoK(GEN x)
428: {
429: long i;
430: GEN p1,p2,p3;
431:
432: p1=cgetg(degKz+1,t_COL);
433: p2=lift(x);
434: for (i=1; i<=degKz; i++) p1[i]=(long)truecoeff(p2,i-1);
435: p2=inverseimage(matexpoteta1,p1);
436: if (lg(p2)==1) err(talker,"not an element of K in downtoK");
437: p3=(GEN)p2[degK];
438: for (i=degK-1; i; i--) p3=gadd((GEN)p2[i],gmul(polx[vnf],p3));
439: return gmodulcp(p3,polnf);
440: }
441:
442: static GEN
443: tracetoK(GEN x)
444: {
445: long i;
446: GEN p1,p2;
447:
448: p1=x; p2=x;
449: for (i=1; i<=m-1; i++)
450: {
451: p1=gsubst(lift(p1),vnf,U);
452: p2=gadd(p2,p1);
453: }
454: return downtoK(p2);
455: }
456:
457: static GEN
458: normtoK(GEN x)
459: {
460: long i;
461: GEN p1,p2;
462:
463: p1=x; p2=x;
464: for (i=1; i<=m-1; i++)
465: {
466: p1=gsubst(lift(p1),vnf,U);
467: p2=gmul(p2,p1);
468: }
469: return downtoK(p2);
470: }
471:
472: static GEN
473: computepolrel(void)
474: {
475: long i,j;
476: GEN p1,p2;
477:
478: p1=gun; p2=gmodulcp(polx[vnf],R);
479: for (i=0; i<=m-1; i++)
480: {
481: p1=gmul(p1,gsub(polx[0],p2));
482: if (i<m-1) p2=gsubst(lift(p2),vnf,U);
483: }
484: for (j=2; j<=m+2; j++) p1[j]=(long)downtoK((GEN)p1[j]);
485: return p1;
486: }
487:
488: /* alg. 5.2.15. with remark */
489: static GEN
490: isprincipalell(GEN id)
491: {
492: long i;
493: GEN p1,p2,logdisc,be;
494:
495: p1=isprincipalgen(bnfz,id); logdisc=(GEN)p1[1];
496: be=basistoalg(bnfz,(GEN)p1[2]);
497: for (i=rc+1; i<=gc; i++)
498: be=gmul(be,gpui((GEN)vecalpha[i],modii(mulii((GEN)logdisc[i],(GEN)uu[i]),gell),0));
499: p2=cgetg(3,t_VEC);
500: p2[2]=(long)be;
501: p1=cgetg(rc+1,t_COL); p2[1]=(long)p1;
502: for (i=1; i<=rc; i++) p1[i]=logdisc[i];
503: return p2;
504: }
505:
506: /* alg. 5.3.11. */
507: static GEN
508: isvirtualunit(GEN v)
509: {
510: long llist,i,j,ex;
511: GEN p1,p2,listex,listpr,q,ga,eps,vecy,logdisc;
512:
513: p1=idealfactor(nfz,v);
514: listex=(GEN)p1[2]; listpr=(GEN)p1[1]; llist=lg(listex)-1;
515: q=idmat(degKz);
516: for (i=1; i<=llist; i++)
517: {
518: ex=itos((GEN)listex[i]);
519: if (ex%ell) err(talker,"not a virtual unit in isvirtualunit");
520: q=idealmul(nfz,q,idealpow(nfz,(GEN)listpr[i],stoi(ex/ell)));
521: }
522: p1=isprincipalgen(bnfz,q); logdisc=(GEN)p1[1];
523: ga=basistoalg(nfz,(GEN)p1[2]);
524: for (j=rc+1; j<=gc; j++)
525: ga=gmul(ga,gpui((GEN)vecalpha[j],divii((GEN)logdisc[j],(GEN)cyc[j]),0));
526: eps=gpuigs(ga,ell);
527: vecy=cgetg(rc+1,t_COL);
528: for (j=1; j<=rc; j++)
529: {
530: vecy[j]=(long)divii((GEN)logdisc[j],divii((GEN)cyc[j],gell));
531: eps=gmul(eps,gpui((GEN)vecalpha[j],(GEN)vecy[j],0));
532: }
533: eps=gdiv(v,eps);
534: p1=isunit(bnfz,eps);
535: p2=cgetg(3,t_VEC);
536: p2[1]=(long)concatsp(vecy,lift(p1));
537: p2[2]=(long)ga;
538: return p2;
539: }
540:
541: static GEN
542: lifttokz(GEN id)
543: {
544: long i,j;
545: GEN p1,p2,p3;
546:
547: p1=gsubst(gmul((GEN)nf[7],id),vnf,A1);
548: p2=gmodulcp((GEN)nfz[7],R);
549: p3=cgetg(degK*degKz+1,t_MAT);
550: for (i=1; i<=degK; i++)
551: for (j=1; j<=degKz; j++)
552: p3[(i-1)*degKz+j]=(long)algtobasis(nfz,gmul((GEN)p1[i],(GEN)p2[j]));
553: return hnfmod(p3,detint(p3));
554: }
555:
556: static GEN
557: steinitzaux(GEN id)
558: {
559: long i,j;
560: GEN p1,p2,p3,vecid,matid,pseudomat,pid;
561:
562: p1=gsubst(gmul((GEN)nfz[7],id),vnf,polx[0]);
563: for (j=1; j<=degKz; j++)
564: p1[j]=(long)gmod((GEN)p1[j],polrel);
565: p2=cgetg(degKz+1,t_MAT);
566: for (j=1; j<=degKz; j++)
567: {
568: p3=cgetg(m+1,t_COL); p2[j]=(long)p3;
569: for (i=1; i<=m; i++) p3[i]=(long)algtobasis(nf,truecoeff((GEN)p1[j],i-1));
570: }
571: vecid=cgetg(degKz+1,t_VEC); matid=idmat(degK);
572: for (j=1; j<=degKz; j++) vecid[j]=(long)matid;
573: pseudomat=cgetg(3,t_VEC);
574: pseudomat[1]=(long)p2; pseudomat[2]=(long)vecid;
575: pid=(GEN)nfhermite(nf,pseudomat)[2];
576: p1=matid;
577: for (j=1; j<=m; j++) p1=idealmul(nf,p1,(GEN)pid[j]);
578: return p1;
579: }
580:
581: static GEN
582: normrelz(GEN id)
583: {
584: GEN p1;
585:
586: p1=steinitzaux(id);
587: return idealdiv(nf,p1,steinitzZk);
588: }
589:
590: static GEN
591: invimsubgroup(GEN bnr, GEN subgroup, GEN idealz, long prec)
592: {
593: long lraycycz,i,j;
594: GEN Plog,rayclgpz,genraycycz,utemp,p1,p2;
595:
596: bnrz=buchrayinitgen(bnfz,idealz,prec);
597: rayclgpz=(GEN)bnrz[5];
598: genraycycz=(GEN)rayclgpz[3]; lraycycz=lg(genraycycz)-1;
599: Plog=cgetg(lraycycz+lraycyc+1,t_MAT);
600: for (j=1; j<=lraycycz; j++)
601: Plog[j]=(long)isprincipalray(bnr,normrelz((GEN)genraycycz[j]));
602: for ( ; j<=lraycycz+lraycyc; j++)
603: Plog[j]=subgroup[j-lraycycz];
604: utemp=(GEN)hnfall(Plog)[2];
605: p2=cgetg((lraycycz<<1)+1,t_MAT);
606: for (j=1; j<=lraycycz; j++)
607: {
608: p1=cgetg(lraycycz+1,t_COL); p2[j]=(long)p1;
609: for (i=1; i<=lraycycz; i++) p1[i]=coeff(utemp,i,j);
610: }
611: p1=diagonal((GEN)rayclgpz[2]);
612: for ( ; j<=(lraycycz<<1); j++) p2[j]=p1[j-lraycycz];
613: return hnfmod(p2,(GEN)rayclgpz[1]);
614: }
615:
616: static GEN
617: ideallogaux(long ind, GEN al)
618: {
619: long llogli,valal;
620: GEN p1;
621:
622: valal=element_val(nfz,algtobasis(nfz,al),(GEN)listprSp[ind]);
623: al=gmul(al,gpuigs((GEN)listunif[ind],valal));
624: p1=zideallog(nfz,al,(GEN)listbid[ind]);
625: llogli=itos((GEN)listellrank[ind]);
626: setlg(p1,llogli+1); return p1;
627: }
628:
629: static GEN
630: ideallogauxsup(long ind, GEN al)
631: {
632: long llogli,valal;
633: GEN p1;
634:
635: valal=element_val(nfz,algtobasis(nfz,al),(GEN)listprSp[ind]);
636: al=gmul(al,gpuigs((GEN)listunif[ind],valal));
637: p1=zideallog(nfz,al,(GEN)listbidsup[ind]);
638: llogli=itos((GEN)listellranksup[ind]);
639: setlg(p1,llogli+1); return p1;
640: }
641:
642: static GEN
643: vectau(GEN list)
644: {
645: long i,j,n,cmpt;
646: GEN listz,listc,yz,yc,listfl,s,p1,p2,y;
647:
648: listz=(GEN)list[1]; listc=(GEN)list[2]; n=lg(listz)-1;
649: yz=cgetg(n+1,t_VEC); yc=cgetg(n+1,t_VEC);
650: listfl=cgetg(n+1,t_VEC); for (i=1; i<=n; i++) listfl[i]=un;
651: cmpt=0;
652: for (i=1; i<=n; i++)
653: {
654: if (signe((GEN)listfl[i]))
655: {
656: cmpt++;
657: yz[cmpt]=listz[i];
658: s=(GEN)listc[i];
659: for (j=i+1; j<=n; j++)
660: {
661: if (signe((GEN)listfl[j])&&gegal((GEN)listz[j],(GEN)listz[i]))
662: {
663: s=gadd(s,(GEN)listc[j]);
664: listfl[j]=zero;
665: }
666: }
667: yc[cmpt]=(long)s;
668: }
669: }
670: y=cgetg(3,t_VEC);
671: p1=cgetg(cmpt+1,t_VEC); p2=cgetg(cmpt+1,t_VEC); y[1]=(long)p1; y[2]=(long)p2;
672: for (i=1; i<=cmpt; i++)
673: {
674: p1[i]=yz[i];
675: p2[i]=yc[i];
676: }
677: return y;
678: }
679:
680: #if 0
681: static GEN
682: addtau(GEN listx, GEN listy)
683: {
684: GEN p1,p2,y;
685:
686: p1=concat((GEN)listx[1],(GEN)listy[1]);
687: p2=concat((GEN)listx[2],(GEN)listy[2]);
688: y=cgetg(3,t_VEC); y[1]=(long)p1; y[2]=(long)p2;
689: return vectau(y);
690: }
691: #endif
692:
693: static GEN
694: subtau(GEN listx, GEN listy)
695: {
696: GEN p1,p2,y;
697:
698: p1=concat((GEN)listx[1],(GEN)listy[1]);
699: p2=concat((GEN)listx[2],gneg_i((GEN)listy[2]));
700: y=cgetg(3,t_VEC); y[1]=(long)p1; y[2]=(long)p2;
701: return vectau(y);
702: }
703:
704: static GEN
705: negtau(GEN list)
706: {
707: GEN y;
708:
709: y=cgetg(3,t_VEC);
710: y[1]=list[1];
711: y[2]=lneg((GEN)list[2]);
712: return y;
713: }
714:
715: static GEN
716: multau(GEN listx, GEN listy)
717: {
718: GEN lzx,lzy,lcx,lcy,lzz,lcz,y;
719: long nx,ny,i,j,k;
720:
721: lzx=(GEN)listx[1]; lcx=(GEN)listx[2]; nx=lg(lzx)-1;
722: lzy=(GEN)listy[1]; lcy=(GEN)listy[2]; ny=lg(lzy)-1;
723: lzz=cgetg(nx*ny+1,t_VEC); lcz=cgetg(nx*ny+1,t_VEC);
724: for (i=1; i<=nx; i++)
725: for (j=1; j<=ny; j++)
726: {
727: k=(i-1)*ny+j;
728: lzz[k]=ladd((GEN)lzx[i],(GEN)lzy[j]);
729: lcz[k]=lmul((GEN)lcx[i],(GEN)lcy[j]);
730: }
731: y=cgetg(3,t_VEC); y[1]=(long)lzz; y[2]=(long)lcz;
732: return vectau(y);
733: }
734:
735: #if 0
736: static GEN
737: puipol(GEN be, GEN pol)
738: {
739: long i,degpol;
740: GEN y;
741:
742: degpol=degree(pol);
743: y=gun;
744: for (i=0; i<=degpol; i++)
745: if (!gcmp0((GEN)pol[i+2])) y=gmul(y,gpui((GEN)powtaubet[i+1],(GEN)pol[i+2],0));
746: return y;
747: }
748:
749: static GEN
750: puitau(GEN be, GEN list)
751: {
752: long lgl,i;
753: GEN y,listz,listc,p1;
754:
755: y=gun; listz=(GEN)list[1]; listc=(GEN)list[2]; lgl=lg(listz)-1;
756: for (i=1; i<=lgl; i++)
757: {
758: p1=lift((GEN)listc[i]);
759: if (!gcmp0(p1))
760: {
761: if (!gcmp0(lift(gmul(unmodell,(GEN)listz[i]))))
762: err(talker,"bug1 in puitau");
763: if (degree(p1)) err(talker,"bug2 in puitau");
764: if (typ(p1)==t_POL) p1=(GEN)p1[2];
765: y=gmul(y,gpui(puipol(be,(GEN)listz[i]),p1,0));
766: }
767: }
768: return y;
769: }
770: #endif
771:
772: static GEN
773: mulpoltau(GEN poltau, GEN list)
774: {
775: long i,j;
776: GEN y;
777:
778: j=lg(poltau)-2;
779: y=cgetg(j+3,t_VEC);
780: y[1]=(long)negtau(multau(list,(GEN)poltau[1]));
781: for (i=2; i<=j+1; i++)
782: {
783: y[i]=(long)subtau((GEN)poltau[i-1],multau(list,(GEN)poltau[i]));
784: }
785: y[j+2]=poltau[j+1];
786: return y;
787: }
788:
789: /* th. 5.3.5. and prop. 5.3.9. */
790: static GEN
791: computepolrelbeta(GEN be)
792: {
793: long i,a,b,j;
794: GEN e,u,u1,u2,u3,p1,p2,p3,p4,zet,be1,be2,listr,s,veczi,vecci;
795:
796: switch (ell)
797: {
798: case 2: err(talker,"you should not be here in rnfkummer !!"); break;
799: case 3: e=normtoK(be); u=tracetoK(be);
800: return gsub(gmul(polx[0],gsub(gsqr(polx[0]),gmulsg(3,e))),gmul(e,u));
801: case 5: e=normtoK(be);
802: if (d==2)
803: {
804: u=tracetoK(gpuigs(be,3));
805: p1=gadd(gmulsg(5,gsqr(e)),gmul(gsqr(polx[0]),gsub(gsqr(polx[0]),gmulsg(5,e))));
806: return gsub(gmul(polx[0],p1),gmul(e,u));
807: }
808: else
809: {
810: be1=gsubst(lift(be),vnf,U); be2=gsubst(lift(be1),vnf,U);
811: u1=tracetoK(gmul(be,be1)); u2=tracetoK(gmul(gmul(be,be2),gsqr(be1)));
812: u3=tracetoK(gmul(gmul(gsqr(be),gpuigs(be1,3)),be2));
813: p1=gsub(gsqr(polx[0]),gmulsg(10,e));
814: p1=gsub(gmul(polx[0],p1),gmulsg(5,gmul(e,u1)));
815: p1=gadd(gmul(polx[0],p1),gmul(gmulsg(5,e),gsub(e,u2)));
816: p1=gsub(gmul(polx[0],p1),gmul(e,u3));
817: return p1;
818: }
819: default: p1=cgetg(2,t_VEC); p2=cgetg(3,t_VEC); p3=cgetg(2,t_VEC);
820: p4=cgetg(2,t_VEC); p3[1]=zero; p4[1]=un;
821: p2[1]=(long)p3; p2[2]=(long)p4; p1[1]=(long)p2;
822: zet=gmodulcp(polx[vnf],phiell);
823: listr=cgetg(m+1,t_VEC);
824: listr[1]=un;
825: for (i=2; i<=m; i++) listr[i]=(long)modii(mulii((GEN)listr[i-1],g),gell);
826: veczi=cgetg(m+1,t_VEC);
827: for (b=0; b<m; b++)
828: {
829: s=gzero;
830: for (a=0; a<m; a++)
831: s=gadd(gmul(polx[0],s),modii(mulii((GEN)listr[b+1],(GEN)listr[a+1]),gell));
832: veczi[b+1]=(long)s;
833: }
834: for (j=0; j<ell; j++)
835: {
836: vecci=cgetg(m+1,t_VEC);
837: for (b=0; b<m; b++) vecci[b+1]=(long)gpui(zet,mulsi(j,(GEN)listr[b+1]),0);
838: p4=cgetg(3,t_VEC);
839: p4[1]=(long)veczi; p4[2]=(long)vecci;
840: p1=mulpoltau(p1,p4);
841: }
842: powtaubet=cgetg(m+1,t_VEC);
843: powtaubet[1]=(long)be;
844: for (i=2; i<=m; i++) powtaubet[i]=(long)gsubst(lift((GEN)powtaubet[i-1]),vnf,U);
845: err(impl,"difficult Kummer for ell>=7"); return gzero;
846: }
847: return NULL; /* not reached */
848: }
849:
850: /* multiply be by ell-th powers of units as to find "small" L2-norm for new be */
851: static GEN
852: reducebeta(GEN be)
853: {
854: long i,lu;
855: GEN p1,p2,unitsell,unitsellinv,nmax,ben;
856:
857: unitsell=grouppows(gmodulcp(concatsp(gmael(bnfz,8,5),gmael3(bnfz,8,4,2)),R),ell);
858: unitsellinv=grouppows(unitsell,-1);
859: unitsell=concatsp(unitsell,unitsellinv);
860: p1=unitsell;
861: for (i=2; i<=max((ell>>1),3); i++) p1=concatsp(p1,grouppows(unitsell,i));
862: unitsell=p1;
863: nmax=gnorml2(algtobasis(nfz,be));
864: lu=lg(unitsell)-1; ben=be;
865: do
866: {
867: be=ben;
868: for (i=1; i<=lu; i++)
869: {
870: p1=gmul(be,(GEN)unitsell[i]);
871: p2=gnorml2(algtobasis(nfz,p1));
872: if (gcmp(p2,nmax)<0)
873: {
874: nmax=p2; ben=p1;
875: }
876: }
877: }
878: while (!gegal(be,ben));
879: return be;
880: }
881:
882: static GEN
883: testx(GEN subgroup, GEN X, long prec)
884: {
885: long i,v;
886: GEN be,polrelbe,p1;
887:
888: /* in alg. 5.3.18., C=nbcol */
889: X=gmul(unmodell,X);
890: if (gcmp0(X)) return gzero;
891: for (i=dv+1; i<=nbcol; i++) if (gcmp0((GEN)X[i])) return gzero;
892: for (i=1; i<=lSml2; i++)
893: if (gcmp0(gmul((GEN)vecMsup[i],X))) return gzero;
894: be=gun;
895: for (i=1; i<=nbcol; i++) be=gmul(be,gpui((GEN)vecw[i],lift((GEN)X[i]),0));
896: if (DEBUGLEVEL>=2) { fprintferr("reducing beta = "); outerr(be); }
897: be=reducebeta(be);
898: if (DEBUGLEVEL>=2) { fprintferr("beta reduced = "); outerr(be); }
899: polrelbe=computepolrelbeta(be);
900: v=varn(polrelbe);
901: p1=unifpol((GEN)bnf[7],polrelbe,0);
902: p1=denom(gtovec(p1));
903: polrelbe=gsubst(polrelbe,v,gdiv(polx[v],p1));
904: polrelbe=gmul(polrelbe,gpuigs(p1,degree(polrelbe)));
905: if (DEBUGLEVEL>=2) { fprintferr("polrelbe = "); outerr(polrelbe); }
906: p1=rnfconductor(bnf,polrelbe,prec);
907: if (!gegal((GEN)p1[1],module)) return gzero;
908: if (!gegal((GEN)p1[3],subgroup)) return gzero;
909: return polrelbe;
910: }
911:
912: GEN
913: rnfkummer(GEN bnr, GEN subgroup, long all, long prec)
914: {
915: long i,j,av=avma,tetpil,llistpr,lfactell,e,vp,vd,ind;
916: GEN p1,p2,p3,p4,wk;
917: GEN rayclgp,bid,ideal;
918: GEN kk,clgp,fununits,torsunit,vecB,vecC,Tc,Tv,P;
919: GEN Q,Qt,idealz,gothf,factgothf,listpr,listex,factell,pp,p,pr,z,vecnul;
920: GEN M,al,K,Msup,X,finalresult,y,cycpro;
921:
922: checkbnrgen(bnr);
923: wk=gmael4(bnr,1,8,4,1);
924: if (all) gell=stoi(all);
925: else
926: {
927: if (!gcmp0(subgroup)) gell=det(subgroup);
928: else gell=det(diagonal(gmael(bnr,5,2)));
929: }
930: if (gcmp1(gell)) { avma = av; return polx[varn(gmael3(bnr,1,7,1))]; }
931: if (!isprime(gell)) err(impl,"kummer for composite relative degree");
932: if (divise(wk,gell))
933: return gerepileupto(av,rnfkummersimple(bnr,subgroup,all,prec));
934: if (all && gcmp0(subgroup))
935: err(talker,"kummer when zeta not in K requires a specific subgroup");
936: bnf=(GEN)bnr[1];
937: nf=(GEN)bnf[7];
938: polnf=(GEN)nf[1]; vnf=varn(polnf); degK=degree(polnf);
939: if (!vnf) err(talker,"main variable in kummer must not be x");
940: /* step 7 */
941: p1=conductor(bnr,subgroup,2,prec);
942: /* fin step 7 */
943: bnr=(GEN)p1[2];
944: rayclgp=(GEN)bnr[5];
945: raycyc=(GEN)rayclgp[2]; lraycyc=lg(raycyc)-1;
946: bid=(GEN)bnr[2]; module=(GEN)bid[1];
947: ideal=(GEN)module[1];
948: if (gcmp0(subgroup)) subgroup = diagonal(raycyc);
949: ell=itos(gell);
950: unmodell=gmodulss(1,ell);
951: /* step 1 of alg 5.3.5. */
952: if (DEBUGLEVEL>=3) { fprintferr("Step 1\n"); flusherr(); }
953: phiell=cyclo(ell,vnf);
954: p1=(GEN)compositum2(polnf,phiell)[1];
955: kk=(GEN)p1[4];
956: R=(GEN)p1[1];
957: A1=(GEN)p1[2];
958: A2=(GEN)p1[3];
959: if (signe(leadingcoeff(R))<0)
960: {
961: R=gneg_i(R); A1=gmodulcp(lift(A1),R); A2=gmodulcp(lift(A2),R);
962: }
963: /* step 2 */
964: if (DEBUGLEVEL>=3) { fprintferr("Step 2\n"); flusherr(); }
965: degKz=degree(R);
966: m=degKz/degK;
967: d=(ell-1)/m;
968: g=lift(gpuigs(gener(gell),d));
969: if (gcmp1(lift(gpuigs(gmodulcp(g,stoi(ell*ell)),m)))) g=addsi(ell,g);
970: /* step reduction of R */
971: if (degKz<=20)
972: {
973: GEN A3,A3rev;
974:
975: if (DEBUGLEVEL>=3) { fprintferr("Step reduction\n"); flusherr(); }
976: p1=polredabs2(R,prec);
977: if (DEBUGLEVEL>=3) { fprintferr("polredabs = ");outerr((GEN)p1[1]); }
978: R=(GEN)p1[1];
979: A3=(GEN)p1[2];
980: A1=gsubst(lift(A1),vnf,A3);
981: A2=gsubst(lift(A2),vnf,A3);
982: A3rev=polymodrecip(A3);
983: U=gadd(gpui(A2,g,0),gmul(kk,A1));
984: U=gsubst(lift(A3rev),vnf,U);
985: }
986: else U=gadd(gpui(A2,g,0),gmul(kk,A1));
987: /* step 3 */
988: /* on peut factoriser disc(R) avec th. 2.1.6. */
989: if (DEBUGLEVEL>=3) { fprintferr("Step 3\n"); flusherr(); }
990: bnfz=bnfinit0(R,0,NULL,prec); nfz=(GEN)bnfz[7];
991: clgp=gmael(bnfz,8,1);
992: cyc=(GEN)clgp[2]; gc=lg(cyc)-1; gencyc=(GEN)clgp[3];
993: for (j=1; j<=gc && divise((GEN)cyc[j],gell); j++);
994: rc=j-1;
995: vecalpha=cgetg(gc+1,t_VEC);
996: for (j=1; j<=gc; j++)
997: {
998: p1 = idealpow(nfz,(GEN)gencyc[j],(GEN)cyc[j]);
999: p1 = (GEN)isprincipalgenforce(bnfz, p1)[2];
1000: vecalpha[j] = (long)basistoalg(nfz, p1);
1001: }
1002: fununits = check_units(bnfz,"rnfkummer");
1003: torsunit = gmael3(bnfz,8,4,2);
1004: ru=(degKz>>1)-1;
1005: rv=rc+ru+1;
1006: vselmer=cgetg(rv+1,t_VEC);
1007: for (j=1; j<=rc; j++) vselmer[j]=vecalpha[j];
1008: for ( ; j<rv; j++) vselmer[j]=(long)gmodulcp((GEN)fununits[j-rc],R);
1009: vselmer[rv]=(long)gmodulcp((GEN)torsunit,R);
1010: /* computation of the uu(j) (see remark 5.2.15.) */
1011: uu=cgetg(gc+1,t_VEC);
1012: for (j=1; j<=rc; j++) uu[j]=zero;
1013: for ( ; j<=gc; j++) uu[j]=(long)lift(ginv(gmodulcp((GEN)cyc[j],gell)));
1014: /* step 4 */
1015: if (DEBUGLEVEL>=3) { fprintferr("Step 4\n"); flusherr(); }
1016: vecB=cgetg(rc+1,t_VEC);
1017: Tc=cgetg(rc+1,t_MAT);
1018: for (j=1; j<=rc; j++)
1019: {
1020: p1=isprincipalell(tauofideal((GEN)gencyc[j]));
1021: vecB[j]=p1[2];
1022: Tc[j]=p1[1];
1023: }
1024: p1=cgetg(m,t_VEC);
1025: p1[1]=(long)idmat(rc);
1026: for (j=2; j<=m-1; j++) p1[j]=lmul((GEN)p1[j-1],Tc);
1027: p2=cgetg(rc+1,t_VEC);
1028: for (j=1; j<=rc; j++) p2[j]=un;
1029: p3=vecB;
1030: for (j=1; j<=m-1; j++)
1031: {
1032: p3=gsubst(lift(p3),vnf,U);
1033: p4=groupproduct(grouppows(p3,(j*d)%ell),(GEN)p1[m-j]);
1034: for (i=1; i<=rc; i++) p2[i]=lmul((GEN)p2[i],(GEN)p4[i]);
1035: }
1036: vecC=p2;
1037: /* step 5 */
1038: if (DEBUGLEVEL>=3) { fprintferr("Step 5\n"); flusherr(); }
1039: Tv=cgetg(rv+1,t_MAT);
1040: for (j=1; j<=rv; j++)
1041: {
1042: Tv[j]=isvirtualunit(gsubst(lift((GEN)vselmer[j]),vnf,U))[1];
1043: if (DEBUGLEVEL>=3) { fprintferr(" %ld\n",j); flusherr(); }
1044: }
1045: P=lift(ker(gmul(unmodell,gsub(Tv,gmul(g,idmat(rv))))));
1046: dv=lg(P)-1;
1047: vecw=cgetg(dv+1,t_VEC);
1048: for (j=1; j<=dv; j++)
1049: {
1050: p1=gun;
1051: for (i=1; i<=rv; i++) p1=gmul(p1,gpui((GEN)vselmer[i],gcoeff(P,i,j),0));
1052: vecw[j]=(long)p1;
1053: }
1054: /* step 6 */
1055: if (DEBUGLEVEL>=3) { fprintferr("Step 6\n"); flusherr(); }
1056: Q=ker(gmul(unmodell,gsub(gtrans(Tc),gmul(g,idmat(rc)))));
1057: Qt=gtrans(Q);
1058: dc=lg(Q)-1;
1059: /* step 7 done above */
1060: /* step 8 */
1061: if (DEBUGLEVEL>=3) { fprintferr("Step 7 and 8\n"); flusherr(); }
1062: idealz=lifttokz(ideal);
1063: computematexpoteta1();
1064: if (!divise(idealnorm(nf,ideal),gell)) gothf=idealz;
1065: else
1066: {
1067: GEN subgroupz;
1068:
1069: polrel=computepolrel();
1070: steinitzZk=steinitzaux(idmat(degKz));
1071: subgroupz=invimsubgroup(bnr,subgroup,idealz,prec);
1072: gothf=conductor(bnrz,subgroupz,0,prec);
1073: }
1074: /* step 9 */
1075: if (DEBUGLEVEL>=3) { fprintferr("Step 9\n"); flusherr(); }
1076: factgothf=idealfactor(nfz,gothf);
1077: listpr=(GEN)factgothf[1]; listex=(GEN)factgothf[2]; llistpr=lg(listpr)-1;
1078: factell=primedec(nfz,gell); lfactell=lg(factell)-1;
1079: /* step 10 and step 11 */
1080: if (DEBUGLEVEL>=3) { fprintferr("Step 10 and 11\n"); flusherr(); }
1081: Sm=cgetg(1,t_VEC);Sml1=cgetg(1,t_VEC);Sml2=cgetg(1,t_VEC);Sl=cgetg(1,t_VEC);
1082: ESml2=cgetg(1,t_VEC);
1083: for (i=1; i<=llistpr; i++)
1084: {
1085: pp=cgetg(2,t_VEC); pp[1]=listpr[i];
1086: p=gmael(pp,1,1); e=itos(gmael(pp,1,3));
1087: if (!gegal(p,gell))
1088: {
1089: if (!gcmp1((GEN)listex[i])) { avma=av; return gzero; }
1090: if (!isconjinprimelist(Sm,(GEN)pp[1])) Sm=concatsp(Sm,pp);
1091: }
1092: else
1093: {
1094: vp=itos((GEN)listex[i]); vd=(vp-1)*(ell-1)-ell*e;
1095: if (vd > 0) { avma=av; return gzero; }
1096: if (vd==0)
1097: {
1098: if (!isconjinprimelist(Sml1,(GEN)pp[1])) Sml1=concatsp(Sml1,pp);
1099: }
1100: else
1101: {
1102: if (vp==1) { avma=av; return gzero; }
1103: if (!isconjinprimelist(Sml2,(GEN)pp[1]))
1104: {
1105: Sml2=concatsp(Sml2,pp); ESml2=concatsp(ESml2,(GEN)listex[i]);
1106: }
1107: }
1108: }
1109: }
1110: for (i=1; i<=lfactell; i++)
1111: if (!idealval(nfz,gothf,(GEN)factell[i]))
1112: {
1113: pp=cgetg(2,t_VEC); pp[1]=factell[i];
1114: if (!isconjinprimelist(Sl,(GEN)pp[1])) Sl=concatsp(Sl,pp);
1115: }
1116: lSml2=lg(Sml2)-1; lSl=lg(Sl)-1; lSl2=lSml2+lSl;
1117: Sp=concatsp(Sm,Sml1); lSp=lg(Sp)-1;
1118: /* step 12 */
1119: if (DEBUGLEVEL>=3) { fprintferr("Step 12\n"); flusherr(); }
1120: vecbetap=cgetg(lSp+1,t_VEC);
1121: vecalphap=cgetg(lSp+1,t_VEC);
1122: matP=cgetg(lSp+1,t_MAT);
1123: gg=gmodulcp(g,gell);
1124: for (j=1; j<=lSp; j++)
1125: {
1126: p1=isprincipalell((GEN)Sp[j]);
1127: matP[j]=p1[1];
1128: p2=gun;
1129: for (i=1; i<=rc; i++)
1130: p2=gmul(p2,gpui((GEN)vecC[i],gmael(p1,1,i),0));
1131: p3=gdiv((GEN)p1[2],p2); vecbetap[j]=(long)p3;
1132: p2=gun;
1133: for (i=0; i<m; i++)
1134: {
1135: p2=gmul(p2,gpui(p3,lift(gpuigs(gg,m-1-i)),0));
1136: if (i<m-1) p3=gsubst(lift(p3),vnf,U);
1137: }
1138: vecalphap[j]=(long)p2;
1139: }
1140: /* step 13 */
1141: if (DEBUGLEVEL>=3) { fprintferr("Step 13\n"); flusherr(); }
1142: nbcol=lSp+dv;
1143: vecw=concatsp(vecw,vecbetap);
1144: listmod=cgetg(lSl2+1,t_VEC);
1145: listunif=cgetg(lSl2+1,t_VEC);
1146: listprSp=cgetg(lSl2+1,t_VEC);
1147: for (j=1; j<=lSml2; j++)
1148: {
1149: pr=(GEN)Sml2[j]; z=addsi(1,mulsi(ell,divis((GEN)pr[3],ell-1)));
1150: listmod[j]=(long)idealpow(nfz,pr,gsub(z,(GEN)ESml2[j]));
1151: listunif[j]=(long)basistoalg(nfz,gdiv((GEN)pr[5],(GEN)pr[1]));
1152: listprSp[j]=(long)pr;
1153: }
1154: for ( ; j<=lSl2; j++)
1155: {
1156: pr=(GEN)Sl[j-lSml2]; z=mulsi(ell,divis((GEN)pr[3],ell-1));
1157: listmod[j]=(long)idealpow(nfz,pr,z);
1158: listunif[j]=(long)basistoalg(nfz,gdiv((GEN)pr[5],(GEN)pr[1]));
1159: listprSp[j]=(long)pr;
1160: }
1161: /* step 14 and step 15 */
1162: if (DEBUGLEVEL>=3) { fprintferr("Step 14 and 15\n"); flusherr(); }
1163: listbid=cgetg(lSl2+1,t_VEC);
1164: listellrank=cgetg(lSl2+1,t_VEC);
1165: for (i=1; i<=lSl2; i++)
1166: {
1167: listbid[i]=(long)zidealstarinitgen(nfz,(GEN)listmod[i]);
1168: cycpro=gmael3(listbid,i,2,2);
1169: for (j=1; (j<lg(cycpro)) && (divise((GEN)cycpro[j],gell)); j++);
1170: listellrank[i]=lstoi(j-1);
1171: }
1172: mginv=lift(gmulsg(m,ginv(gg)));
1173: vecnul=cgetg(dc+1,t_COL); for (i=1; i<=dc; i++) vecnul[i]=zero;
1174: M=cgetg(nbcol+1,t_MAT);
1175: for (j=1; j<=dv; j++)
1176: {
1177: p1=cgetg(1,t_COL);
1178: al=(GEN)vecw[j];
1179: for (ind=1; ind<=lSl2; ind++) p1=concatsp(p1,ideallogaux(ind,al));
1180: p1=gmul(mginv,p1);
1181: M[j]=(long)concatsp(p1,vecnul);
1182: }
1183: for ( ; j<=nbcol; j++)
1184: {
1185: p1=cgetg(1,t_COL);
1186: al=(GEN)vecalphap[j-dv];
1187: for (ind=1; ind<=lSl2; ind++) p1=concatsp(p1,ideallogaux(ind,al));
1188: M[j]=(long)concatsp(p1,gmul(Qt,(GEN)matP[j-dv]));
1189: }
1190: M=gmul(unmodell,M);
1191: /* step 16 */
1192: if (DEBUGLEVEL>=3) { fprintferr("Step 16\n"); flusherr(); }
1193: K=ker(M);
1194: dK=lg(K)-1;
1195: if (!dK) { avma=av; return gzero; }
1196: /* step 17 */
1197: if (DEBUGLEVEL>=3) { fprintferr("Step 17\n"); flusherr(); }
1198: listmodsup=cgetg(lSml2+1,t_VEC);
1199: listbidsup=cgetg(lSml2+1,t_VEC);
1200: listellranksup=cgetg(lSml2+1,t_VEC);
1201: for (j=1; j<=lSml2; j++)
1202: {
1203: listmodsup[j]=(long)idealmul(nfz,(GEN)listprSp[j],(GEN)listmod[j]);
1204: listbidsup[j]=(long)zidealstarinitgen(nfz,(GEN)listmodsup[j]);
1205: cycpro=gmael3(listbidsup,j,2,2);
1206: for (i=1; (i<lg(cycpro)) && (divise((GEN)cycpro[i],gell)); i++);
1207: listellranksup[j]=lstoi(i-1);
1208: }
1209: vecMsup=cgetg(lSml2+1,t_VEC);
1210: for (i=1; i<=lSml2; i++)
1211: {
1212: Msup=cgetg(nbcol+1,t_MAT); vecMsup[i]=(long)Msup;
1213: for (j=1; j<=dv; j++) Msup[j]=lmul(mginv,ideallogauxsup(i,(GEN)vecw[j]));
1214: for ( ; j<=nbcol; j++) Msup[j]=(long)ideallogauxsup(i,(GEN)vecalphap[j-dv]);
1215: }
1216: /* step 18 */
1217: if (DEBUGLEVEL>=3) { fprintferr("Step 18\n"); flusherr(); }
1218: do
1219: {
1220: y=cgetg(dK,t_VEC);
1221: for (i=1; i<dK; i++) y[i]=zero;
1222: /* step 19 */
1223: LAB19:
1224: X=(GEN)K[dK];
1225: for (j=1; j<dK; j++) X=gadd(X,gmul((GEN)y[j],(GEN)K[j]));
1226: finalresult=testx(subgroup,X,prec);
1227: if (!gcmp0(finalresult))
1228: {
1229: tetpil=avma; return gerepile(av,tetpil,gcopy(finalresult));
1230: }
1231: /* step 20 */
1232: i=dK;
1233: /* step 21 */
1234: LAB21:
1235: i--;
1236: /* step 22 */
1237: if (i)
1238: {
1239: y[i]=(long)addsi(1,(GEN)y[i]);
1240: if (i<dK-1) y[i+1]=zero;
1241: if (cmpii((GEN)y[i],gell) >= 0) goto LAB21; else goto LAB19;
1242: }
1243: dK--;
1244: }
1245: while (dK);
1246: avma=av; return gzero;
1247: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>