kyopro-lib

This documentation is automatically generated by online-judge-tools/verification-helper

View on GitHub

:heavy_check_mark: Dihedral group
(Mylib/AlgebraicStructure/Group/dihedral.cpp)

Operations

Requirements

Notes

Problems

References

Verified with

Code

#pragma once
#include <iostream>
#include <variant>

namespace haar_lib {
  namespace dihedral_group_impl {
    struct R {
      int value = 0;
      friend std::ostream &operator<<(std::ostream &s, const R &a) {
        s << "R(" << a.value << ")";
        return s;
      }
      R() {}
      R(int value) : value(value) {}
    };

    struct S {
      int value = 0;
      friend std::ostream &operator<<(std::ostream &s, const S &a) {
        s << "S(" << a.value << ")";
        return s;
      }
      S() {}
      S(int value) : value(value) {}
    };
  }  // namespace dihedral_group_impl

  template <const int &K>
  struct dihedral_group {
    using R          = dihedral_group_impl::R;
    using S          = dihedral_group_impl::S;
    using value_type = std::variant<R, S>;

    value_type operator()() const {
      return R(0);
    }

    value_type operator()(const value_type &a, const value_type &b) const {
      if (std::holds_alternative<R>(a)) {
        if (std::holds_alternative<R>(b)) {
          return R((std::get<R>(a).value + std::get<R>(b).value) % K);
        } else {
          return S((std::get<S>(b).value - std::get<R>(a).value + K) % K);
        }
      } else {
        if (std::holds_alternative<R>(b)) {
          return S((std::get<S>(a).value + std::get<R>(b).value) % K);
        } else {
          return R((std::get<S>(b).value - std::get<S>(a).value + K) % K);
        }
      }
    }

    value_type inv(const value_type &a) const {
      if (std::holds_alternative<R>(a)) {
        const int i = std::get<R>(a).value;
        return R(i == 0 ? 0 : K - i);
      } else {
        return a;
      }
    }
  };
}  // namespace haar_lib
#line 2 "Mylib/AlgebraicStructure/Group/dihedral.cpp"
#include <iostream>
#include <variant>

namespace haar_lib {
  namespace dihedral_group_impl {
    struct R {
      int value = 0;
      friend std::ostream &operator<<(std::ostream &s, const R &a) {
        s << "R(" << a.value << ")";
        return s;
      }
      R() {}
      R(int value) : value(value) {}
    };

    struct S {
      int value = 0;
      friend std::ostream &operator<<(std::ostream &s, const S &a) {
        s << "S(" << a.value << ")";
        return s;
      }
      S() {}
      S(int value) : value(value) {}
    };
  }  // namespace dihedral_group_impl

  template <const int &K>
  struct dihedral_group {
    using R          = dihedral_group_impl::R;
    using S          = dihedral_group_impl::S;
    using value_type = std::variant<R, S>;

    value_type operator()() const {
      return R(0);
    }

    value_type operator()(const value_type &a, const value_type &b) const {
      if (std::holds_alternative<R>(a)) {
        if (std::holds_alternative<R>(b)) {
          return R((std::get<R>(a).value + std::get<R>(b).value) % K);
        } else {
          return S((std::get<S>(b).value - std::get<R>(a).value + K) % K);
        }
      } else {
        if (std::holds_alternative<R>(b)) {
          return S((std::get<S>(a).value + std::get<R>(b).value) % K);
        } else {
          return R((std::get<S>(b).value - std::get<S>(a).value + K) % K);
        }
      }
    }

    value_type inv(const value_type &a) const {
      if (std::holds_alternative<R>(a)) {
        const int i = std::get<R>(a).value;
        return R(i == 0 ? 0 : K - i);
      } else {
        return a;
      }
    }
  };
}  // namespace haar_lib
Back to top page