Bill Allombert on Sun, 30 Nov 2008 13:42:44 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Difficulty with binary quadratic equation solver |
On Fri, Nov 28, 2008 at 09:36:47AM -0700, Kurt Foster wrote: > Bill provides the example > > [a,b,c,d,e,f] = [1,0,-5,1,1,2] (I'd like to note that http://www.alpertron.com.ar/QUAD.HTM does not handle that equation either, so we cannot compare the results). > for which the field discriminant N = 5, the index m is 2, U = > (B.fu)^2, the smallest value of k is 3, and plowing through the > calculations by hand shows that there are two "inequivalent" solutions > > [x,y] = [1,1] and [-5, -2] > > For a given positive fundamental discriminant N and index m > 1, > determining the exact smallest value of k for which U^k is in O has > proven to be rather exasperating, although certain multiples of it are > easy to find. I've dug into it a fair bit, but I'm sure this is a > known calculation. Can someone provide a reference? Well, we can use the ray class number formula that give the ray class number in term of the class number: h_f=h*Phi(f)/phi(f)/k So the following should compute k: K=bnfinit(x^2-b*x+a*c); B=bnrinit(K,K.index); k=K.no*B.bid.no/(eulerphi(K.index)*B.no); I join a new version of queq.gp that use this formula. Cheers, Bill.
qeeval(Q,v)=local(a=Q[1],b=Q[2],c=Q[3],d=Q[4],e=Q[5],f=Q[6],x=v[1],y=v[2]);a*x^2+b*x*y+c*y^2+d*x+e*y+f qered(Q)= { local(a=Q[1],b=Q[2],c=Q[3],d=Q[4],e=Q[5],f=Q[6],F,u,v); F=[2*a,b;b,2*c]^-1*[-d,-e]~;u=F[1];v=F[2]; D=denominator(content(F)); [D^2*(u^2*a+v*u*b+v^2*c+u*d+v*e+f),D,D*u,D*v] } qesolve(Q)= { local(a,b,c,f,V,K,B,d,L,w,U,Ud,S=List(),idx); local(R,D,M,u,v); a=Q[1];b=Q[2];c=Q[3]; if (issquare(b^2-4*a*c),error("reducible equation")); R=qered(Q); f=R[1]; D=R[2]; K=bnfinit(x^2-b*x+a*c); L=bnfisintnorm(K,-f*a); if (#K.fu, idx=K.index; B=bnrinit(K,idx); d=K.no*B.bid.no/(eulerphi(idx)*B.no); U=K.fu[1]; if (norm(U)==-1,U=U^2); ,d=1; U=1); for(i=1,#L, for(j=0,K.tu[1]-1, for(k=0,d-1, w=U^k*L[i]*K.tu[2]^j; w=lift(w); u=polcoeff(w,0); v=polcoeff(w,1); if (denominator(u)!=1 || denominator(v)!=1,next); if (u%a!=0,next,u\=a); if ((R[3]-u)%D!=0,next,u=(R[3]-u)\D); if ((R[4]-v)%D!=0,next,v=(R[4]-v)\D); listput(S,[u,v]); )));Vec(S) }