knotkit/algebra/Z2.h
Wojciech Politarczyk 203477c3a8 First shot at periodicity congruences
Verification of Przytycki's congruence works fine, however there are
some small modifications that could be made.

The, naive, approach to the verification of periodicity congruence for
the Khovanov polynomial didn't work. There are just too many cases to
check. Generation of all of them can exhaust the memory.
2016-11-24 15:28:31 +01:00

93 lines
2.6 KiB
C++

#ifndef KNOTKIT_ALGEBRA_Z2_H
#define KNOTKIT_ALGEBRA_Z2_H
#include <algebra/Z.h>
#include <iostream>
#include <tuple>
#include <cassert>
class Z2
{
public:
using linear_combination = ::linear_combination<Z2>;
using linear_combination_const_iter = ::linear_combination_const_iter<Z2>;
private:
bool v;
public:
Z2 () : v(0) { }
Z2 (int x) : v((bool)(x & 1)) { }
Z2 (unsigned x) : v((bool)(x & 1)) { }
Z2 (bool v_) : v(v_) { }
Z2 (const Z2& x) : v(x.v) { }
Z2 (Z2&& x) : v(std::move(x.v)) {
x.v = 0;
}
Z2 (reader &r) { v = r.read_bool (); }
Z2 (const Z& z) : v((z % 2).get_ui()) {}
~Z2 () { }
Z2& operator = (const Z2& x) { v = x.v; return *this; }
Z2& operator = (Z2&& x) { v = x.v; x.v = 0; return *this; }
Z2& operator = (int x) { v = (bool)(x & 1); return *this; }
bool operator == (const Z2& x) const { return v == x.v; }
bool operator != (const Z2& x) const { return v != x.v; }
bool operator == (int x) const { return v == (bool)(x & 1); }
bool operator != (int x) const { return !operator == (x); }
bool is_unit () const { return v; }
Z2 operator + (const Z2& x) const { return Z2 (v ^ x.v); }
Z2 operator - (const Z2& x) const { return Z2 (v ^ x.v); }
Z2 operator - () const { return *this; }
Z2 operator * (const Z2& x) const { return Z2 (v & x.v); }
Z2 operator / (const Z2& x) const { assert (x.v); return *this; }
Z2 recip () const { assert (v); return *this; }
Z2& operator += (const Z2& x) { v ^= x.v; return *this; }
Z2& operator -= (const Z2& x) { v ^= x.v; return *this; }
Z2& operator *= (const Z2& x) { v &= x.v; return *this; }
Z2& operator /= (const Z2& x) { assert (x.v); return *this; }
// *this += z1*z2
Z2& muladdeq (const Z2& z1, const Z2& z2)
{
return operator += (z1 * z2);
}
bool divides (Z2 x) const { return v || !x.v; }
bool operator | (const Z2 x) const { return divides (x); }
Z2 div (Z2 x) const
{
assert (x.divides (*this));
return *this;
}
Z2 gcd (Z2 x) const
{
assert (v && x.v);
return Z2 (1);
}
std::tuple<Z2, Z2, Z2> extended_gcd (Z2 x) const
{
if (v)
return std::make_tuple (Z2 (1), Z2 (1), Z2 (0));
else
return std::make_tuple (Z2 (1), Z2 (0), Z2 (1));
}
friend std::ostream& operator << (std::ostream& os, const Z2& x) {
return os << (int)x.v;
}
static void show_ring () { printf ("Z2"); }
void write_self (writer &w) const { w.write_bool (v); }
void show_self () const { std::cout << *this; }
void display_self () const { std::cout << *this << "\n"; }
};
#endif //KNOTKIT_ALGEBRA_Z2_H