\\
\\ x400.gp
\\
\\  find integer x,y,z,w such that A^4+B^4+2*n^2*C^4=4*D^4 and gcd(A,B,C,D)=1.
\\
\\   x+y=A/D, x-y=B/D, t=C/D
\\   2*(x^4+6*^2*y^2+y^4)+2*n^2*t^4-4
\\   x^4+6*^2*y^2+y^4+n^2*t^4-2
\\
\\        {(u^2+1)}*y^2 =  -(u^2+4*u+5)*x^2-(u^2+2*u-1)
\\   \pm{n*(u^2+1)}*t^2 = 2*(u-2+2*u^1)*x^2+(u^2-2*u-1)
\\
\\
\\
\\   A(u)=u^2+4*u+5
\\   B(u)=u^2+2*u-1
\\   C(u)=u^2-2*u-1
\\
\\        \pm{(u^2+1)}*y^2 =   A(u)*x~2+B(u)
\\      \pm{n*(u-2+1)}*t^2 = 2*B(u)*x^2+C(u)
\\ 
\\ 
\\


\r syzygy3.gp

A(u)=u^2+4*u+5;
B(u)=u^2+2*u-1;
C(u)=u^2-2*u-1;

YY2(u,x)=(-A(u)*x^2-B(u))/(u^2+1);
TT2(n,u,x)=(2*B(u)*x^2+C(u))/(n*(u^2+1));

\\
\\  utau : u  ---> (u-2)/(u-1)
\\

utau(u)=if(u=0,[0],-1/(n1*n2*u));


\\ TT2(u)=751689*u^4 - 1326510*u^3 + 1307436*u^2 - 456042*u + 97971;
\\ v=[751689, -1326510, 1307436, -456042, 97971];

gg(n,u)=
{
  local(d,d2,y2,t2);

  y2=YY2(u,x);
  t2=TT2(n,u,x);
  d=denominator(polcoeff(y2,0));
  d2=denominator(polcoeff(t2,0));
  y2=y2*d^2;
  t2=t2*d2^2;
  
  print("ratpoints '",polcoeff(y2,0)," ",polcoeff(y2,1)," ",polcoeff(y2,2),"' 10000");

  print("ratpoints '",polcoeff(t2,0)," ",polcoeff(t2,1)," ",polcoeff(t2,2),"' 10000");
  print("ratpoints '",polcoeff(-t2,0)," ",polcoeff(-t2,1)," ",polcoeff(-t2,2),"' 10000");

 [x2,t2]
}

\\ h(r)=[sqrt(numerator(r)),sqrt(denominator(r))];

h(a)=local(n,d);n=numerator(a);d=denominator(a);if(issquare(n) && issquare(d),sqrtint(n)/sqrtint(d),[]);
h2(a)=local(b);b=core(a);[b,sqrtint(a/b)];


YY(u,x0)=h(abs(YY2(u,x0)));
TT(n,u,x0)=h(abs(TT2(n,u,x0)));
NN(x,y,z,t)=(4*t^4-x^4-y^4)/(2*z^4);

nn(x,y,z,t)=
{
  local(N);

  N=NN(x,y,z,t);
  h(N)
}


uu(n,x,y,z,t)=
{
  local(i,j,x2,y2,m1,m2,m3,m4,k1,k2,k3,k4,v,cc);

  v=vector(10);
  cc=0;

  x2=(x+y)/2;
  y2=(x-y)/2;

  m1=factor((y2/t)^2-YY2(u,x2/t));
  m2=factor((z/t)^2-TT2(n,u,x2/t));
  m3=factor((z/t)^2+TT2(n,u,x2/t));

  print(m1);
  print(m2);
  print(m3);
  
  k1=matsize(m1)[1];
  k2=matsize(m2)[1];
  k3=matsize(m3)[1];

\\  print(k1);
\\  print(k2);
\\  print(k3);

  for(i=1,k1,
    if(poldegree(m1[i,1])==1 && m1[i,2]>0,
      for(j=1,k2,
        if(poldegree(m2[j,1])==1 && m2[j,2]>0 && m1[i,1]==m2[j,1],
          cc=cc+1;
	  v[cc]=-polcoeff(m1[i,1],0)/polcoeff(m1[i,1],1)
        )
      );
      for(j=1,k3,
        if(poldegree(m3[j,1])==1 && m3[j,2]>0 && m1[i,1]==m3[j,1],
          cc=cc+1;
	  v[cc]=-polcoeff(m1[i,1],0)/polcoeff(m1[i,1],1)
        )
      )
    )
  );

  v=v[1..cc];
  v=vecsort(v,(x,y)->ht(x)-ht(y))
}



