Построение группы по образующим и cоотношениям Python
Не могу никак найти алгоритм построения группы по образующим и соотношениям. Имею собственные идеи, однако упираюсь в проблемы в реализации, так как не очень давно работаю с Python.
Моя идея заключается в следующем
прочтение образующих (символьные переменные SymPy)
прочтение соотношений (не совсем понимаю, как реализовать их типом данных SymPy, так как считываю строку, а затем уже пихаю ее в массив в виде условия и следствия соотношения (выражение до и после знака "="))
далее, я полагаю, нужно обойти массив образующих в цикле двойной вложенности, умножая каждый элемент друг на друга. Если элемент полученный из умножения уже содержится в массиве образующих, то проигнорировать его, иначе проверить: если элемент удовлетворяет соотношению, то вместо полученного из умножения элемента, добавить в массив следствие из данного соотношения.
таким образом массив с образующими становится полной группой (задумано, что дана всегда конечная группа)
Сначала все казалось понятным, но вот какие проблемы встали передо мной:
как без костылей интерпретировать входящее соотношение в выражение SymPy (например, если результат ввода --
"b * a**2 = a**0")как закончить цикл добавления элементов в массив образующих
Прилагаю код (кривой и косой, потому что пишется на скорую руку, однако все закомментировал). Пока программа лишь пытается добавлять уникальные элементы в массив образующих.
from sympy import *
import numexpr as ne
# Ввод образующих и их сохранение
formers_count = int(input("Введите количество образующих\n"))
formers_list = [''] * formers_count
for i in range(len(formers_list)):
formers_list[i] = symbols(input("Введите образующие \n"))
# Ввод соотношений, их валидация и сохранение в два массива:
# - один массив хранит условие соотношения (до равно)
# - второй массив хранит следствия соотношения (после равно)
# Сначала вводим соотношения
exp_count = int(input("Введите количество соотношений\n"))
exp_list = [''] * exp_count
for i in range(len(exp_list)):
exp_list[i] = input("Введите соотношение\n")
# Разделяем на два массива
exp_cond_list = [''] * exp_count
exp_cons_list = [''] * exp_count
i = 0
for exp in exp_list:
exp_cond_list[i] = exp[:exp.find('=') - 1]
exp_cons_list[i] = exp[exp.find('=') + 2:]
i += 1
# Создание массивов элементов группы по введенным образующим и соотношениям
# Я полагаю, что нам нужно обойти все элементы массива с образующими во вложенном цикле второго уровня,
# чтобы перемножить все образующие друг на друга. При каждой операции условного умножения проверять, не получилось ли
# у нас значение из списка с уловиями соотношения. Если такое значение получилось, то заменяем его
# соответствующим следствием соотношения
for i in range(len(formers_list)):
for j in range(len(formers_list)):
if formers_list[i] * formers_list[j] not in formers_list:
if f"{formers_list[i] * formers_list[j]}" in exp_cond_list:
formers_list.append(exp_cons_list[exp_cond_list.find(f"{formers_list[i] * formers_list[j]}")])