//A:=[[1,-1,2,1],[-1,1,-1,1],[2,-1,1,-1],[1,1,-1,-1]] //tran(R)*A*R=B si tridiagivens(A)=R,B //pour annuler le terme 2,0 on multiplie A par TG //TG[1,1]=cos(t)=TG[2,2],TG[1,2]=sin(t)=-TG[2,1], //avec -sin(t)A[1,0]+cos(t)A[2,0]=0 //TG*A multiplie par tran(TG) annule les termes 2,0 et 0,2 //pour annuler le terme q,p (q>p+1) on multiplie A par TG //TG[p+1,p+1]=cos(t)=TG[q,q],TG[p+1,q]=sin(t)=-TG[q,p+1], //avec sin(t)A[p+1,p]=cos(t)A[q,p] //donc sin(t)=A[q,p]/r et cos(t)=A[p+1,p]/r //avec r:=sqrt((A[p+1,p])^2+(A[q,p])^2) tridiagivens(A):={ local n,p,q,r,TG,R,c,s; n:=size(A); R:=idn(n); for (p:=0;p<n-2;p++) { for (q:=p+2;q<n;q++) { r:=sqrt((A[p+1,p])^2+(A[q,p])^2); if (r!=0) { c:=normal(A[p+1,p]/r); s:=normal(A[q,p]/r); TG:=idn(n); TG[p+1,p+1]:=c; TG[q,q]:=c; TG[p+1,q]:=s; TG[q,p+1]:=-s; TG:=normal(TG); A:=normal(TG*A); A:=normal(A*tran(TG)); A:=normal(A); R:=normal(R*tran(TG)); } } } return (R,A); }On tape :
[[1,0,0,0],[0,(-(sqrt(6)))/6, (-(sqrt(4838400000)))/201600, (-(sqrt(2962400000)))/64400], [0,sqrt(6)/3,sqrt(4838400000)/252000, (-(sqrt(26661600000)))/322000], [0,sqrt(6)/6,(-(26*sqrt(210)))/420,12*sqrt(35)/420]], [[1,sqrt(6),0,0], [sqrt(6),1/3,sqrt(275990400000)/266400,0], [0,sqrt(209026944000)/231840,73/105,8*sqrt(6)/35], [0,0,8*sqrt(6)/35,1/-35]]On tape :
[[1,0,0,0],[0,(-(sqrt(6)))/6, (-(sqrt(4838400000)))/201600,(-(sqrt(2962400000)))/64400], [0,sqrt(6)/3,sqrt(4838400000)/252000, (-(sqrt(26661600000)))/322000], [0,sqrt(6)/6,(-(26*sqrt(210)))/420,12*sqrt(35)/420]], [[1,5*sqrt(6)/6,13*sqrt(210)/210,(-(sqrt(35)))/35], [sqrt(6),1/3,sqrt(275990400000)/266400,0], [0,sqrt(209026944000)/231840,73/105,8*sqrt(6)/35], [0,0,8*sqrt(6)/35,1/-35]]