From 53f05e5f0bc0b79b4422ecfbb3dde7e346fdddd4 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Wed, 15 Jan 2020 19:17:50 -0500 Subject: refactor --- torus_symmetries.hpp | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 torus_symmetries.hpp (limited to 'torus_symmetries.hpp') diff --git a/torus_symmetries.hpp b/torus_symmetries.hpp new file mode 100644 index 0000000..17772de --- /dev/null +++ b/torus_symmetries.hpp @@ -0,0 +1,100 @@ + +#pragma once + +#include +#include +#include + +#include "matrix.hpp" +#include "vector.hpp" + +template void one_sequences(std::list>& sequences, unsigned level) { + if (level > 0) { + unsigned new_level = level - 1; + unsigned old_length = sequences.size(); + for (std::array& sequence : sequences) { + std::array new_sequence = sequence; + new_sequence[new_level] = -1; + sequences.push_front(new_sequence); + } + one_sequences(sequences, new_level); + } +} + +template std::vector> torus_vecs(U L) { + std::vector> vecs; + std::array ini_sequence; + ini_sequence.fill(1); + std::list> sequences; + sequences.push_back(ini_sequence); + one_sequences(sequences, D); + sequences.pop_front(); // don't want the identity matrix! + + for (std::array sequence : sequences) { + Vector v; + for (unsigned i = 0; i < D; i++) { + if (sequence[i] == 1) { + v(i) = 0; + } else { + v(i) = L / 2; + } + } + + vecs.push_back(v); + } + + return vecs; +} + +template std::vector> torus_mats() { + std::vector> mats; + + std::array ini_sequence; + ini_sequence.fill(1); + std::list> sequences; + sequences.push_back(ini_sequence); + + one_sequences(sequences, D); + + sequences.pop_front(); // don't want the identity matrix! + + for (std::array sequence : sequences) { + Matrix m; + for (unsigned i = 0; i < D; i++) { + for (unsigned j = 0; j < D; j++) { + if (i == j) { + m(i, j) = sequence[i]; + } else { + m(i, j) = 0; + } + } + } + + mats.push_back(m); + } + + for (unsigned i = 0; i < D; i++) { + for (unsigned j = 0; j < D; j++) { + if (i != j) { + Matrix m; + for (unsigned k = 0; k < D; k++) { + for (unsigned l = 0; l < D; l++) { + if ((k == i && l == j) || (k == j && l == i)) { + if (i < j) { + m(k, l) = 1; + } else { + m(k, l) = -1; + } + } else { + m(k, l) = 0; + } + } + } + mats.push_back(m); + } + } + } + + return mats; +} + -- cgit v1.2.3-54-g00ecf