xx(u,x0,y0)=
{ 
  local(P);

\\    print("[u,x0,y0]=",[u,x0,y0]);
    if(YY2(u,x0)==y0^2,
    print("(3a+) YY2(x)=",YY2(u,x));
    P=(YY2(u,x)-(k*(x-x0)+y0)^2)/(x-x0),

    print("(3a-) YY2(x)=",-YY2(u,x));
    P=(-YY2(u,x)-(k*(x-x0)+y0)^2)/(x-x0)
  );
  -polcoeff(P,0,'x)/polcoeff(P,1,'x)    
}

xxt(n,u,x0,t0)=
{ 
  local(P);

  print("n1=",n);
  if(TT2(n,u,x0)==t0^2,
    P=(TT2(n,u,x)-(k*(x-x0)+t0)^2)/(x-x0);
    print("(3b+) TT2(x)=",TT2(n,u,x)),

    P=(-TT2(n,u,x)-(k*(x-x0)+t0)^2)/(x-x0);
    print("(3b-) TT2(x)=",-TT2(n,u,x))
  );
  -polcoeff(P,0,'x)/polcoeff(P,1,'x)
}


rp4(p)=
{
  local(v);

  v=vector(5,i,polcoeff(p,5-i,'x));

  v=sign(v[1])*v;

  print(v);

  print("ratpoints '",v[5]," ",v[4]," ",v[3]," ",v[2]," ",v[1],"' 10000");

  print(-v);

  print("ratpoints '",-v[5]," ",-v[4]," ",-v[3]," ",-v[2]," ",-v[1],"' 10000");

  v
}


sss4(n,u0,K)=
{
  local(m,k,x,y,x2,y2,z,t,tt,u,w,v,vv,c);

  m=length(K);
  vv=vector(m);
  c=0;

  print("[u0,x0,y0]=",[u0,x0,y0]);
 
  for(i=1,m,
    k=K[i];

    x=xk(k);
    y=k*(x-x0)+y0;
    t=TT(n,u0,x);

\\    print("[x,y,t]=",[x,y,t]);
   
    x2=x+y;
    y2=x-y;
    z=lcm(lcm(denominator(x2),denominator(x2)),denominator(t));

\\    print("[x2,y2,t,z]=",[x2,y2,t,z]);

    v=[abs(x2),abs(y2),abs(t),1]*z;

    if(v[1]>v[2],
       tt=v[1];
       v[1]=v[2];
       v[2]=tt
    );

\\    print("v=",v);

    c=c+1;
    vv[c]=v

  );

  vv=vv[1..c];

  vv=vecsort(vv,(x,y)->x[4]-y[4]);

  w=[0,0,0,0];

  c=0;
  for(i=1,#vv,
    v=vv[i];
    if(v != w,
      c=c+1;
      print(v[1],"^4+",v[2],"^4+",2*n^2,"*",v[3],"^4=4*",v[4],"^4");
      w=v
    )
  );

  c

}


sss4t(n,u0,K)=
{
  local(m,k,x,y,x2,y2,z,t,tt,u,w,v,vv,c);

  m=#K;
  vv=vector(m);
  c=0;
  
  print("[u0,x0,t0]=",[u0,x0,t0]);

  for(i=1,m,
    k=K[i];

    x=xkt(k);
    t=k*(x-x0)+t0;
    y=YY(n,u0,x);

    x2=x+y;
    y2=x-y;
    z=lcm(lcm(denominator(x2),denominator(y2)),denominator(t));
    v=[abs(x2),abs(y2),abs(t),1]*z;

    if(v[1]>v[2],
      tt=v[1];
      v[1]=v[2];
      v[2]=tt
    );

    c=c+1;
    vv[c]=v
  );

  vv=vv[1..c];

  vv=vecsort(vv,(x,y)->x[4]-y[4]);

  w=[0,0,0,0];

  c=0;
  for(i=1,#vv,
    v=vv[i];
    if(v != w,
      c=c+1;
      print(v[1],"^4+",v[2],"^4+",2*n^2,"*",v[3],"^4=4*",v[4],"^4");
      w=v
    )
  );

  c

}



QQ(e,x)=[x,ellordinate(e,x)[1]];

\\ v,e0,T0,P1,P2,P3: fixed

r1(m,e0,P1)=ellpow(e0,P1,m);
r1t(m,e0,P1,T0)=elladd(e0,T0,r1(m,e0,P1));


r2(m,n,e0,P1,P2)=elladd(e0,ellpow(e0,P1,m),ellpow(e0,P2,n));
r2t(m,n,e0,P1,P2,T0)=elladd(e0,T0,r2(m,n,e0,P1,P2));

r3(m,n,k,e0,P1,P2,P3)=elladd(e0,ellpow(e0,P1,m),elladd(e0,ellpow(e0,P2,n),ellpow(e0,P3,k)));
r3t(m,n,k,e0,P1,P2,P3,T0)=elladd(e0,T0,r3(m,n,k,e0,P1,P2,P3));

r4(m,n,k,j,e0,P1,P2,P3,P4)=elladd(e0,elladd(e0,ellpow(e0,P1,m),ellpow(e0,P2,n)),elladd(e0,ellpow(e0,P3,k),ellpow(e0,P4,j)));
r4t(m,n,k,j,e0,P1,P2,P3,P4,T0)=elladd(e0,T0,r4(m,n,k,j,e0,P1,P2,P3,P4));

ppp(L,MM)=
{
  local(s,k,w,cc);

  s=length(L);
  w=vector(s);
  cc=0;


  for(i=1,s,
    k=L[i];
    if(lcm(abs(numerator(k)),abs(denominator(k)))<=MM,
      cc=cc+1;
      w[cc]=k
    )
  );

  w=w[1..cc]

}

ht(r)=max(abs(numerator(r)),abs(denominator(r)));

hsort(L,MM)=
{
  local(s,k,k2,w,cc);

  s=length(L);
  w=vector(s,i,[ht(L[i]),L[i]]);

  w=vecsort(w,(x,y)->x[1]-y[1]);
  cc=0;
  k2=0;

  for(i=1,s,
    k=w[i];
    if(k[1]<=MM && k[2]!=k2,
      cc=cc+1;
      w[cc]=k[2];
      k2=k[2]
    )
  );

  w=w[1..cc]

}

ss4(n,u,K)=
{
  local(m,k,x,y,z,t,w,v,v2);

  m=length(K);

  for(i=1,m,
    x=xk(K[i]);
    y=YY(n,u,x);
    t=TT(n,u,x);

\\  print([x,y,z,t]);
   
   z=lcm(lcm(denominator(x),denominator(y)),denominator(t));

   w=[abs(x),abs(y),1,abs(t)]*z;
\\ print(v);

   print(w[1],"^4+",n,"*",w[2],"^4+",4*n,"*",w[3],"^4=",w[4],"^4")
 );

 m

}



RR(x)=
{
  local(m,k);

  m=factor(core(abs(x)));

  k=matsize(m)[1];

  prod(i=1,k,m[i,1]%8==1);

}

R(m,n)=RR(2*m^2+n^2)*RR(2*m^2-4*m*n+n^2);

R2(m,n)=RR(2*m^2*m*n+n^2)*RR(2*m^2+n^2)*RR(2*m^3+2*m*n+n^2);

R3(m,n)=RR(2*m^2-4*m*n+n^2)*RR(2*m^2-2*m*n+n^2)*RR(2*m^2+n^2)*RR(2*m^2+2*m*n+n^2);


\\
\\ square check G(v,x) (mod p)
\\

zz(v,n1,n2)=
{
  local(w,P,d);

  w=[];
  d=gcd(gcd(gcd(v[1],v[2]),gcd(v[3],v[4])),v[5]);
  print("gcd(v[1]..v[5])=",d,"; ",factor(d));
  P=G(v,'k);
  forprime(p=n1,n2,
    if(lift(Mod(P,p))!=0,
      w=zzp(P,p);
      if(w!=[],
        break
      )
    )
  );
  w
}

zz2(P,n1,n2)=
{
  local(m,k,a);

  P=G(v,'k);
  a=polcoeff(P,4);
  forprime(p=n1,n2,
    if(kronecker(a,p)==-1 || kronecker(-a,p)==-1,
      m=factor(Mod(P,p));
      k=matsize(m)[1];
      if((k==1 && m[1,2]%2==0 && polcoeff(m[1,1],0)!=0)
          || (k==2 && m[1,2]%2==0 && m[2,2]%2==0 && polcoeff(m[1,1],0)!=0 && polcoeff(m[2,1],0)!=0),
        print(p,":",m);
        break
      )
    )
  )
}

zzv(v,p)=
{
  local(m,d,a,c,P,k,w);

  w=[];
  P=Mod(G(v,'k),p);
  d=poldegree(P);
  a=lift(polcoeff(P,d));
  c=lift(polcoeff(P,0));

  if(c!=0 && kronecker(a,p)==-1,
    if(d==4 || d==2,
      m=factor(Mod(P,p));
      k=matsize(m)[1];
      if((k==1 && m[1,2]%2==0) || (k==2 && m[1,2]%2==0 && m[2,2]%2==0),
        print(lift(P)," (mod ",p,")");
        print(lift(m)," (mod ",p,")");
        print("kronecker(",a,",",p,")=-1");
        w=[p,lift(P),lift(m)]
      ),
      if(d==0,
        print(lift(P)," (mod ",p,")");
        print("kronecker(",a,",",p,")=-1");
        w=[p,lift(P),lift(m)]
      )
    )
  );
  w
}

zzp(PP,p)=
{
  local(m,d,a,c,k,w,P);

  w=[];
  P=Mod(PP,p);
  d=poldegree(P);
  a=lift(polcoeff(P,d));
  c=lift(polcoeff(P,0));

  if(c!=0 && kronecker(a,p)==-1,
    if(d==4 || d==2,
      m=factor(Mod(P,p));
      k=matsize(m)[1];
      if((k==1 && m[1,2]%2==0) || (k==2 && m[1,2]%2==0 && m[2,2]%2==0),
        print(lift(P)," (mod ",p,")");
        print(lift(m)," (mod ",p,")");
        print("kronecker(",a,",",p,")=-1");
        w=[p,lift(P),lift(m)]
      ),
      if(d==0,
        print(lift(P)," (mod ",p,")");
        print("kronecker(",a,",",p,")=-1");
        w=[p,lift(P),lift(m)]
      )
    )
  );
  w
}

ssu(N)=
{
  local(v,i);

  v=vector(10000);
  i=0;

  forstep(m=0,4*N,4,
    forstep(n=-2*N+1,2*N-1,2,
      if(gcd(m,n)==1 && R3(m,n),
        i=i+1;
        v[i]=[max(abs(m),abs(n)),[m,n]]
      )
    )
  );

  v=v[1..i];

\\  print(v);

  v=vecsort(v,(x,y)->x[1]-y[1]);

\\  print(v);


  for(k=1,i,
    v[k][1]=2*v[k][2][1]/v[k][2][2]
  );

  v
}

ssu1(N)=
{
  local(v,i);

  v=vector(10000);
  i=0;

  forstep(m=0,4*N,4,
    forstep(n=-2*N+1,2*N-1,2,
      if(gcd(m,n)==1 && R(m,n),
        i=i+1;
        v[i]=[max(abs(m),abs(n)),[m,n]]
      )
    )
  );

  v=v[1..i];

\\  print(v);

  v=vecsort(v,(x,y)->x[1]-y[1]);

\\  print(v);


  for(k=1,i,
    v[k][1]=2*v[k][2][1]/v[k][2][2]
  );

  v
}

ppu(U)=vector(length(U),i,U[i][1]);

\\
\\  P(x) is polynomial a*x^2+b*x+c
\\
\\  check
\\   y^2=P(x) (mod p) have no rational solutions for some p.
\\   i.e. kronecker(a*x^2+b*x+c,p)==-1
\\

check(P,pmax)=
{
  local(v,x,ff,a,b,c);
  
  v=vector(3,i,polcoeff(P,3-i,'x));
  a=v[1];
  b=v[2];
  c=v[3];

  forprime(p=17,pmax,
    if(p%8==1,
      ff=0;
      for(x=0,p-1,
        if(kronecker(a*x^2+b*x+c,p)>0,
\\         print([x,p]);
           ff=1
        )
      );
      if(ff==0,
        print("y^2=",P,"have no rational solutions with y!=0 (mod ",p,")");
        break
      )
    )
  );
  ff
}

check2(P,p1,pmax)=
{
  local(v,x,ff,a,b,c);
  
  v=vector(3,i,polcoeff(P,3-i,'x));
  a=v[1];
  b=v[2];
  c=v[3];

\\  print([a,b,c]);

  forprime(p=p1,pmax,
    ff=0;
\\    print("y^2=",a*'x^2+b*'x+c,"(mod ",p,")");
    for(x=0,p-1,
      if(kronecker(a*x^2+b*x+c,p)>0,
\\      print([x]);
        ff=1
      )
    );
    if(ff==0,
      print("y^2=",P," have no rational solutions with y!=0 (mod ",p,")");
      break

 \\  ,print("y^2=",P," have some rational solutions with y!=0 (mod ",p,")");	
    )
  );
  ff
}

\\
\\  u0=m/k   gcd(m,k)=1   0< m,k <=N
\\   A(n,u)=n-u^2
\\   B(n,u)=n+u^2
\\             2*u*Y^2=A(n,u)*X~2+2*B(n,u)*X+2*A(n,u)
\\             2*u*T^2=B(n,u)*X^2+2*A(n,u)*X+2*B(n,u)
\\


aa(n,m,k)=n*m^2-k^2;
bb(n,m,k)=n*m^2+k^2;

pr(n,N1,N)=
{
 local(v,dd,dd2,c,A,B,C,A2,B2);

  c=0;

  print("P2<x,y,z> := ProjectiveSpace(Rationals(), 2);");
  
  for(m=1,N,
    for(k=1,N,
      if(max(m,k)>=N1 && gcd(m,k)==1,
        A=aa(n,m,k);
	B=bb(n,m,k);
	C=2*m*k;
	dd=B^2-2*A^2;
	if(dd!=0,
	  c=c+1;
	  print1("/*  u0=",m/n,"  */");
  	  print1(" C1 := Conic(P2, ",-C*y^2+A*x^2+2*B*x*z+2*A*z^2,");");
          print(" A,m:=HasRationalPoint(C1);");
  	  print1("If A then  C1a := Conic(P2, ",-C*y^2+B*x^2+2*A*x*z+2*B*z^2,");");
          print(" HasRationalPoint(C1a);");
  	  print1(" C1b := Conic(P2, ",-C*y^2+B*x^2+2*A*x*z+2*B*z^2,");");
          print(" HasRationalPoint(C1b);");
	  if(c%5==0,
            print("/* ------------------------------------------------ */");
	    c=0,
	    print()
	  )
	)
      )
    )
  )
}


\\
\\  f=TT2(n,u0,xk(x))
\\

PP4(f)=
{
  local(m,h,k,v,d1,d2,d3,d);

  m=factor(f);
  k=matsize(m)[1];
  h=1;
  for(i=1,k,
    if(m[i,2]==-2,
      h=f*(m[i,1])^2;
      v=vector(5,i,polcoeff(h,5-i,'x));
      d1=lcm(denominator(v[1]),denominator(v[5]));
      d2=lcm(denominator(v[2]),denominator(v[4]));
      d3=lcm(d1,d2);
      d=lcm(d3,denominator(v[3]));
      h=h*d*core(d);
      break
    )
  );
  h
}

uxy(u1,x1,y1)=u0=u1;x0=x1;y0=y1;xx(u0,x0,y0);

uxt(n,u1,x1,t1)=u0=u1;x0=x1;t0=t1;xxt(n,u0,x0,t0);

msq(x)=abs(x)*core(x);
