| Karim BELABAS on Wed, 2 Jun 1999 16:42:43 +0200 (MET DST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| 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.
==============================================================
Some comments about the program:
> 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
--
PARI/GP Home Page: http://hasse.mathematik.tu-muenchen.de/ntsw/pari/