 restart;maple_mode(1);cas_setup(0,0,0,1,0,1e-10,10,[1,50,0,25],0,0,0); #radians,pas de cmplx, pas de  Sqrt
/* On prend une conique passant par (0,0,1),  puis on change de variable.*/
 C:=14*(x[1])^2+28*x[1]*x[2]+18*x[1]*x[3]+15*(x[2])^2+3*x[2]*x[3]; // add(add(rand(20)()*x[i]*x[j],i=1..3),j=1..2);
 C:=normal(subs(x[1]=x[1]-x[3],x[2]=x[2]-x[3],C));
/*  On cree la fonction associee a l'equation de la conique. On verifie qu'elle£ contient: (1,1,1)*/
 c:=unapply(C,x);c([1,1,1]);
 purge(u,v,a);M:=[1,1,1]+a*[u,v,0];
 s:=simplify(c(M)/a);
 para:=-coeff(s,a,1)*[1,1,1]+coeff(s,a,0)*[u,v,0];
 normal(c(para));  # verification:
 Caff:=normal(c(x,y,1)); # l'equation affine.
 normal([para[1]/para[3],para[2]/para[3]]); # la forme parametrique affine parametree par  P1
 normal(subs(v=1,[para[1]/para[3],para[2]/para[3]]));# la conique affine moins un point  parametree par R
/*  la tangente au point para est la droite AB*/
 A1:=[seq(diff(para[i],u),i=1..3)];
  B1:=[seq(diff(para[i],v),i=1..3)];
 AB:=simplify(a*A1+b*B1);
 factor(c(AB));   # On trouve bien une racine double
 tgte:=add(subs(x[1]=para[1],x[2]=para[2],x[3]=para[3],diff(C,x[i]))*x[i],i=1..3);
/* verification: ca doit etre nul.*/
 simplify(subs(seq(x[i]=A1[i],i=1..3),tgte));
 simplify(subs(seq(x[i]=B1[i],i=1..3),tgte));
paff:=w->(subs(v=1,(w[1]+I*w[2])/w[3]));
 DC:=plotparam(paff(para),u=-5..5,affichage=bleu+line_width_2):
/* La version implicite est ici  plus jolie car on fait bouger le parametre dans un segment£au lieu de R*/
DC:=implicitplot(Caff,x,y,affichage=bleu+line_width_2):
/* -------------------------------------------------------------------------------------*/
/*  On peut param\'etrer les equations cart\'esiennes, ie on en choisit 2£  ind\'ependantes et on regarde leur combinaisons lineaires, ou bien on£ considere une droite projective d ne passant pas par le point O, et£ l'on  identifie les droites passant par O aux droites (OM) lorsque M decrit D*/
purge(s,t):
 A:=matrix(2,2,(i,j)->a[i,j]);
/*  On modelise les droites passant par O1 par leur equations cartesiennes, ie les£ combinaisons lineaires de x et y, et celles passant par O2 comme les droites£ (O2,V) ou V bouge sur une droite ne passant pas par O2. Ex on a choisi pour V£ la droite: y=z. On cree maintenant l'homographie h: (s,t)->(s',t'), qui a la£ droite d'equation  sx+ty=0 associe la  droite passant par O2 et (s',t',t')*/
 tmpV:=A*[[s],[t]]; #On veut que tmpV[i] represente les colonnes de A(s,t).
 V:=[tmpV[1,1],tmpV[2,1],tmpV[2,1]]; #On met le point V sur la droite y=z choisie.
/* c'est plus simple de prendre 1 forme cartesienne, et une parametrique.£ On etudie O_2+l.V inter sx+ty=0*/
 O2:=[0,1,0]; # les coordonees de O_2
 [X,Y,Z]:=O2+l*V;
 L:= solve(s*X+t*Y=0,l);
/*  Attention solve travaille generiquement: par exemple si a(1,1) est nul, il faudrait simplifier par t£  NB det(A) n'est pas nul, donc sa seconde ligne non plus.£  Pb solve a suppose que l'un des 2 coeffs de la seconde ligne est nul en s=0 ou t=0£  le point d'intersection est:*/
 S:=O2+L*V;
/*  Il aurait mieux valu ne pas utiliser solve. par exemple rester en homog\`ene ainsi:*/
 L1:=-coeff(s*X+t*Y,l,1);L2:=coeff(s*X+t*Y,l,0);
 S:=L1*O2+L2*V; 
/*  le cas a(1,1)=0 pose PB. si a(1,1)=0 ca n'est pas bon, il faut simplifier par t*/
 purge(X,Y,Z);
/*  On passe maintenant en version affine  z=1£ Moralement X:=S[1]/S[3];Y:=S[2]/S[3];*/
 P:=subs(t=1,X*S[3]-S[1]);Q:=subs(t=1,Y*S[3]-S[2]);
 R:=resultant(P,Q,s);
 eq:=factor(Z^2*subs(X=X/Z,Y=Y/Z,R)); #On recupere l'equation homogene.
 eq:=simplify(eq/det(A));  #detA se factorise. On peut simplifiler car il  est non nul
 f:=unapply(eq,X,Y,Z);
 f(0,0,1);f(op(O2));#sont solutions evidentes.
/*  la droite (O_1O_2) a pour equation yo2.x-xo2.y=0, ie (s,t)=(yo2,-xo2) dans le£ faisceau sx+ty=0. En revanche on a parametre le faisceau en O_2£ grace au point (s',t',t') qui est sur la droite (O_1O_2) ssi s'.yo2-xo2.t'=0.£  on doit donc exprimer h(yo2,-xo2) proportionnel a (xo2,yo2).*/
[xo2,yo2,zo2]:=O2;
 V1:=A*matrix([[yo2],[-xo2]]);
 V2:=matrix([[xo2],[yo2]]);
 casparticulier:=det(concat(V1,V2));
 factor(subs(casparticulier=0,f(x,y,z)));
/* l'equation de degre 2 se  factorise par  x ssi A[1,1]=0 ssi h(O_1O_2)=(O_1O_2)£  on recommence avec un autre O_2*/
 xo2:=1;yo2:=0;zo2:=1;# les coordonees de O_2
 O2:=[xo2,yo2,zo2];
 [X,Y,Z]:=O2+l*V;
 L1:=-coeff(s*X+t*Y,l,1);L2:=coeff(s*X+t*Y,l,0);
 S:=L1*O2+L2*V; 
/* pour calculer le resultant on travaille a une variable: ex on fait t=1£ cette fois, On parametre les droites passant par O_2 via les equations£ les droites passant par (1,0,1) sont: s'*(x-z)+t'*y*/
 L1:=s*x+y;
 L2:=op([x-z,y]*A*[[s],[1]]):;
 eq:=resultant(L1,L2,s):; #On a l'equation cartesienne tout de suite
normal(-eq+x^2*a[1,2]-x*y*a[1,1]+x*y*a[2,2]-x*z*a[1,2]-y^2*a[2,1]+y*z*a[1,1]);
/* On a donc montr\'e que si h est une homographie entre deux faisceaux de droites£distincts le lieu de points d'intersection entre d et h(d) decrit une conique£non degeneree passant par O1 et O2 si h(O1O2) est different de (O1O2), et£decrit une droite si  h(O1O2)=(O1O2)*/
 a:=[[1,1],[2,3]];
/* ------------------------------------------------------------------------------------------------*/
