bool TShapeOrientB1::evaluate_with_hess( const MsqMatrix<2,2>& T, double& result, MsqMatrix<2,2>& deriv_wrt_T, MsqMatrix<2,2> second_wrt_T[3], MsqError& err ) { const double norm = Frobenius(T); const double invroot = 1.0/MSQ_SQRT_TWO; const double tau = det(T); if (TMetric::invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } const double inv_tau = 1.0/tau; const double invnorm = 1.0/norm; const double f = norm - invroot * trace(T); result = 0.5 * inv_tau * f; const MsqMatrix<2,2> adjt = transpose_adj(T); deriv_wrt_T = invnorm * T; pluseq_scaled_I( deriv_wrt_T, -invroot ); deriv_wrt_T *= 0.5; deriv_wrt_T -= result * adjt; deriv_wrt_T *= inv_tau; const double a = 0.5 * inv_tau * invnorm; set_scaled_outer_product( second_wrt_T, -a*invnorm*invnorm, T ); pluseq_scaled_I( second_wrt_T, a ); pluseq_scaled_outer_product( second_wrt_T, f*inv_tau*inv_tau*inv_tau, adjt ); pluseq_scaled_2nd_deriv_of_det( second_wrt_T, -0.5*f*inv_tau*inv_tau, T ); pluseq_scaled_sum_outer_product( second_wrt_T, -0.5*inv_tau*inv_tau*invnorm, T, adjt ); pluseq_scaled_sum_outer_product_I( second_wrt_T, 0.5*inv_tau*inv_tau*invroot, adjt ); return true; }
bool Target3DShape::evaluate_with_hess( const MsqMatrix<3,3>& A, const MsqMatrix<3,3>& W, double& result, MsqMatrix<3,3>& deriv_wrt_A, MsqMatrix<3,3> second_wrt_A[6], MsqError& err ) { MsqMatrix<3,3> Winv = inverse(W); MsqMatrix<3,3> T = A * Winv; double f = Frobenius(T); double d = det(T); result = f*f*f - 3*MSQ_SQRT_THREE*d; deriv_wrt_A = T; deriv_wrt_A *= f; deriv_wrt_A -= MSQ_SQRT_THREE*transpose_adj(T); deriv_wrt_A *= 3; deriv_wrt_A = deriv_wrt_A * transpose(Winv); set_scaled_2nd_deriv_of_det( second_wrt_A, -3 * MSQ_SQRT_THREE, T ); pluseq_scaled_outer_product( second_wrt_A, 3.0/f, T ); pluseq_scaled_I( second_wrt_A, 3.0*f ); second_deriv_wrt_product_factor( second_wrt_A, Winv ); return true; }
bool Target2DShapeOrientBarrier::evaluate_with_grad( const MsqMatrix<2,2>& A, const MsqMatrix<2,2>& W, double& result, MsqMatrix<2,2>& deriv, MsqError& err ) { const MsqMatrix<2,2> Winv = inverse(W); const MsqMatrix<2,2> T = A * Winv; const double norm = Frobenius(T); const double invroot = 1.0/MSQ_SQRT_TWO; const double tau = det(T); if (invalid_determinant(tau)) { // barrier result = 0.0; return false; } const double inv_tau = 1.0/tau; const double invnorm = 1.0/norm; result = 0.5*inv_tau*(norm - invroot * trace(T)); deriv = invnorm * T; deriv(0,0) -= invroot; deriv(1,1) -= invroot; deriv *= 0.5; deriv -= result * transpose_adj(T); deriv *= inv_tau; deriv = deriv * transpose(Winv); return true; }
template <unsigned DIM> static inline bool hess( const MsqMatrix<DIM,DIM>& T, double& result, MsqMatrix<DIM,DIM>& deriv, MsqMatrix<DIM,DIM>* second ) { const double norm = Frobenius(T); const double invroot = 1.0/DimConst<DIM>::sqrt(); const double tau = det(T); if (TMetric::invalid_determinant(tau)) { // barrier result = 0.0; return false; } const double inv_tau = 1.0/tau; const double invnorm = 1.0/norm; const double f = norm - invroot * trace(T); result = 0.5 * inv_tau * f; const MsqMatrix<DIM,DIM> adjt = transpose_adj(T); deriv = invnorm * T; pluseq_scaled_I( deriv, -invroot ); deriv *= 0.5; deriv -= result * adjt; deriv *= inv_tau; const double a = 0.5 * inv_tau * invnorm; set_scaled_outer_product( second, -a*invnorm*invnorm, T ); pluseq_scaled_I( second, a ); pluseq_scaled_outer_product( second, f*inv_tau*inv_tau*inv_tau, adjt ); pluseq_scaled_2nd_deriv_of_det( second, -0.5*f*inv_tau*inv_tau, T ); pluseq_scaled_sum_outer_product( second, -0.5*inv_tau*inv_tau*invnorm, T, adjt ); pluseq_scaled_sum_outer_product_I( second, 0.5*inv_tau*inv_tau*invroot, adjt ); return true; }
bool TShapeB1::evaluate_with_hess( const MsqMatrix<3,3>& T, double& result, MsqMatrix<3,3>& deriv_wrt_T, MsqMatrix<3,3> second_wrt_T[6], MsqError& err ) { double d = det(T); if (invalid_determinant(d)) { MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } double id = 1.0/d; double norm = Frobenius(T); double den = 1.0/(3 * MSQ_SQRT_THREE * d); double norm_cube = norm*norm*norm; result = norm_cube * den - 1.0; MsqMatrix<3,3> adjt = transpose_adj(T); deriv_wrt_T = T; deriv_wrt_T *= 3 * norm * den; deriv_wrt_T -= norm_cube * den * id * transpose_adj(T); set_scaled_outer_product( second_wrt_T, 3 * den / norm, T ); pluseq_scaled_I( second_wrt_T, 3 * norm * den ); pluseq_scaled_2nd_deriv_of_det( second_wrt_T, -den * norm_cube * id, T ); pluseq_scaled_outer_product( second_wrt_T, 2 * den * norm_cube * id * id , adjt ); pluseq_scaled_sum_outer_product( second_wrt_T, -3 * norm * den * id, T, adjt ); return true; }
virtual double metric(stk_classic::mesh::Entity& element, bool& valid) { valid = true; JacobianUtil jacA, jacSA, jacW; jacSA.m_scale_to_unit = true; double SA_ = 0.0, A_ = 0.0, W_ = 0.0; // current and reference detJ jacA(A_, *m_eMesh, element, m_coord_field_current, m_topology_data); jacSA(SA_, *m_eMesh, element, m_coord_field_current, m_topology_data); jacW(W_, *m_eMesh, element, m_coord_field_original, m_topology_data); double val=0.0, val_shape=0.0; val_shape = 0.0; //val_shape = std::numeric_limits<double>::max(); for (int i=0; i < jacA.m_num_nodes; i++) { double detAi = jacA.m_detJ[i]; double detSAi = jacSA.m_detJ[i]; //double detWi = jacW.m_detJ[i]; double FAi = Frobenius(jacA.m_detJ[i]); double FWi = Frobenius(jacW.m_detJ[i]); if (detAi < 0) { valid = false; } double shape_metric = 0.0; //MsqMatrix<3,3>& A = jacA.m_J[i]; double scale_factor = (FAi < FWi ? FAi/FWi : (FAi > 1.e-6? FWi / FAi : 1.0)); scale_factor = FAi/FWi; //scale_factor = 1.0; //double sign_SA = (detSAi > 0.0 ? 1.0 : -1.0); //double fac = 0.2; //shape_metric = scale_factor* (detSAi > fac ? fac : detSAi); shape_metric = scale_factor*detSAi; val_shape += shape_metric; //val_shape = std::min(val_shape, shape_metric); //std::cout << "tmp srk i= " << i << " detAi = " << detAi << " detSAi= " << detSAi << " shape_metric= " << shape_metric << " val_shape= " << val_shape << " scale_factor= " << scale_factor << " FAi= " << FAi << " FWi= " << FWi << std::endl; } val = -val_shape; //std::cout << "tmp srk val = " << val << std::endl; return val; }
bool Target3DShape::evaluate( const MsqMatrix<3,3>& A, const MsqMatrix<3,3>& W, double& result, MsqError& ) { MsqMatrix<3,3> T = A * inverse(W); double f = Frobenius(T); double d = det(T); result = f*f*f - 3*MSQ_SQRT_THREE*d; return true; }
template <unsigned DIM> static inline bool eval( const MsqMatrix<DIM,DIM>& T, double& result ) { const double tau = det(T); if (TMetric::invalid_determinant(tau)) { // barrier result = 0.0; return false; } result = 0.5/tau * (Frobenius( T ) - trace(T)/DimConst<DIM>::sqrt()); return true; }
bool TShapeOrientB1::evaluate( const MsqMatrix<2,2>& T, double& result, MsqError& err ) { const double tau = det(T); if (TMetric::invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } result = 0.5/tau * (Frobenius( T ) - trace(T)/MSQ_SQRT_TWO); return true; }
bool Target2DShapeOrientBarrier::evaluate( const MsqMatrix<2,2>& A, const MsqMatrix<2,2>& W, double& result, MsqError& ) { MsqMatrix<2,2> T = A * inverse(W); const double tau = det(T); if (invalid_determinant(tau)) { // barrier result = 0.0; return false; } result = 0.5/tau * (Frobenius( T ) - trace(T)/MSQ_SQRT_TWO); return true; }
bool TShapeSizeB3::evaluate( const MsqMatrix<3,3>& T, double& result, MsqError& err ) { const double tau = det(T); if (invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } double n = Frobenius(T); result = n*n*n - 3*MSQ_SQRT_THREE*( log(tau) + 1 ); return true; }
bool TShapeB1::evaluate( const MsqMatrix<3,3>& T, double& result, MsqError& err) { double f = Frobenius(T); double d = det(T); double den = 3 * MSQ_SQRT_THREE * d; if (invalid_determinant(d)) { MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } result = (f*f*f)/den - 1.0; return true; }
bool TShapeSize3DB4::evaluate( const MsqMatrix<3,3>& T, double& result, MsqError& err ) { const double tau = det(T); if (invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } const double norm = Frobenius(T); result = norm*norm*norm / (3*MSQ_SQRT_THREE*tau) - 1 + mGamma * (tau + 1/tau - 2); return true; }
bool Target3DShape::evaluate_with_grad( const MsqMatrix<3,3>& A, const MsqMatrix<3,3>& W, double& result, MsqMatrix<3,3>& deriv_wrt_A, MsqError& err ) { MsqMatrix<3,3> Winv = inverse(W); MsqMatrix<3,3> T = A * Winv; double f = Frobenius(T); double d = det(T); result = f*f*f - 3*MSQ_SQRT_THREE*d; deriv_wrt_A = T; deriv_wrt_A *= f; deriv_wrt_A -= MSQ_SQRT_THREE*transpose_adj(T); deriv_wrt_A *= 3; deriv_wrt_A = deriv_wrt_A * transpose(Winv); return true; }
bool TShapeB1::evaluate_with_grad( const MsqMatrix<3,3>& T, double& result, MsqMatrix<3,3>& wrt_T, MsqError& err ) { double d = det(T); if (invalid_determinant(d)) { MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } double norm = Frobenius(T); double den = 1.0/(3 * MSQ_SQRT_THREE * d); double norm_cube = norm*norm*norm; result = norm_cube * den - 1.0; wrt_T = T; wrt_T *= 3 * norm * den; wrt_T -= norm_cube * den/d * transpose_adj(T); return true; }
bool TShapeSize3DB4::evaluate_with_hess( const MsqMatrix<3,3>& T, double& result, MsqMatrix<3,3>& deriv, MsqMatrix<3,3> second[6], MsqError& err ) { const double tau = det(T); if (invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } const double norm = Frobenius(T); const double f = norm*norm/3.0; const double h = 1/(MSQ_SQRT_THREE * tau); const double g = norm * h; const double inv_tau = 1.0/tau; result = f * g - 1 + mGamma * (tau + inv_tau - 2); const double g1 = mGamma * (1 - inv_tau*inv_tau); const MsqMatrix<3,3> adjt = transpose_adj(T); deriv = g*T; deriv += (g1 - f*g*inv_tau) * adjt; if (norm > 1e-50) { const double inv_norm = 1/norm; set_scaled_outer_product( second, h*inv_norm, T ); pluseq_scaled_I( second, norm * h ); pluseq_scaled_2nd_deriv_of_det( second, g1 - f*g*inv_tau, T ); pluseq_scaled_outer_product( second, (f*g + mGamma*inv_tau)*2*inv_tau*inv_tau, adjt ); pluseq_scaled_sum_outer_product( second, -g*inv_tau, T, adjt ); } else { std::cout << "Warning: Division by zero avoided in TShapeSize3DB4::evaluate_with_hess()" << std::endl; } return true; }
bool Target2DShapeOrientBarrier::evaluate_with_hess( const MsqMatrix<2,2>& A, const MsqMatrix<2,2>& W, double& result, MsqMatrix<2,2>& deriv, MsqMatrix<2,2> second[3], MsqError& err ) { const MsqMatrix<2,2> Winv = inverse(W); const MsqMatrix<2,2> T = A * Winv; const double norm = Frobenius(T); const double invroot = 1.0/MSQ_SQRT_TWO; const double tau = det(T); if (invalid_determinant(tau)) { // barrier result = 0.0; return false; } const double inv_tau = 1.0/tau; const double invnorm = 1.0/norm; const double f = norm - invroot * trace(T); result = 0.5 * inv_tau * f; const MsqMatrix<2,2> adjt = transpose_adj(T); deriv = invnorm * T; deriv(0,0) -= invroot; deriv(1,1) -= invroot; deriv *= 0.5; deriv -= result * adjt; deriv *= inv_tau; deriv = deriv * transpose(Winv); const double a = 0.5 * inv_tau * invnorm; set_scaled_outer_product( second, -a*invnorm*invnorm, T ); pluseq_scaled_I( second, a ); pluseq_scaled_outer_product( second, f*inv_tau*inv_tau*inv_tau, adjt ); pluseq_scaled_2nd_deriv_of_det( second, -0.5*f*inv_tau*inv_tau ); pluseq_scaled_sum_outer_product( second, -0.5*inv_tau*inv_tau*invnorm, T, adjt ); pluseq_scaled_sum_outer_product_I( second, 0.5*inv_tau*inv_tau*invroot, adjt ); second_deriv_wrt_product_factor( second, Winv ); return true; }
bool TShapeSizeB3::evaluate_with_grad( const MsqMatrix<3,3>& T, double& result, MsqMatrix<3,3>& deriv_wrt_T, MsqError& err ) { const double tau = det(T); if (invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } double n = Frobenius(T); result = n*n*n - 3*MSQ_SQRT_THREE*( log(tau) + 1 ); const MsqMatrix<3,3> adjt = transpose_adj(T); deriv_wrt_T = T; deriv_wrt_T *= 3*n; deriv_wrt_T -= 3*MSQ_SQRT_THREE/tau * adjt; return true; }
bool TShapeSize3DB4::evaluate_with_grad( const MsqMatrix<3,3>& T, double& result, MsqMatrix<3,3>& deriv, MsqError& err ) { const double tau = det(T); if (invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } const double norm = Frobenius(T); const double f = norm*norm/3.0; const double g = norm / (MSQ_SQRT_THREE * tau); const double inv_tau = 1.0/tau; result = f * g - 1 + mGamma * (tau + inv_tau - 2); deriv = g*T; deriv += (mGamma * (1 - inv_tau*inv_tau) - f*g*inv_tau) * transpose_adj(T); return true; }
bool TShapeOrientB1::evaluate_with_grad( const MsqMatrix<2,2>& T, double& result, MsqMatrix<2,2>& deriv_wrt_T, MsqError& err ) { const double norm = Frobenius(T); const double invroot = 1.0/MSQ_SQRT_TWO; const double tau = det(T); if (TMetric::invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } const double inv_tau = 1.0/tau; const double invnorm = 1.0/norm; result = 0.5*inv_tau*(norm - invroot * trace(T)); deriv_wrt_T = invnorm * T; pluseq_scaled_I( deriv_wrt_T, -invroot ); deriv_wrt_T *= 0.5; deriv_wrt_T -= result * transpose_adj(T); deriv_wrt_T *= inv_tau; return true; }
template <unsigned DIM> static inline bool grad( const MsqMatrix<DIM,DIM>& T, double& result, MsqMatrix<DIM,DIM>& deriv ) { const double norm = Frobenius(T); const double invroot = 1.0/DimConst<DIM>::sqrt(); const double tau = det(T); if (TMetric::invalid_determinant(tau)) { // barrier result = 0.0; return false; } const double inv_tau = 1.0/tau; const double invnorm = 1.0/norm; result = 0.5*inv_tau*(norm - invroot * trace(T)); deriv = invnorm * T; pluseq_scaled_I( deriv, -invroot ); deriv *= 0.5; deriv -= result * transpose_adj(T); deriv *= inv_tau; return true; }
bool TShapeSizeB3::evaluate_with_hess( const MsqMatrix<3,3>& T, double& result, MsqMatrix<3,3>& deriv_wrt_T, MsqMatrix<3,3> second_wrt_T[6], MsqError& err ) { const double tau = det(T); if (invalid_determinant(tau)) { // barrier MSQ_SETERR(err)( barrier_violated_msg, MsqError::BARRIER_VIOLATED ); return false; } double n = Frobenius(T); result = n*n*n - 3*MSQ_SQRT_THREE*( log(tau) + 1 ); const MsqMatrix<3,3> adjt = transpose_adj(T); const double it = 1/tau; deriv_wrt_T = T; deriv_wrt_T *= 3*n; deriv_wrt_T -= 3*MSQ_SQRT_THREE*it * adjt; if (n > 1e-50) { set_scaled_outer_product( second_wrt_T, 3/n, T ); pluseq_scaled_I( second_wrt_T, 3*n ); pluseq_scaled_2nd_deriv_of_det( second_wrt_T, -3*MSQ_SQRT_THREE*it, T ); pluseq_scaled_outer_product( second_wrt_T, 3*MSQ_SQRT_THREE*it*it, adjt ); } else { std::cout << "Warning: Division by zero avoided in TShapeSizeB3::evaluate_with_hess()" << std::endl; } return true; }
GT PFC::multi_miller(int n,G2** QQ,G1** PP) { GT z; ZZn *Px,*Py; int i,j,*k,nb; ECn3 *Q,*A,*A2; ECn P; ZZn18 res,rd; Big m; Big X=*x; Px=new ZZn[n]; Py=new ZZn[n]; Q=new ECn3[n]; A=new ECn3[n]; A2=new ECn3[n]; k=new int[n]; m=X/7; nb=bits(m); res=1; for (j=0;j<n;j++) { k[j]=0; P=PP[j]->g; normalise(P); Q[j]=QQ[j]->g; extract(P,Px[j],Py[j]); } for (j=0;j<n;j++) A[j]=Q[j]; for (i=nb-2;i>=0;i--) { res*=res; for (j=0;j<n;j++) { if (QQ[j]->ptable==NULL) res*=g(A[j],A[j],Px[j],Py[j]); else res*=gp(QQ[j]->ptable,k[j],Px[j],Py[j]); } if (bit(m,i)==1) for (j=0;j<n;j++) { if (QQ[j]->ptable==NULL) res*=g(A[j],Q[j],Px[j],Py[j]); else res*=gp(QQ[j]->ptable,k[j],Px[j],Py[j]); } if (res.iszero()) return 0; } rd=res; res*=res; for (j=0;j<n;j++) { if (QQ[j]->ptable==NULL) { Q[j]=A[j]; res*=g(A[j],A[j],Px[j],Py[j]); } else res*=gp(QQ[j]->ptable,k[j],Px[j],Py[j]); } rd*=res; for (j=0;j<n;j++) { if (QQ[j]->ptable==NULL) { A2[j]=A[j]; rd*=g(A[j],Q[j],Px[j],Py[j]); } else rd*=gp(QQ[j]->ptable,k[j],Px[j],Py[j]); } res*=Frobenius(rd,*frob,6); for (j=0;j<n;j++) { if (QQ[j]->ptable==NULL) { A[j]=psi(A[j],*frob,6); res*=g(A[j],A2[j],Px[j],Py[j]); } else res*=gp(QQ[j]->ptable,k[j],Px[j],Py[j]); } delete [] k; delete [] A2; delete [] A; delete [] Q; delete [] Py; delete [] Px; z.g=res; return z; }
GT PFC::miller_loop(const G2& QQ,const G1& PP) { GT z; Big n; int i,j,nb,nbw,nzs; ECn3 A,m2A,Q; ECn P; ZZn Px,Py; BOOL precomp; ZZn18 r,rd; Big X=*x; Q=QQ.g; P=PP.g; precomp=FALSE; if (QQ.ptable!=NULL) precomp=TRUE; normalise(P); extract(P,Px,Py); A=Q; n=(X/7); nb=bits(n); r=1; j=0; r.mark_as_miller(); for (i=nb-2;i>=0;i--) { r*=r; if (precomp) r*=gp(QQ.ptable,j,Px,Py); else r*=g(A,A,Px,Py); if (bit(n,i)) { if (precomp) r*=gp(QQ.ptable,j,Px,Py); else r*=g(A,Q,Px,Py); } } rd=r; r*=r; Q=A; if (precomp) r*=gp(QQ.ptable,j,Px,Py); else r*=g(A,A,Px,Py); rd*=r; m2A=A; if (precomp) rd*=gp(QQ.ptable,j,Px,Py); else rd*=g(A,Q,Px,Py); r*=Frobenius(rd,*frob,6); if (precomp) r*=gp(QQ.ptable,j,Px,Py); else { A=psi(A,*frob,6); r*=g(A,m2A,Px,Py); } z.g=r; return z; }
ZZn18 HardExpo(ZZn18 &f3x0, ZZn &X, Big &x){ //vector=[ 3, 5, 7, 14, 15, 21, 25, 35, 49, 54, 62, 70, 87, 98, 112, 245, 273, 319, 343, 434, 450, 581, 609, 784, 931, 1407, 1911, 4802, 6517 ] ZZn18 xA; ZZn18 xB; ZZn18 t0; ZZn18 t1; ZZn18 t2; ZZn18 t3; ZZn18 t4; ZZn18 t5; ZZn18 t6; ZZn18 t7; ZZn18 f3x1; ZZn18 f3x2; ZZn18 f3x3; ZZn18 f3x4; ZZn18 f3x5; ZZn18 f3x6; ZZn18 f3x7; f3x1=pow(f3x0,x); f3x2=pow(f3x1,x); f3x3=pow(f3x2,x); f3x4=pow(f3x3,x); f3x5=pow(f3x4,x); f3x6=pow(f3x5,x); f3x7=pow(f3x6,x); xA=Frobenius(inverse(f3x1),X,2); xB=Frobenius(inverse(f3x0),X,2); t0=xA*xB; xB=Frobenius(inverse(f3x2),X,2); t1=t0*xB; t0=t0*t0; xB=Frobenius(inverse(f3x0),X,2); t0=t0*xB; xB=Frobenius(f3x1,X,1); t0=t0*xB; xA=Frobenius(inverse(f3x5),X,2)*Frobenius(f3x4,X,4)*Frobenius(f3x2,X,5); //xB=Frobenius(f3x1,X,1); t5=xA*xB; t0=t0*t0; t3=t0*t1; xA=Frobenius(inverse(f3x4),X,2)*Frobenius(f3x1,X,5); xB=Frobenius(f3x2,X,1); t1=xA*xB; xA=xB;//Frobenius(f3x2,X,1); xB=xA; //xB=Frobenius(f3x2,X,1); t0=xA*xB; xB=Frobenius(f3x2,X,4); t0=t0*xB; xB=Frobenius(f3x1,X,4); t2=t3*xB; xB=Frobenius(inverse(f3x1),X,2); t4=t3*xB; t2=t2*t2; xB=Frobenius(inverse(f3x2),X,3); t3=t0*xB; xB=inverse(f3x2); t0=t3*xB; t4=t3*t4; xB=Frobenius(inverse(f3x3),X,3); t0=t0*xB; t3=t0*t2; xB=Frobenius(inverse(f3x3),X,2)*Frobenius(f3x0,X,5); t2=t3*xB; t3=t3*t5; t5=t3*t2; xB=inverse(f3x3); t2=t2*xB; xA=Frobenius(inverse(f3x6),X,3); //xB=inverse(f3x3); t3=xA*xB; t2=t2*t2; t4=t2*t4; xB=Frobenius(f3x3,X,1); t2=t1*xB; xA=xB; //xA=Frobenius(f3x3,X,1); xB=Frobenius(inverse(f3x2),X,3); t1=xA*xB; t6=t2*t4; xB=Frobenius(f3x4,X,1); t4=t2*xB; xB=Frobenius(f3x3,X,4); t2=t6*xB; xB=Frobenius(inverse(f3x5),X,3)*Frobenius(f3x5,X,4); t7=t6*xB; t4=t2*t4; xB=Frobenius(f3x6,X,1); t2=t2*xB; t4=t4*t4; t4=t4*t5; xA=inverse(f3x4); xB=Frobenius(inverse(f3x4),X,3); t5=xA*xB; // xB=Frobenius(inverse(f3x4),X,3); t3=t3*xB; xA=Frobenius(f3x5,X,1); xB=xA; //xB=Frobenius(f3x5,X,1); t6=xA*xB; t7=t6*t7; xB=Frobenius(f3x0,X,3); t6=t5*xB; t4=t6*t4; xB=Frobenius(inverse(f3x7),X,3); t6=t6*xB; t0=t4*t0; xB=Frobenius(f3x6,X,4); t4=t4*xB; t0=t0*t0; xB=inverse(f3x5); t0=t0*xB; t1=t7*t1; t4=t4*t7; t1=t1*t1; t2=t1*t2; t1=t0*t3; xB=Frobenius(inverse(f3x3),X,3); t0=t1*xB; t1=t1*t6; t0=t0*t0; t0=t0*t5; xB=inverse(f3x6); t2=t2*xB; t2=t2*t2; t2=t2*t4; t0=t0*t0; t0=t0*t3; t1=t2*t1; t0=t1*t0; // xB=inverse(f3x6); t1=t1*xB; t0=t0*t0; t0=t0*t2; xB=f3x0*inverse(f3x7); t0=t0*xB; // xB=f3x0*inverse(f3x7); t1=t1*xB; t0=t0*t0; t0=t0*t1; return t0; }