Karim BELABAS on Wed, 2 Jun 1999 16:42:43 +0200 (MET DST)

 Re: idealval and galoisapply in 2.15

```[Paul van Wamenlen:]
> The following computes a set of representatives for the galois group
> modulo the decomposition group for a prime above 11 in the 5'th roots
> of unity. In version 2.14 it worked, in 2.15 it fails. Also, according
> to the documentation, nfgaloisapply can take a prime ideal in primedec
> form as a third argument. But gp gives an error message.

Which message? In 2.0.15, I get, eg.

? nfgaloisapply(bnf,gal[3],PPs[1])
%1 = [11, [5, -1, -1, -1]~, 1, 1, [4, 2, 3, -3]~]

If you mean

? nfgaloisapply(bnf,gal[3],PPs)
***   incorrect type in galoisapply.

then this is intended.
[Use: vector(length(PPs), i, nfgaloisapply(bnf,gal[3],PPs[i]))]

==============================================================
I notice two bugs though:

* idealval(nf,I,P) doesn't accept primes in primedec form for I.

* a typo in nfgaloisapply (!= --> ==) hence the result was not necessarily in
HNF form.

Patches follow.

==============================================================

> bnf = bnfinit(polcyclo(5));
> PPs = idealprimedec(bnf,11);\
> P = idealmul(bnf,1,PPs[1]);\

Better: P = idealhnf(bnf,PPs[1]);

> gal = nfgaloisconj(bnf);\

Here, it's irrelevant since the field is quite simple, but you might want to
try (and test...) nfgaloisconj(bnf, 4) which will be much quicker than the
default when it applies (and return 0 quickly if it doesn't).

> GmodD = vector(length(PPs),k,0);\
> for(i=1,length(gal),\
>    dum2 = nfgaloisapply(bnf,gal[i],P);\
>    for(j=1,length(PPs),\
>      if(idealval(bnf,dum2,PPs[j]) == 1,\
>        GmodD[j] = gal[i])));\
> GmodD

A (slightly) better approach, using the fact that two ideals are equal iff
their HNF (on a fixed basis) coincide:

{
HNFs = Set(vector(length(PPs), i, idealhnf(bnf,PPs[i])));
GmodD = vector(length(gal), i,
if (setsearch(HNFs, nfgaloisapply(bnf,gal[i],P)),
gal[i]
)
);
}

Karim.

*** src/basemath/base1.c.orig	Thu May 27 15:03:39 1999
--- src/basemath/base1.c	Wed Jun  2 16:33:00 1999
***************
*** 631,637 ****
if (lg(x[1])!=N+1) err(typeer,"galoisapply");
p1=cgetg(lx,t_MAT);
for (j=1; j<lx; j++) p1[j]=(long)galoisapply(nf,aut,(GEN)x[j]);
!       if (lg(x)!=N+1) p1 = idealhermite(nf,p1);
return gerepileupto(av,p1);
}
err(typeer,"galoisapply");
--- 631,637 ----
if (lg(x[1])!=N+1) err(typeer,"galoisapply");
p1=cgetg(lx,t_MAT);
for (j=1; j<lx; j++) p1[j]=(long)galoisapply(nf,aut,(GEN)x[j]);
!       if (lx==N+1) p1 = idealhermite(nf,p1);
return gerepileupto(av,p1);
}
err(typeer,"galoisapply");
*** src/basemath/base4.c.orig   Thu May 27 18:42:43 1999
--- src/basemath/base4.c        Wed Jun  2 15:59:47 1999
***************
*** 608,619 ****

nf=checknf(nf); checkprimeid(vp);
if (is_extscalar_t(tx) || tx==t_COL) return element_val(nf,ix,vp);
!
!   if (typ(ix)==t_VEC && lg(ix)==3) ix = (GEN) ix[1];
!   N=lgef(nf[1])-3; checkid(ix,N); p=(GEN)vp[1];
!
denx=denom(ix); if (!gcmp1(denx)) ix=gmul(denx,ix);
if (lg(ix) != N+1) ix=idealmat_to_hnf(nf,ix);
for (d=gun,i=1; i<=N; i++) d=mulii(d,gcoeff(ix,i,i));
v=ggval(d,p); vd=ggval(denx,p); e=itos((GEN)vp[3]);
if (!v) return -vd*e;
--- 610,625 ----

nf=checknf(nf); checkprimeid(vp);
if (is_extscalar_t(tx) || tx==t_COL) return element_val(nf,ix,vp);
!   p=(GEN)vp[1]; N=lgef(nf[1])-3;
!   tx = idealtyp(&ix,&a);
denx=denom(ix); if (!gcmp1(denx)) ix=gmul(denx,ix);
+   if (tx != id_MAT)
+     ix = idealhermite_aux(nf,ix);
+   else
+   {
+     checkid(ix,N);
if (lg(ix) != N+1) ix=idealmat_to_hnf(nf,ix);
+   }
for (d=gun,i=1; i<=N; i++) d=mulii(d,gcoeff(ix,i,i));
v=ggval(d,p); vd=ggval(denx,p); e=itos((GEN)vp[3]);
if (!v) return -vd*e;
__
Karim Belabas                    email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud             Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France)           Fax: (00 33) 1 69 15 60 19
--