% corners2r Steve Mann, 1992 % converts 4 corners to rechirp parameters % rechirp puts the 4 corners at the specified points % % the coordinates are normalized on [0,1) % % user supplies [u1,v1, u2,v2, u3,v3, u4,v4]; % this function returns [a_inv,b_inv,c_inv,d_inv,e_inv,f_inv,g_inv,h_inv] % % or user supplies a vector containing the 8 point parameters, % this function returns a vector containing the 8 inverse p-chirp parameters % adapted from rechirp2.c: % ** Used primarily to rechirp images which have been dechirped % ** Thus an image of a brick wall at an oblique angle may be remapped so % ** that all the bricks appear the same size, and thus the ``chirping'' % ** phenomenon associated with perspective projection is eliminated, % ** and then a different chirpiness may be applied. % ** Chirping means that the spatial frequency changes with position in the % ** image (one raster to a digital to analog converter, listened to by on % ** a loudspeaker gives the bird-like or bat-like ``chirping'' sound). % % ** Rechirping may be thought of as moving all the vanishing points off to % ** infinity (via dechirp) and then moving them back to some _different_ % ** position. This program may be used directly to re-position the perspective, % ** or may follow chirplet_est.c; parameters being estimated from peaks in the % ** kurtosis of the Pan-Zoom (PZ) plane of the chirplet transform of the image. % ** (Note, in this context the ``camera metaphor'' may be useful: for example % ** the wavelet transform is a Translation, Zoom (TZ) plane.) % ** Author: Steve Mann, 1992 July 9 % ** Based on a dechirp2.c % ** See also /u/sbeck/src/datstretch/datstretch.c % ** and /u/steve/src/dechirp/chirplet_est.c % ** and /u/steve/src/dechirp/dechirp2.c function [a_inv,b_inv,c_inv,d_inv,e_inv,f_inv,g_inv,h_inv] = ... dechirp_mapping(u1,v1,u2,v2,u3,v3,u4,v4); input_isvector = 0; if nargin == 1 input_isvector = 1; if length(x1) ~= 8 % !=, thinks ! is a shell escape. disp('***** dechirp input parameter vector is not 8 units long *****') end%if v1=u1(2); u2=u1(3); v2=u1(4); u3=u1(5); v3=u1(6); u4=u1(7); v4=u1(8); u1=u1(1); % destroy vector x1 last end%if a_inv = -(((u3*u3)*(v1*v1)*v2 - u3*u4*(v1*v1)*v2 - ... (u3*u3)*v1*(v2*v2) + u3*u4*v1*(v2*v2) - ... u2*u3*(v1*v1)*v3 + u3*u4*(v1*v1)*v3 - u1*u3*v1*v2*v3 + ... u2*u3*v1*v2*v3 + u1*u4*v1*v2*v3 - u3*u4*v1*v2*v3 + ... u1*u3*(v2*v2)*v3 - u1*u4*(v2*v2)*v3 + ... u1*u2*v1*(v3*v3) - u1*u4*v1*(v3*v3) - ... u1*u2*v2*(v3*v3) + u1*u4*v2*(v3*v3) + ... u2*u3*(v1*v1)*v4 - (u3*u3)*(v1*v1)*v4 - ... u2*u3*v1*v2*v4 + (u3*u3)*v1*v2*v4 - u1*u2*v1*v3*v4 + ... u1*u3*v1*v3*v4 + u1*u2*v2*v3*v4 - u1*u3*v2*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... (u2*u4*(v1*v1)*v3 - u3*u4*(v1*v1)*v3 - u1*u4*v1*v2*v3 - ... u2*u4*v1*v2*v3 + 2*u3*u4*v1*v2*v3 + u1*u4*(v2*v2)*v3 - ... u3*u4*(v2*v2)*v3 + u1*u4*v1*(v3*v3) - u2*u4*v1*(v3*v3) - ... u1*u4*v2*(v3*v3) + u2*u4*v2*(v3*v3) - u2*u3*(v1*v1)*v4 + ... (u3*u3)*(v1*v1)*v4 + u1*u3*v1*v2*v4 + u2*u3*v1*v2*v4 - ... 2*(u3*u3)*v1*v2*v4 - u1*u3*(v2*v2)*v4 + ... (u3*u3)*(v2*v2)*v4 - u1*u3*v1*v3*v4 + u2*u3*v1*v3*v4 + ... u1*u3*v2*v3*v4 - u2*u3*v2*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-(u3*u4*(v1*v1)*v2) + (u4*u4)*(v1*v1)*v2 + ... u3*u4*v1*(v2*v2) - (u4*u4)*v1*(v2*v2) + u1*u4*v1*v2*v3 - ... (u4*u4)*v1*v2*v3 - u1*u4*(v2*v2)*v3 + ... (u4*u4)*(v2*v2)*v3 + u2*u3*(v1*v1)*v4 - ... u2*u4*(v1*v1)*v4 - u2*u3*v1*v2*v4 - u1*u4*v1*v2*v4 + ... u2*u4*v1*v2*v4 + u3*u4*v1*v2*v4 + u1*u4*(v2*v2)*v4 - ... u3*u4*(v2*v2)*v4 - u1*u2*v1*v3*v4 + u2*u4*v1*v3*v4 + ... u1*u2*v2*v3*v4 - u2*u4*v2*v3*v4 + u1*u2*v1*(v4*v4) - ... u2*u3*v1*(v4*v4) - u1*u2*v2*(v4*v4) + u2*u3*v2*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u3*u4*(v1*v1)*v3 - (u4*u4)*(v1*v1)*v3 - u3*u4*v1*v2*v3 + ... (u4*u4)*v1*v2*v3 - u1*u4*v1*(v3*v3) + ... (u4*u4)*v1*(v3*v3) + u1*u4*v2*(v3*v3) - ... (u4*u4)*v2*(v3*v3) - (u3*u3)*(v1*v1)*v4 + ... u3*u4*(v1*v1)*v4 + (u3*u3)*v1*v2*v4 - u3*u4*v1*v2*v4 + ... u1*u3*v1*v3*v4 + u1*u4*v1*v3*v4 - 2*u3*u4*v1*v3*v4 - ... u1*u3*v2*v3*v4 - u1*u4*v2*v3*v4 + 2*u3*u4*v2*v3*v4 - ... u1*u3*v1*(v4*v4) + (u3*u3)*v1*(v4*v4) + ... u1*u3*v2*(v4*v4) - (u3*u3)*v2*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)); b_inv = -((-(u1*(u3*u3)*v1*v2) + u2*(u3*u3)*v1*v2 + ... u1*u3*u4*v1*v2 - u2*u3*u4*v1*v2 + u1*u2*u3*v1*v3 - ... (u2*u2)*u3*v1*v3 - u1*u3*u4*v1*v3 + u2*u3*u4*v1*v3 + ... (u1*u1)*u3*v2*v3 - u1*u2*u3*v2*v3 - (u1*u1)*u4*v2*v3 + ... u1*u2*u4*v2*v3 - (u1*u1)*u2*(v3*v3) + ... u1*(u2*u2)*(v3*v3) + (u1*u1)*u4*(v3*v3) - ... u1*u2*u4*(v3*v3) - u1*u2*u3*v1*v4 + (u2*u2)*u3*v1*v4 + ... u1*(u3*u3)*v1*v4 - u2*(u3*u3)*v1*v4 + ... (u1*u1)*u2*v3*v4 - u1*(u2*u2)*v3*v4 - ... (u1*u1)*u3*v3*v4 + u1*u2*u3*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... (-(u1*u2*u4*v1*v3) + (u2*u2)*u4*v1*v3 + u1*u3*u4*v1*v3 - ... u2*u3*u4*v1*v3 + (u1*u1)*u4*v2*v3 - u1*u2*u4*v2*v3 - ... u1*u3*u4*v2*v3 + u2*u3*u4*v2*v3 - (u1*u1)*u4*(v3*v3) + ... 2*u1*u2*u4*(v3*v3) - (u2*u2)*u4*(v3*v3) + ... u1*u2*u3*v1*v4 - (u2*u2)*u3*v1*v4 - u1*(u3*u3)*v1*v4 + ... u2*(u3*u3)*v1*v4 - (u1*u1)*u3*v2*v4 + u1*u2*u3*v2*v4 + ... u1*(u3*u3)*v2*v4 - u2*(u3*u3)*v2*v4 + (u1*u1)*u3*v3*v4 - ... 2*u1*u2*u3*v3*v4 + (u2*u2)*u3*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u1*u3*u4*v1*v2 - u2*u3*u4*v1*v2 - u1*(u4*u4)*v1*v2 + ... u2*(u4*u4)*v1*v2 - (u1*u1)*u4*v2*v3 + u1*u2*u4*v2*v3 + ... u1*(u4*u4)*v2*v3 - u2*(u4*u4)*v2*v3 - u1*u2*u3*v1*v4 + ... (u2*u2)*u3*v1*v4 + u1*u2*u4*v1*v4 - (u2*u2)*u4*v1*v4 + ... (u1*u1)*u4*v2*v4 - u1*u2*u4*v2*v4 - u1*u3*u4*v2*v4 + ... u2*u3*u4*v2*v4 + (u1*u1)*u2*v3*v4 - u1*(u2*u2)*v3*v4 - ... u1*u2*u4*v3*v4 + (u2*u2)*u4*v3*v4 - (u1*u1)*u2*(v4*v4) + ... u1*(u2*u2)*(v4*v4) + u1*u2*u3*(v4*v4) - ... (u2*u2)*u3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-(u1*u3*u4*v1*v3) + u2*u3*u4*v1*v3 + u1*(u4*u4)*v1*v3 - ... u2*(u4*u4)*v1*v3 + (u1*u1)*u4*(v3*v3) - ... u1*u2*u4*(v3*v3) - u1*(u4*u4)*(v3*v3) + ... u2*(u4*u4)*(v3*v3) + u1*(u3*u3)*v1*v4 - ... u2*(u3*u3)*v1*v4 - u1*u3*u4*v1*v4 + u2*u3*u4*v1*v4 - ... (u1*u1)*u3*v3*v4 + u1*u2*u3*v3*v4 - (u1*u1)*u4*v3*v4 + ... u1*u2*u4*v3*v4 + 2*u1*u3*u4*v3*v4 - 2*u2*u3*u4*v3*v4 + ... (u1*u1)*u3*(v4*v4) - u1*u2*u3*(v4*v4) - ... u1*(u3*u3)*(v4*v4) + u2*(u3*u3)*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)); c_inv = -((-(u2*(u3*u3)*(v1*v1)*v2) + u2*u3*u4*(v1*v1)*v2 + ... u1*(u3*u3)*v1*(v2*v2) - u1*u3*u4*v1*(v2*v2) + ... (u2*u2)*u3*(v1*v1)*v3 - u2*u3*u4*(v1*v1)*v3 - ... u1*u2*u4*v1*v2*v3 + u1*u3*u4*v1*v2*v3 - ... (u1*u1)*u3*(v2*v2)*v3 + (u1*u1)*u4*(v2*v2)*v3 - ... u1*(u2*u2)*v1*(v3*v3) + u1*u2*u4*v1*(v3*v3) + ... (u1*u1)*u2*v2*(v3*v3) - (u1*u1)*u4*v2*(v3*v3) - ... (u2*u2)*u3*(v1*v1)*v4 + u2*(u3*u3)*(v1*v1)*v4 + ... u1*u2*u3*v1*v2*v4 - u1*(u3*u3)*v1*v2*v4 + ... u1*(u2*u2)*v1*v3*v4 - u1*u2*u3*v1*v3*v4 - ... (u1*u1)*u2*v2*v3*v4 + (u1*u1)*u3*v2*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... (-((u2*u2)*u4*(v1*v1)*v3) + u2*u3*u4*(v1*v1)*v3 + ... 2*u1*u2*u4*v1*v2*v3 - u1*u3*u4*v1*v2*v3 - u2*u3*u4*v1*v2*v3 - ... (u1*u1)*u4*(v2*v2)*v3 + u1*u3*u4*(v2*v2)*v3 - ... u1*u2*u4*v1*(v3*v3) + (u2*u2)*u4*v1*(v3*v3) + ... (u1*u1)*u4*v2*(v3*v3) - u1*u2*u4*v2*(v3*v3) + ... (u2*u2)*u3*(v1*v1)*v4 - u2*(u3*u3)*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + u1*(u3*u3)*v1*v2*v4 + ... u2*(u3*u3)*v1*v2*v4 + (u1*u1)*u3*(v2*v2)*v4 - ... u1*(u3*u3)*(v2*v2)*v4 + u1*u2*u3*v1*v3*v4 - ... (u2*u2)*u3*v1*v3*v4 - (u1*u1)*u3*v2*v3*v4 + u1*u2*u3*v2*v3*v4... )/(u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u2*u3*u4*(v1*v1)*v2 - u2*(u4*u4)*(v1*v1)*v2 - ... u1*u3*u4*v1*(v2*v2) + u1*(u4*u4)*v1*(v2*v2) - ... u1*u2*u4*v1*v2*v3 + u2*(u4*u4)*v1*v2*v3 + ... (u1*u1)*u4*(v2*v2)*v3 - u1*(u4*u4)*(v2*v2)*v3 - ... (u2*u2)*u3*(v1*v1)*v4 + (u2*u2)*u4*(v1*v1)*v4 + ... u1*u2*u3*v1*v2*v4 - u2*u3*u4*v1*v2*v4 - ... (u1*u1)*u4*(v2*v2)*v4 + u1*u3*u4*(v2*v2)*v4 + ... u1*(u2*u2)*v1*v3*v4 - (u2*u2)*u4*v1*v3*v4 - ... (u1*u1)*u2*v2*v3*v4 + u1*u2*u4*v2*v3*v4 - ... u1*(u2*u2)*v1*(v4*v4) + (u2*u2)*u3*v1*(v4*v4) + ... (u1*u1)*u2*v2*(v4*v4) - u1*u2*u3*v2*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-(u2*u3*u4*(v1*v1)*v3) + u2*(u4*u4)*(v1*v1)*v3 + ... u1*u3*u4*v1*v2*v3 - u1*(u4*u4)*v1*v2*v3 + ... u1*u2*u4*v1*(v3*v3) - u2*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u4*v2*(v3*v3) + u1*(u4*u4)*v2*(v3*v3) + ... u2*(u3*u3)*(v1*v1)*v4 - u2*u3*u4*(v1*v1)*v4 - ... u1*(u3*u3)*v1*v2*v4 + u1*u3*u4*v1*v2*v4 - u1*u2*u3*v1*v3*v4 - ... u1*u2*u4*v1*v3*v4 + 2*u2*u3*u4*v1*v3*v4 + (u1*u1)*u3*v2*v3*v4 + ... (u1*u1)*u4*v2*v3*v4 - 2*u1*u3*u4*v2*v3*v4 + ... u1*u2*u3*v1*(v4*v4) - u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u3*v2*(v4*v4) + u1*(u3*u3)*v2*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)); d_inv = -((u2*u3*(v1*v1)*v2 - u2*u4*(v1*v1)*v2 - ... u1*u3*v1*(v2*v2) + u1*u4*v1*(v2*v2) - ... (u2*u2)*(v1*v1)*v3 + u2*u4*(v1*v1)*v3 + ... u1*u2*v1*v2*v3 - u2*u3*v1*v2*v3 - u1*u4*v1*v2*v3 + ... u2*u4*v1*v2*v3 + u1*u3*(v2*v2)*v3 - u1*u4*(v2*v2)*v3 + ... (u2*u2)*v1*(v3*v3) - u2*u4*v1*(v3*v3) - ... u1*u2*v2*(v3*v3) + u1*u4*v2*(v3*v3) + ... (u2*u2)*(v1*v1)*v4 - u2*u3*(v1*v1)*v4 - ... u1*u2*v1*v2*v4 + u1*u3*v1*v2*v4 - (u2*u2)*v1*v3*v4 + ... u2*u3*v1*v3*v4 + u1*u2*v2*v3*v4 - u1*u3*v2*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... (u2*u4*(v1*v1)*v2 - u3*u4*(v1*v1)*v2 - u1*u4*v1*(v2*v2) + ... u3*u4*v1*(v2*v2) + u1*u4*v1*v2*v3 - 2*u2*u4*v1*v2*v3 + ... u3*u4*v1*v2*v3 + u1*u4*(v2*v2)*v3 - u3*u4*(v2*v2)*v3 - ... u1*u4*v2*(v3*v3) + u2*u4*v2*(v3*v3) - ... (u2*u2)*(v1*v1)*v4 + u2*u3*(v1*v1)*v4 + u1*u2*v1*v2*v4 - ... u2*u3*v1*v2*v4 - u1*u2*v1*v3*v4 + 2*(u2*u2)*v1*v3*v4 - ... u2*u3*v1*v3*v4 - u1*u2*v2*v3*v4 + u2*u3*v2*v3*v4 + ... u1*u2*(v3*v3)*v4 - (u2*u2)*(v3*v3)*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-(u2*u4*(v1*v1)*v2) + (u4*u4)*(v1*v1)*v2 + ... u1*u4*v1*(v2*v2) - (u4*u4)*v1*(v2*v2) + u2*u4*v1*v2*v3 - ... (u4*u4)*v1*v2*v3 - u1*u4*(v2*v2)*v3 + ... (u4*u4)*(v2*v2)*v3 + (u2*u2)*(v1*v1)*v4 - ... u2*u4*(v1*v1)*v4 - u1*u2*v1*v2*v4 - u1*u4*v1*v2*v4 + ... 2*u2*u4*v1*v2*v4 - (u2*u2)*v1*v3*v4 + u2*u4*v1*v3*v4 + ... u1*u2*v2*v3*v4 + u1*u4*v2*v3*v4 - 2*u2*u4*v2*v3*v4 + ... u1*u2*v1*(v4*v4) - (u2*u2)*v1*(v4*v4) - ... u1*u2*v3*(v4*v4) + (u2*u2)*v3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u2*u4*(v1*v1)*v3 - (u4*u4)*(v1*v1)*v3 - u1*u4*v1*v2*v3 + ... (u4*u4)*v1*v2*v3 - u2*u4*v1*(v3*v3) + ... (u4*u4)*v1*(v3*v3) + u1*u4*v2*(v3*v3) - ... (u4*u4)*v2*(v3*v3) - u2*u3*(v1*v1)*v4 + ... u3*u4*(v1*v1)*v4 + u1*u3*v1*v2*v4 - u3*u4*v1*v2*v4 + ... u2*u3*v1*v3*v4 + u1*u4*v1*v3*v4 - u2*u4*v1*v3*v4 - u3*u4*v1*v3*v4 - ... u1*u3*v2*v3*v4 + u3*u4*v2*v3*v4 - u1*u4*(v3*v3)*v4 + ... u2*u4*(v3*v3)*v4 - u1*u3*v1*(v4*v4) + u2*u3*v1*(v4*v4) + ... u1*u3*v3*(v4*v4) - u2*u3*v3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)); e_inv = -((-(u1*u2*u3*v1*v2) + u2*(u3*u3)*v1*v2 + u1*u2*u4*v1*v2 - ... u2*u3*u4*v1*v2 + (u1*u1)*u3*(v2*v2) - ... u1*(u3*u3)*(v2*v2) - (u1*u1)*u4*(v2*v2) + ... u1*u3*u4*(v2*v2) + u1*(u2*u2)*v1*v3 - ... (u2*u2)*u3*v1*v3 - u1*u2*u4*v1*v3 + u2*u3*u4*v1*v3 - ... (u1*u1)*u2*v2*v3 + u1*u2*u3*v2*v3 + (u1*u1)*u4*v2*v3 - ... u1*u3*u4*v2*v3 - u1*(u2*u2)*v1*v4 + u1*u2*u3*v1*v4 + ... (u2*u2)*u3*v1*v4 - u2*(u3*u3)*v1*v4 + ... (u1*u1)*u2*v2*v4 - (u1*u1)*u3*v2*v4 - u1*u2*u3*v2*v4 + ... u1*(u3*u3)*v2*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... (-(u1*u2*u4*v1*v2) + u1*u3*u4*v1*v2 + u2*u3*u4*v1*v2 - ... (u3*u3)*u4*v1*v2 + (u1*u1)*u4*(v2*v2) - ... 2*u1*u3*u4*(v2*v2) + (u3*u3)*u4*(v2*v2) - ... (u1*u1)*u4*v2*v3 + u1*u2*u4*v2*v3 + u1*u3*u4*v2*v3 - ... u2*u3*u4*v2*v3 + u1*(u2*u2)*v1*v4 - u1*u2*u3*v1*v4 - ... (u2*u2)*u3*v1*v4 + u2*(u3*u3)*v1*v4 - (u1*u1)*u2*v2*v4 + ... 2*u1*u2*u3*v2*v4 - u2*(u3*u3)*v2*v4 + (u1*u1)*u2*v3*v4 - ... u1*(u2*u2)*v3*v4 - u1*u2*u3*v3*v4 + (u2*u2)*u3*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u1*u2*u4*v1*v2 - u2*u3*u4*v1*v2 - u1*(u4*u4)*v1*v2 + ... u3*(u4*u4)*v1*v2 - (u1*u1)*u4*(v2*v2) + ... u1*u3*u4*(v2*v2) + u1*(u4*u4)*(v2*v2) - ... u3*(u4*u4)*(v2*v2) - u1*(u2*u2)*v1*v4 + ... (u2*u2)*u3*v1*v4 + u1*u2*u4*v1*v4 - u2*u3*u4*v1*v4 + ... (u1*u1)*u2*v2*v4 - u1*u2*u3*v2*v4 + (u1*u1)*u4*v2*v4 - ... 2*u1*u2*u4*v2*v4 - u1*u3*u4*v2*v4 + 2*u2*u3*u4*v2*v4 - ... (u1*u1)*u2*(v4*v4) + u1*(u2*u2)*(v4*v4) + ... u1*u2*u3*(v4*v4) - (u2*u2)*u3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-(u1*u2*u4*v1*v3) + u2*u3*u4*v1*v3 + u1*(u4*u4)*v1*v3 - ... u3*(u4*u4)*v1*v3 + (u1*u1)*u4*v2*v3 - u1*u3*u4*v2*v3 - ... u1*(u4*u4)*v2*v3 + u3*(u4*u4)*v2*v3 + u1*u2*u3*v1*v4 - ... u2*(u3*u3)*v1*v4 - u1*u3*u4*v1*v4 + (u3*u3)*u4*v1*v4 - ... (u1*u1)*u3*v2*v4 + u1*(u3*u3)*v2*v4 + u1*u3*u4*v2*v4 - ... (u3*u3)*u4*v2*v4 - (u1*u1)*u4*v3*v4 + u1*u2*u4*v3*v4 + ... u1*u3*u4*v3*v4 - u2*u3*u4*v3*v4 + (u1*u1)*u3*(v4*v4) - ... u1*u2*u3*(v4*v4) - u1*(u3*u3)*(v4*v4) + ... u2*(u3*u3)*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)); f_inv = -((-(u2*(u3*u3)*(v1*v1)*v2) + u2*u3*u4*(v1*v1)*v2 + ... u1*(u3*u3)*v1*(v2*v2) - u1*u3*u4*v1*(v2*v2) + ... (u2*u2)*u3*(v1*v1)*v3 - u2*u3*u4*(v1*v1)*v3 - ... u1*u2*u4*v1*v2*v3 + u1*u3*u4*v1*v2*v3 - ... (u1*u1)*u3*(v2*v2)*v3 + (u1*u1)*u4*(v2*v2)*v3 - ... u1*(u2*u2)*v1*(v3*v3) + u1*u2*u4*v1*(v3*v3) + ... (u1*u1)*u2*v2*(v3*v3) - (u1*u1)*u4*v2*(v3*v3) - ... (u2*u2)*u3*(v1*v1)*v4 + u2*(u3*u3)*(v1*v1)*v4 + ... u1*u2*u3*v1*v2*v4 - u1*(u3*u3)*v1*v2*v4 + ... u1*(u2*u2)*v1*v3*v4 - u1*u2*u3*v1*v3*v4 - ... (u1*u1)*u2*v2*v3*v4 + (u1*u1)*u3*v2*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... (-(u2*u3*u4*(v1*v1)*v2) + (u3*u3)*u4*(v1*v1)*v2 + ... u1*u3*u4*v1*(v2*v2) - (u3*u3)*u4*v1*(v2*v2) + ... u1*u2*u4*v1*v2*v3 - 2*u1*u3*u4*v1*v2*v3 + u2*u3*u4*v1*v2*v3 - ... (u1*u1)*u4*(v2*v2)*v3 + u1*u3*u4*(v2*v2)*v3 + ... (u1*u1)*u4*v2*(v3*v3) - u1*u2*u4*v2*(v3*v3) + ... (u2*u2)*u3*(v1*v1)*v4 - u2*(u3*u3)*(v1*v1)*v4 - ... u1*u2*u3*v1*v2*v4 + u2*(u3*u3)*v1*v2*v4 - ... u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 - ... (u2*u2)*u3*v1*v3*v4 + (u1*u1)*u2*v2*v3*v4 - ... u1*u2*u3*v2*v3*v4 - (u1*u1)*u2*(v3*v3)*v4 + ... u1*(u2*u2)*(v3*v3)*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u2*u3*u4*(v1*v1)*v2 - u3*(u4*u4)*(v1*v1)*v2 - ... u1*u3*u4*v1*(v2*v2) + u3*(u4*u4)*v1*(v2*v2) - ... u1*u2*u4*v1*v2*v3 + u1*(u4*u4)*v1*v2*v3 + ... (u1*u1)*u4*(v2*v2)*v3 - u1*(u4*u4)*(v2*v2)*v3 - ... (u2*u2)*u3*(v1*v1)*v4 + u2*u3*u4*(v1*v1)*v4 + ... u1*u2*u3*v1*v2*v4 + u1*u3*u4*v1*v2*v4 - 2*u2*u3*u4*v1*v2*v4 + ... u1*(u2*u2)*v1*v3*v4 - u1*u2*u4*v1*v3*v4 - ... (u1*u1)*u2*v2*v3*v4 - (u1*u1)*u4*v2*v3*v4 + ... 2*u1*u2*u4*v2*v3*v4 - u1*u2*u3*v1*(v4*v4) + ... (u2*u2)*u3*v1*(v4*v4) + (u1*u1)*u2*v3*(v4*v4) - ... u1*(u2*u2)*v3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-(u2*u3*u4*(v1*v1)*v3) + u3*(u4*u4)*(v1*v1)*v3 + ... u1*u3*u4*v1*v2*v3 - u3*(u4*u4)*v1*v2*v3 + ... u1*u2*u4*v1*(v3*v3) - u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u4*v2*(v3*v3) + u1*(u4*u4)*v2*(v3*v3) + ... u2*(u3*u3)*(v1*v1)*v4 - (u3*u3)*u4*(v1*v1)*v4 - ... u1*(u3*u3)*v1*v2*v4 + (u3*u3)*u4*v1*v2*v4 - ... u1*u2*u3*v1*v3*v4 + u2*u3*u4*v1*v3*v4 + (u1*u1)*u3*v2*v3*v4 - ... u1*u3*u4*v2*v3*v4 + (u1*u1)*u4*(v3*v3)*v4 - ... u1*u2*u4*(v3*v3)*v4 + u1*(u3*u3)*v1*(v4*v4) - ... u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u3*v3*(v4*v4) + ... u1*u2*u3*v3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)); g_inv = -((-((u2*u2)*(v1*v1)*v3) + u2*u3*(v1*v1)*v3 + ... u2*u4*(v1*v1)*v3 - u3*u4*(v1*v1)*v3 + 2*u1*u2*v1*v2*v3 - ... u1*u3*v1*v2*v3 - u2*u3*v1*v2*v3 - u1*u4*v1*v2*v3 - ... u2*u4*v1*v2*v3 + 2*u3*u4*v1*v2*v3 - (u1*u1)*(v2*v2)*v3 + ... u1*u3*(v2*v2)*v3 + u1*u4*(v2*v2)*v3 - ... u3*u4*(v2*v2)*v3 - u1*u2*v1*(v3*v3) + ... (u2*u2)*v1*(v3*v3) + u1*u4*v1*(v3*v3) - ... u2*u4*v1*(v3*v3) + (u1*u1)*v2*(v3*v3) - ... u1*u2*v2*(v3*v3) - u1*u4*v2*(v3*v3) + ... u2*u4*v2*(v3*v3) + (u2*u2)*(v1*v1)*v4 - ... 2*u2*u3*(v1*v1)*v4 + (u3*u3)*(v1*v1)*v4 - ... 2*u1*u2*v1*v2*v4 + 2*u1*u3*v1*v2*v4 + 2*u2*u3*v1*v2*v4 - ... 2*(u3*u3)*v1*v2*v4 + (u1*u1)*(v2*v2)*v4 - ... 2*u1*u3*(v2*v2)*v4 + (u3*u3)*(v2*v2)*v4 + ... u1*u2*v1*v3*v4 - (u2*u2)*v1*v3*v4 - u1*u3*v1*v3*v4 + ... u2*u3*v1*v3*v4 - (u1*u1)*v2*v3*v4 + u1*u2*v2*v3*v4 + ... u1*u3*v2*v3*v4 - u2*u3*v2*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... (-(u2*u3*(v1*v1)*v2) + (u3*u3)*(v1*v1)*v2 + ... u2*u4*(v1*v1)*v2 - u3*u4*(v1*v1)*v2 + u1*u3*v1*(v2*v2) - ... (u3*u3)*v1*(v2*v2) - u1*u4*v1*(v2*v2) + ... u3*u4*v1*(v2*v2) + u1*u2*v1*v2*v3 - 2*u1*u3*v1*v2*v3 + ... u2*u3*v1*v2*v3 + u1*u4*v1*v2*v3 - 2*u2*u4*v1*v2*v3 + ... u3*u4*v1*v2*v3 - (u1*u1)*(v2*v2)*v3 + u1*u3*(v2*v2)*v3 + ... u1*u4*(v2*v2)*v3 - u3*u4*(v2*v2)*v3 + ... (u1*u1)*v2*(v3*v3) - u1*u2*v2*(v3*v3) - ... u1*u4*v2*(v3*v3) + u2*u4*v2*(v3*v3) - ... (u2*u2)*(v1*v1)*v4 + 2*u2*u3*(v1*v1)*v4 - ... (u3*u3)*(v1*v1)*v4 + u1*u2*v1*v2*v4 - u1*u3*v1*v2*v4 - ... u2*u3*v1*v2*v4 + (u3*u3)*v1*v2*v4 - 2*u1*u2*v1*v3*v4 + ... 2*(u2*u2)*v1*v3*v4 + 2*u1*u3*v1*v3*v4 - 2*u2*u3*v1*v3*v4 + ... (u1*u1)*v2*v3*v4 - u1*u2*v2*v3*v4 - u1*u3*v2*v3*v4 + ... u2*u3*v2*v3*v4 - (u1*u1)*(v3*v3)*v4 + ... 2*u1*u2*(v3*v3)*v4 - (u2*u2)*(v3*v3)*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-(u2*u3*(v1*v1)*v3) + u2*u4*(v1*v1)*v3 + ... u3*u4*(v1*v1)*v3 - (u4*u4)*(v1*v1)*v3 + u1*u3*v1*v2*v3 - ... u1*u4*v1*v2*v3 - u3*u4*v1*v2*v3 + (u4*u4)*v1*v2*v3 + ... u1*u2*v1*(v3*v3) - u1*u4*v1*(v3*v3) - u2*u4*v1*(v3*v3) + ... (u4*u4)*v1*(v3*v3) - (u1*u1)*v2*(v3*v3) + ... 2*u1*u4*v2*(v3*v3) - (u4*u4)*v2*(v3*v3) + ... u2*u3*(v1*v1)*v4 - (u3*u3)*(v1*v1)*v4 - ... u2*u4*(v1*v1)*v4 + u3*u4*(v1*v1)*v4 - u1*u3*v1*v2*v4 + ... (u3*u3)*v1*v2*v4 + u1*u4*v1*v2*v4 - u3*u4*v1*v2*v4 - ... 2*u1*u2*v1*v3*v4 + u1*u3*v1*v3*v4 + u2*u3*v1*v3*v4 + ... u1*u4*v1*v3*v4 + u2*u4*v1*v3*v4 - 2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*v2*v3*v4 - 2*u1*u3*v2*v3*v4 - 2*u1*u4*v2*v3*v4 + ... 2*u3*u4*v2*v3*v4 + u1*u2*v1*(v4*v4) - u1*u3*v1*(v4*v4) - ... u2*u3*v1*(v4*v4) + (u3*u3)*v1*(v4*v4) - ... (u1*u1)*v2*(v4*v4) + 2*u1*u3*v2*(v4*v4) - ... (u3*u3)*v2*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u2*u3*(v1*v1)*v2 - u2*u4*(v1*v1)*v2 - u3*u4*(v1*v1)*v2 + ... (u4*u4)*(v1*v1)*v2 - u1*u3*v1*(v2*v2) + ... u1*u4*v1*(v2*v2) + u3*u4*v1*(v2*v2) - ... (u4*u4)*v1*(v2*v2) - u1*u2*v1*v2*v3 + u1*u4*v1*v2*v3 + ... u2*u4*v1*v2*v3 - (u4*u4)*v1*v2*v3 + (u1*u1)*(v2*v2)*v3 - ... 2*u1*u4*(v2*v2)*v3 + (u4*u4)*(v2*v2)*v3 + ... (u2*u2)*(v1*v1)*v4 - u2*u3*(v1*v1)*v4 - ... u2*u4*(v1*v1)*v4 + u3*u4*(v1*v1)*v4 - u1*u2*v1*v2*v4 + ... 2*u1*u3*v1*v2*v4 - u2*u3*v1*v2*v4 - u1*u4*v1*v2*v4 + ... 2*u2*u4*v1*v2*v4 - u3*u4*v1*v2*v4 + u1*u2*v1*v3*v4 - ... (u2*u2)*v1*v3*v4 - u1*u4*v1*v3*v4 + u2*u4*v1*v3*v4 - ... 2*(u1*u1)*v2*v3*v4 + 2*u1*u2*v2*v3*v4 + 2*u1*u4*v2*v3*v4 - ... 2*u2*u4*v2*v3*v4 + u1*u2*v1*(v4*v4) - ... (u2*u2)*v1*(v4*v4) - u1*u3*v1*(v4*v4) + ... u2*u3*v1*(v4*v4) + (u1*u1)*v3*(v4*v4) - ... 2*u1*u2*v3*(v4*v4) + (u2*u2)*v3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)); h_inv = -(((u2*u2)*u3*(v1*v1) - u2*(u3*u3)*(v1*v1) - ... (u2*u2)*u4*(v1*v1) + u2*u3*u4*(v1*v1) - ... 2*u1*u2*u3*v1*v2 + u1*(u3*u3)*v1*v2 + u2*(u3*u3)*v1*v2 + ... 2*u1*u2*u4*v1*v2 - u1*u3*u4*v1*v2 - u2*u3*u4*v1*v2 + ... (u1*u1)*u3*(v2*v2) - u1*(u3*u3)*(v2*v2) - ... (u1*u1)*u4*(v2*v2) + u1*u3*u4*(v2*v2) + ... u1*u2*u3*v1*v3 - (u2*u2)*u3*v1*v3 - 2*u1*u2*u4*v1*v3 + ... 2*(u2*u2)*u4*v1*v3 + u1*u3*u4*v1*v3 - u2*u3*u4*v1*v3 - ... (u1*u1)*u3*v2*v3 + u1*u2*u3*v2*v3 + 2*(u1*u1)*u4*v2*v3 - ... 2*u1*u2*u4*v2*v3 - u1*u3*u4*v2*v3 + u2*u3*u4*v2*v3 - ... (u1*u1)*u4*(v3*v3) + 2*u1*u2*u4*(v3*v3) - ... (u2*u2)*u4*(v3*v3) + u1*u2*u3*v1*v4 - ... (u2*u2)*u3*v1*v4 - u1*(u3*u3)*v1*v4 + ... u2*(u3*u3)*v1*v4 - (u1*u1)*u3*v2*v4 + u1*u2*u3*v2*v4 + ... u1*(u3*u3)*v2*v4 - u2*(u3*u3)*v2*v4 + ... (u1*u1)*u3*v3*v4 - 2*u1*u2*u3*v3*v4 + (u2*u2)*u3*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + ... 2*u1*(u4*u4)*(v2*v2)*v3 - u3*(u4*u4)*(v2*v2)*v3 + ... u1*(u2*u2)*v1*(v3*v3) - 2*u1*u2*u4*v1*(v3*v3) + ... u1*(u4*u4)*v1*(v3*v3) - (u1*u1)*u2*v2*(v3*v3) + ... 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - ... 2*u2*(u3*u3)*(v1*v1)*v4 - (u2*u2)*u4*(v1*v1)*v4 + ... (u3*u3)*u4*(v1*v1)*v4 - 2*u1*u2*u3*v1*v2*v4 + ... 2*u1*(u3*u3)*v1*v2*v4 + 2*u2*u3*u4*v1*v2*v4 - ... 2*(u3*u3)*u4*v1*v2*v4 + (u1*u1)*u4*(v2*v2)*v4 - ... 2*u1*u3*u4*(v2*v2)*v4 + (u3*u3)*u4*(v2*v2)*v4 - ... 2*u1*(u2*u2)*v1*v3*v4 + 2*u1*u2*u3*v1*v3*v4 + ... 2*(u2*u2)*u4*v1*v3*v4 - 2*u2*u3*u4*v1*v3*v4 + ... 2*(u1*u1)*u2*v2*v3*v4 - 2*(u1*u1)*u3*v2*v3*v4 - ... 2*u1*u2*u4*v2*v3*v4 + 2*u1*u3*u4*v2*v3*v4 - ... (u1*u1)*u4*(v3*v3)*v4 + 2*u1*u2*u4*(v3*v3)*v4 - ... (u2*u2)*u4*(v3*v3)*v4 + u1*(u2*u2)*v1*(v4*v4) - ... 2*(u2*u2)*u3*v1*(v4*v4) - u1*(u3*u3)*v1*(v4*v4) + ... 2*u2*(u3*u3)*v1*(v4*v4) - (u1*u1)*u2*v2*(v4*v4) + ... 2*u1*u2*u3*v2*(v4*v4) - u2*(u3*u3)*v2*(v4*v4) + ... (u1*u1)*u3*v3*(v4*v4) - 2*u1*u2*u3*v3*(v4*v4) + ... (u2*u2)*u3*v3*(v4*v4))) - ... ((u2*u2)*u3*(v1*v1) - u2*(u3*u3)*(v1*v1) - ... u2*u3*u4*(v1*v1) + (u3*u3)*u4*(v1*v1) - u1*u2*u3*v1*v2 + ... u2*(u3*u3)*v1*v2 - u1*u2*u4*v1*v2 + 2*u1*u3*u4*v1*v2 + ... u2*u3*u4*v1*v2 - 2*(u3*u3)*u4*v1*v2 + ... (u1*u1)*u4*(v2*v2) - 2*u1*u3*u4*(v2*v2) + ... (u3*u3)*u4*(v2*v2) - u1*(u2*u2)*v1*v3 + ... 2*u1*u2*u3*v1*v3 - (u2*u2)*u3*v1*v3 + u1*u2*u4*v1*v3 - ... 2*u1*u3*u4*v1*v3 + u2*u3*u4*v1*v3 + (u1*u1)*u2*v2*v3 - ... u1*u2*u3*v2*v3 - 2*(u1*u1)*u4*v2*v3 + u1*u2*u4*v2*v3 + ... 2*u1*u3*u4*v2*v3 - u2*u3*u4*v2*v3 - (u1*u1)*u2*(v3*v3) + ... u1*(u2*u2)*(v3*v3) + (u1*u1)*u4*(v3*v3) - ... u1*u2*u4*(v3*v3) + u1*(u2*u2)*v1*v4 - u1*u2*u3*v1*v4 - ... (u2*u2)*u3*v1*v4 + u2*(u3*u3)*v1*v4 - (u1*u1)*u2*v2*v4 + ... 2*u1*u2*u3*v2*v4 - u2*(u3*u3)*v2*v4 + (u1*u1)*u2*v3*v4 - ... u1*(u2*u2)*v3*v4 - u1*u2*u3*v3*v4 + (u2*u2)*u3*v3*v4)/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (-((u2*u2)*u3*(v1*v1)) + 2*u2*u3*u4*(v1*v1) - ... u3*(u4*u4)*(v1*v1) + u1*u2*u3*v1*v2 + u1*u2*u4*v1*v2 - ... u1*u3*u4*v1*v2 - 2*u2*u3*u4*v1*v2 - u1*(u4*u4)*v1*v2 + ... 2*u3*(u4*u4)*v1*v2 - (u1*u1)*u4*(v2*v2) + ... u1*u3*u4*(v2*v2) + u1*(u4*u4)*(v2*v2) - ... u3*(u4*u4)*(v2*v2) + u1*(u2*u2)*v1*v3 - ... 2*u1*u2*u4*v1*v3 + u1*(u4*u4)*v1*v3 - (u1*u1)*u2*v2*v3 + ... (u1*u1)*u4*v2*v3 + u1*u2*u4*v2*v3 - u1*(u4*u4)*v2*v3 - ... u1*(u2*u2)*v1*v4 - u1*u2*u3*v1*v4 + 2*(u2*u2)*u3*v1*v4 + ... u1*u2*u4*v1*v4 + u1*u3*u4*v1*v4 - 2*u2*u3*u4*v1*v4 + ... (u1*u1)*u2*v2*v4 - u1*u2*u3*v2*v4 + (u1*u1)*u4*v2*v4 - ... 2*u1*u2*u4*v2*v4 - u1*u3*u4*v2*v4 + 2*u2*u3*u4*v2*v4 + ... (u1*u1)*u2*v3*v4 - u1*(u2*u2)*v3*v4 - (u1*u1)*u4*v3*v4 + ... u1*u2*u4*v3*v4 - (u1*u1)*u2*(v4*v4) + ... u1*(u2*u2)*(v4*v4) + u1*u2*u3*(v4*v4) - ... (u2*u2)*u3*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4)) - ... (u2*(u3*u3)*(v1*v1) - 2*u2*u3*u4*(v1*v1) + ... u2*(u4*u4)*(v1*v1) - u1*(u3*u3)*v1*v2 + ... 2*u1*u3*u4*v1*v2 - u1*(u4*u4)*v1*v2 - u1*u2*u3*v1*v3 + ... u1*u2*u4*v1*v3 - u1*u3*u4*v1*v3 + 2*u2*u3*u4*v1*v3 + ... u1*(u4*u4)*v1*v3 - 2*u2*(u4*u4)*v1*v3 + ... (u1*u1)*u3*v2*v3 - (u1*u1)*u4*v2*v3 - u1*u3*u4*v2*v3 + ... u1*(u4*u4)*v2*v3 + (u1*u1)*u4*(v3*v3) - ... u1*u2*u4*(v3*v3) - u1*(u4*u4)*(v3*v3) + ... u2*(u4*u4)*(v3*v3) + u1*u2*u3*v1*v4 + u1*(u3*u3)*v1*v4 - ... 2*u2*(u3*u3)*v1*v4 - u1*u2*u4*v1*v4 - u1*u3*u4*v1*v4 + ... 2*u2*u3*u4*v1*v4 - (u1*u1)*u3*v2*v4 + u1*(u3*u3)*v2*v4 + ... (u1*u1)*u4*v2*v4 - u1*u3*u4*v2*v4 - (u1*u1)*u3*v3*v4 + ... u1*u2*u3*v3*v4 - (u1*u1)*u4*v3*v4 + u1*u2*u4*v3*v4 + ... 2*u1*u3*u4*v3*v4 - 2*u2*u3*u4*v3*v4 + (u1*u1)*u3*(v4*v4) - ... u1*u2*u3*(v4*v4) - u1*(u3*u3)*(v4*v4) + ... u2*(u3*u3)*(v4*v4))/... (u2*(u3*u3)*(v1*v1)*v2 - 2*u2*u3*u4*(v1*v1)*v2 + ... u2*(u4*u4)*(v1*v1)*v2 - u1*(u3*u3)*v1*(v2*v2) + ... 2*u1*u3*u4*v1*(v2*v2) - u1*(u4*u4)*v1*(v2*v2) - ... (u2*u2)*u3*(v1*v1)*v3 + 2*u2*u3*u4*(v1*v1)*v3 - ... u3*(u4*u4)*(v1*v1)*v3 + 2*u1*u2*u4*v1*v2*v3 - ... 2*u1*u3*u4*v1*v2*v3 - 2*u2*(u4*u4)*v1*v2*v3 + ... 2*u3*(u4*u4)*v1*v2*v3 + (u1*u1)*u3*(v2*v2)*v3 - ... 2*(u1*u1)*u4*(v2*v2)*v3 + 2*u1*(u4*u4)*(v2*v2)*v3 - ... u3*(u4*u4)*(v2*v2)*v3 + u1*(u2*u2)*v1*(v3*v3) - ... 2*u1*u2*u4*v1*(v3*v3) + u1*(u4*u4)*v1*(v3*v3) - ... (u1*u1)*u2*v2*(v3*v3) + 2*(u1*u1)*u4*v2*(v3*v3) - ... 2*u1*(u4*u4)*v2*(v3*v3) + u2*(u4*u4)*v2*(v3*v3) + ... 2*(u2*u2)*u3*(v1*v1)*v4 - 2*u2*(u3*u3)*(v1*v1)*v4 - ... (u2*u2)*u4*(v1*v1)*v4 + (u3*u3)*u4*(v1*v1)*v4 - ... 2*u1*u2*u3*v1*v2*v4 + 2*u1*(u3*u3)*v1*v2*v4 + ... 2*u2*u3*u4*v1*v2*v4 - 2*(u3*u3)*u4*v1*v2*v4 + ... (u1*u1)*u4*(v2*v2)*v4 - 2*u1*u3*u4*(v2*v2)*v4 + ... (u3*u3)*u4*(v2*v2)*v4 - 2*u1*(u2*u2)*v1*v3*v4 + ... 2*u1*u2*u3*v1*v3*v4 + 2*(u2*u2)*u4*v1*v3*v4 - ... 2*u2*u3*u4*v1*v3*v4 + 2*(u1*u1)*u2*v2*v3*v4 - ... 2*(u1*u1)*u3*v2*v3*v4 - 2*u1*u2*u4*v2*v3*v4 + ... 2*u1*u3*u4*v2*v3*v4 - (u1*u1)*u4*(v3*v3)*v4 + ... 2*u1*u2*u4*(v3*v3)*v4 - (u2*u2)*u4*(v3*v3)*v4 + ... u1*(u2*u2)*v1*(v4*v4) - 2*(u2*u2)*u3*v1*(v4*v4) - ... u1*(u3*u3)*v1*(v4*v4) + 2*u2*(u3*u3)*v1*(v4*v4) - ... (u1*u1)*u2*v2*(v4*v4) + 2*u1*u2*u3*v2*(v4*v4) - ... u2*(u3*u3)*v2*(v4*v4) + (u1*u1)*u3*v3*(v4*v4) - ... 2*u1*u2*u3*v3*(v4*v4) + (u2*u2)*u3*v3*(v4*v4));