void sbox_inv(uint8_t which, const uint32_t in[4], uint32_t out[4]) { uint32_t a[4]; uint32_t b[4]; uint32_t c[4]; uint32_t d[4]; trans(in, a); perm(a, b); t_hat_inv(b, c); s_hat_inv(which, c, d); perm_inv(d, out); }
void M2M(FmmvHandle *FMMV, Box *box) { int p = FMMV->pM; int len0 = (p+1)*(p+1); int len = (p+1)*(p+2); int *P_RT = FMMV->P_MRT; int *P_riri2rrii = FMMV->P_Mriri2rrii; _FLOAT_ x1[(FMM_P_MAX+1)*(FMM_P_MAX+2)]; _FLOAT_ x2[(FMM_P_MAX+1)*(FMM_P_MAX+2)]; _FLOAT_ xx[(FMM_P_MAX+1)*(FMM_P_MAX+2)]; if (!isSource(box)) return; if (isSource(box->child[SWD])&&box->child[SWD]->M) { Rz_pi4(p, box->child[SWD]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, xx); if (isSource(box->child[NEU])&&box->child[NEU]->M) { Rz_pi4(p, box->child[NEU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry_pi(p, x2); VEC_ADD(len, x2, xx, xx); } Ry(p, FMMV->Ry_minus_pi_minus_theta, xx, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } else if (isSource(box->child[NEU])&&box->child[NEU]->M) { Rz_pi4(p, box->child[NEU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta,x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } if (isSource(box->child[NWD])&&box->child[NWD]->M) { Rz_minus_pi4(p, box->child[NWD]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, xx); if (isSource(box->child[SEU])&&box->child[SEU]->M) { Rz_minus_pi4(p, box->child[SEU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry_pi(p, x2); VEC_ADD(len, x2, xx, xx); } Ry(p, FMMV->Ry_minus_pi_minus_theta, xx, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } else if (isSource(box->child[SEU])&&box->child[SEU]->M) { Rz_minus_pi4(p, box->child[SEU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } if (isSource(box->child[SED])&&box->child[SED]->M) { Rz_3pi4(p, box->child[SED]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, xx); if (isSource(box->child[NWU])&&box->child[NWU]->M) { Rz_3pi4(p, box->child[NWU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry_pi(p, x2); VEC_ADD(len, x2, xx, xx); } Ry(p, FMMV->Ry_minus_pi_minus_theta, xx, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_3pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } else if (isSource(box->child[NWU])&&box->child[NWU]->M) { Rz_3pi4(p, box->child[NWU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_3pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } if (isSource(box->child[NED])&&box->child[NED]->M) { Rz_minus_3pi4(p, box->child[NED]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, xx); if (isSource(box->child[SWU])&&box->child[SWU]->M) { Rz_minus_3pi4(p, box->child[SWU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry_pi(p, x2); VEC_ADD(len, x2, xx, xx); } Ry(p, FMMV->Ry_minus_pi_minus_theta, xx, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_3pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } else if (isSource(box->child[SWU])&&box->child[SWU]->M) { Rz_minus_3pi4(p, box->child[SWU]->M, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_M2M(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_3pi4(p, x2, x1); box->M = VEC_ADD2(FMMV, len, x1, box->M); } }
void L2L(FmmvHandle *FMMV, Box *box) { int p = FMMV->pL; int len0 = (p+1)*(p+1); int len = (p+1)*(p+2); int *P_RT = FMMV->P_LRT; int *P_riri2rrii = FMMV->P_Lriri2rrii; _FLOAT_ x1[(FMM_P_MAX+1)*(FMM_P_MAX+2)]; _FLOAT_ x2[(FMM_P_MAX+1)*(FMM_P_MAX+2)]; _FLOAT_ xx[(FMM_P_MAX+1)*(FMM_P_MAX+2)]; if (!isTarget(box)||!box->L) return; if (isTarget(box->child[NEU])) { Rz_pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_minus_pi_minus_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_pi4(p, x2, x1); box->child[NEU]->L = VEC_ADD2(FMMV, len, x1, box->child[NEU]->L); if (isTarget(box->child[SWD])) { Ry_pi(p, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_pi4(p, x2, x1); box->child[SWD]->L = VEC_ADD2(FMMV, len, x1, box->child[SWD]->L); } } else if (isTarget(box->child[SWD])) { Rz_pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_pi4(p, x2, x1); box->child[SWD]->L = VEC_ADD2(FMMV, len, x1, box->child[SWD]->L); } if (isTarget(box->child[SEU])) { Rz_minus_pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_minus_pi_minus_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_pi4(p, x2, x1); box->child[SEU]->L = VEC_ADD2(FMMV, len, x1, box->child[SEU]->L); if (isTarget(box->child[NWD])) { Ry_pi(p, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_pi4(p, x2, x1); box->child[NWD]->L = VEC_ADD2(FMMV, len, x1, box->child[NWD]->L); } } else if (isTarget(box->child[NWD])) { Rz_minus_pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_pi4(p, x2, x1); box->child[NWD]->L = VEC_ADD2(FMMV, len, x1, box->child[NWD]->L); } if (isTarget(box->child[NWU])) { Rz_3pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_minus_pi_minus_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_3pi4(p, x2, x1); box->child[NWU]->L = VEC_ADD2(FMMV, len, x1, box->child[NWU]->L); if (isTarget(box->child[SED])) { Ry_pi(p, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_3pi4(p, x2, x1); box->child[SED]->L = VEC_ADD2(FMMV, len, x1, box->child[SED]->L); } } else if (isTarget(box->child[SED])) { Rz_3pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_minus_3pi4(p, x2, x1); box->child[SED]->L = VEC_ADD2(FMMV, len, x1, box->child[SED]->L); } if (isTarget(box->child[SWU])) { Rz_minus_3pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_pi_minus_theta, x1, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_minus_pi_minus_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_3pi4(p, x2, x1); box->child[SWU]->L = VEC_ADD2(FMMV, len, x1, box->child[SWU]->L); if (isTarget(box->child[NED])) { Ry_pi(p, xx); perm(len0, P_RT, xx, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_3pi4(p, x2, x1); box->child[NED]->L = VEC_ADD2(FMMV, len, x1, box->child[NED]->L); } } else if (isTarget(box->child[NED])) { Rz_minus_3pi4(p, box->L, x2); perm(len0, P_riri2rrii, x2, x1); Ry(p, FMMV->Ry_minus_theta, x1, x2); perm(len0, P_RT, x2, x1); Tz_L2L(FMMV, x1); perm_inv(len0, P_RT, x1, x2); Ry(p, FMMV->Ry_theta, x2, x1); perm_inv(len0, P_riri2rrii, x1, x2); Rz_3pi4(p, x2, x1); box->child[NED]->L = VEC_ADD2(FMMV, len, x1, box->child[NED]->L); } }