#pragma once #include #include "types.h" #ifdef __cplusplus #include "potts.h" extern "C" { #endif q_t *symmetric_compose(q_t q, const q_t *g1, const q_t *g2); q_t symmetric_act(const q_t *g, q_t s); q_t *symmetric_invert(q_t q, const q_t *g); q_t *symmetric_gen_transformations(q_t q); #ifdef __cplusplus } #endif #ifdef __cplusplus template class symmetric_t { public: q_t *perm; }; template void init(symmetric_t *p) { p->perm = (q_t *)malloc(q * sizeof(q_t)); for (q_t i = 0; i < q; i++) { p->perm[i] = i; } } template void free_spin(symmetric_t p) { free(p.perm); } template symmetric_t copy(symmetric_t x) { symmetric_t x2; x2.perm = (q_t *)malloc(q * sizeof(q_t)); for (q_t i = 0; i < q; i++) { x2.perm[i] = x.perm[i]; } return x2; } template potts_t act(symmetric_t r, potts_t s) { potts_t s2; s2.x = r.perm[s.x]; return s2; } template symmetric_t act(symmetric_t r1, symmetric_t r2) { symmetric_t r3; r3.perm = (q_t *)malloc(q * sizeof(q_t)); for (q_t i = 0; i < q; i++) { r3.perm[i] = r1.perm[r2.perm[i]]; } return r3; } template potts_t act_inverse(symmetric_t r, potts_t s) { potts_t s2; q_t i; for (i = 0; i < q; i++) { if (r.perm[i] == s.x) { break; } } s2.x = i; return s2; } template symmetric_t act_inverse(symmetric_t r1, symmetric_t r2) { symmetric_t r3; r3.perm = (q_t *)malloc(q * sizeof(q_t)); for (q_t i = 0; i < q; i++) { r3.perm[r1.perm[i]] = r2.perm[i]; } return r3; } #endif