# changed FAIL to "FAIL" with(LinearAlgebra, Transpose): findgauge := proc(Ra,Rb,u,v,n) # Input: Ra fn of u, Rb fn of v. Output Ra = a0*Rb(n) + a1*Rb(n+1) i.e. finds GT Rb->Ra (applygauge finds GT input1->output) local s,g,A,Y,d,ShouldBeZero,sols,solbo,solbe,r0,r1,i; # option trace; s := u(n) = r0(n)*v(n) + r1(n)*v(n+1); ShouldBeZero := eval(Ra, {s, subs(n=n+1, s), subs(n=n+2, s)}); solve(Rb, v(n+2)); solve( eval(Rb, n=n+1), v(n+3)); subs(v(n+3)=%, v(n+2) = %%, ShouldBeZero); collect(%, {v(n), v(n+1)}, factor); ShouldBeZero := { coeffs(%, {v(n),v(n+1)}) }; d:=solve(ShouldBeZero, {r0(n+2), r1(n+2)}); assign(d); Y := [r0(n), r0(n+1), r1(n), r1(n+1)]; #ShiftY := [r0(n+1), r0(n+2), r1(n+1), r1(n+2)]; # A := <<0|1|0|0>, Transpose(), <0|0|0|1>, Transpose()>; A := <<0|1|0|0>, Transpose(), <0|0|0|1>, Transpose()>; Y := LinearFunctionalSystems[RationalSolution](A,n,'difference'); if not({op(Y)} in {{},{0}}) then s:=subs({r0(n)=Y[1], r1(n)=Y[3]}, s); else "FAIL" fi end: