Вместо того, чтобы перебирать все возможные перестановки, предположим, что он существует, и попытайтесь его построить. Я считаю, что если все сделано правильно, то сбой алгоритма будет означать отсутствие перестановки.
Вот схема идеи, примененной к вышеприведенным выражениям:
пусть:
str1 = "A m * B s / (A m + C m)"
str2 = "C m * B s / (C m + A m)"
Мы ищем перестановку множества (A, C), которая сделала бы выражения идентичными. Пометьте A и C как X1 и X2 в соответствии с порядком их первого появления в str2, поэтому:
X1 = C
X2 = A
потому что C появляется перед A в str2. Затем создайте массив Y так, чтобы y [i] был i-м символом A или C в порядке первого появления в str1. Итак:
Y[1] = A
Y[2] = C
Поскольку A появляется перед C в str1.
Теперь создайте str3 из str2, заменив A и C на X1 и X2:
str3 = "X1 m * B s / (X1 m + X2 m)"
А затем начните заменять X на Y [i]. Во-первых, X1 становится Y [1] = A:
str3_1 = "A m * Bs / (A m + X2 m)"
На этом этапе сравните str3_1 и str1 до первого вхождения любого из Си, в данном случае X2, так как эти две строки равны:
str3_1[:18] = "A m * B s / (A m + "
str1[:18] = "A m * B s / (A m + "
У вас есть шанс построить перестановку. Если бы они были неравны, вы бы доказали, что подходящей перестановки не существует (потому что любая перестановка должна была бы произвести хотя бы эту замену) и могла бы вывести неэквивалентность. Но они равны, поэтому вы переходите к следующему шагу, заменяя X2 на Y [2] = C:
str3_2 = "A m * B s / (A m + C m)"
И это равно str1, так что у вас есть перестановка (A-> C, C-> A) и вы показали эквивалентность выражений.
Это всего лишь демонстрация алгоритма для конкретного случая, но его следует обобщить. Не уверен, какой самый низкий порядок вы могли бы получить его, но это должно быть быстрее, чем n! генерации всех перестановок по n переменным.
Если я правильно понимаю значение единиц, они ограничивают, какие переменные можно поменять местами с помощью перестановок. Таким образом, A может быть заменено на C в вышеприведенных выражениях, потому что оба имеют единицы 'm', но не те, которые имеют единицы 's' Вы можете справиться с этим следующим образом:
построить выражения str1_m и str2_m из str1 и str2, удалив все символы, не имеющие m единиц, а затем выполнить приведенный выше алгоритм для str1_m и str2_m. Если конструкция терпит неудачу, перестановка не существует. Если построение завершается успешно, сохраните эту перестановку (назовите ее m-перестановкой) и создайте str1_s и str2_s из str1 и str2, удалив все символы, которые не имеют s единиц, а затем снова выполните алгоритм для str1_s и str2_s. Если строительство терпит неудачу, они не эквивалентны. Если это удастся, окончательная перестановка будет представлять собой комбинацию m-перестановки и s-перестановки (хотя вам, вероятно, даже не нужно ее создавать, вас просто волнует, что она существует).