Skip to content

Instantly share code, notes, and snippets.

@kirelagin
Created September 18, 2011 23:45
Show Gist options
  • Save kirelagin/1225727 to your computer and use it in GitHub Desktop.
Save kirelagin/1225727 to your computer and use it in GitHub Desktop.
Group properties checker
#!/usr/bin/env python3
from abc import ABCMeta, abstractmethod
class Biop(metaclass=ABCMeta):
_set = None
@property
def set(self):
return self._set
@property
def set_len(self):
return len(self._set)
@abstractmethod
def __call__(self, a, b): pass
class TableBiop(Biop):
@property
def group_cord(self):
return self._group_cord
def __init__(self, table):
self._set = range(len(table))
assert(all(len(row) == self.set_len for row in table))
assert(all(v >= 0 and v < self.set_len for row in table for v in row))
self._table = table
def __call__(self, a, b):
return self._table[a][b]
def is_assoc(op):
for i in op.set:
for j in op.set:
for k in op.set:
if op(op(i,j),k) != op(i,op(j,k)):
return False
return True
def has_neutral(op):
return all(op(i, 0) == op(0, i) == i for i in op.set)
def has_inverse(op):
def inv_exists(i):
for j in op.set:
if op(i,j) == op(j,i) == 0:
return True
return False
return all(inv_exists(i) for i in op.set)
def is_group_op(op):
return is_assoc(op) and has_neutral(op) and has_inverse(op)
op = TableBiop([
[0, 1, 2],
[1, 2, 0],
[2, 0, 1]
])
print(is_group_op(op))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment