in grok/data.py [0:0]
def _make_binary_operation_data(cls, operator: str, operands=None) -> List[str]:
if operator == "s5":
operands = operands or list(range(5))
elems = map(np.array, itertools.permutations(operands))
tuples = itertools.product(elems, repeat=2)
elif operator in ["s5conj", "s5aba"]:
operands = operands or list(range(5))
elems = map(Permutation, itertools.permutations(operands))
tuples = itertools.product(elems, repeat=2)
elif "_mod_" in operator:
modulo = int(operator.split("_mod_")[-1])
elems = [Mod(i, modulo) for i in range(modulo)]
tuples = itertools.product(elems, repeat=2)
else:
operands = operands or NUMS
tuples = itertools.product(operands, repeat=2)
# if operator == "s5":
# print("elems", list(elems))
# print("tuples", list(tuples))
eqs = []
for a, b in tuples:
if operator == "/":
if b == 0:
continue
else:
c = a
a = (b * c) % MODULUS
elif operator == "s5":
c = b[a]
elif operator == "s5conj":
c = a * b * (a.__invert__())
elif operator == "s5aba":
c = a * b * a
elif operator == "+*":
if a % 2 == 0:
c = (a + b) % MODULUS
else:
c = (a * b) % MODULUS
elif operator == "+-":
if a % 2 == 0:
c = (a + b) % MODULUS
else:
c = (a - b) % MODULUS
elif "_mod_" in operator:
expression = operator.split("_mod_")[0]
function = eval(f"lambda x, y: ({expression})")
c = function(a, b)
else:
c = eval(f"({a} {operator} {b}) % {MODULUS}")
eq = " ".join(map(render, [a, operator, b, "=", c]))
eqs.append(eq)
# if operator == "s5":
# print("eqs", eqs)
return eqs