chk(q,V,n)=if(#Set(V)!=#V,return(0));for(i=1,#V,if(qfeval(q,V[i])!=n,return(0)));1;

bqfb(N=10000)=
{
  my(p,d,r,V,q,q2,Q,Q2);
  for(i=1,N,
    until(!issquare(d) && (d%4==0 || d%4==1),d=random(4000)-2000);
    until(p==1 || kronecker(d,p)>=0,
      p=random(1000)-100;
      if(p<3,p=1,p=nextprime(p)));
    q=qfbprimeform(d,p); V=Vec(q); q2=Qfb(V[3],V[2],V[1]);
    until(Q!=0||Q2!=0,r=random([-1000,30000]);
      Q=qfbsolve(q,r,1);Q2=qfbsolve(q2,r,1));
    if(Q2==0||!chk(q2,Q2,r),print("qfbsolve(",q2,",",r,")!=",Q2);break);
    if(Q==0 ||!chk(q,Q,r),print("qfbsolve(",q,",",r,")!=",Q);break));
}
bqfb();
test(v,N,flag=1)=
{
  my([a,b,c]=v, q=Qfb(a,b,c));
  for(i=-N,N,my(Q=qfbsolve(q,i,flag));if(Q,print(v,":",i,":",Q)));
}
test([1,1,1],30);
test([1,29,271],300);
test([1,29,271],300,2);
test([1,29,271],300,3);
test([2,1,3],30);
test([3,4,5],30);
test([3,4,5],30,2);
test([3,4,5],30,3);
test([5,1,-9],30);
test([5,16,7],30);
test([5,16,7],30,2);
test([5,16,7],30,3);
N=2^128+1; F=[59649589127497217,1;5704689200685129054721,1];
qfbsolve(Qfb(1,0,1),F)
qfbsolve(Qfb(1,0,1),F,1)
qfbsolve(Qfb(1,0,1),[N,F])
qfbsolve(Qfb(1,0,1),[N,F],1)
qfbsolve(Qfb(5,16,7),factor(-30),1)
qfbsolve(Qfb(1,0,7*16),128,1)

\\ incorrect factorization
qfbsolve(Qfb(1,0,1),Mat([2^198-3,1]))
qfbsolve(Qfb(1,0,1),Mat([2^198-3,1]),1)
\\ ERRORS
qfbsolve(Qfb(1,0,1),1,4)
