Построение группы по образующим и 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]}")])

Ответы (0 шт):