summaryrefslogtreecommitdiff
path: root/lab4/lab4.py
blob: 0f281576810fec9238c383f05a173ddc05111122 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import numpy as np
import itertools as it


def make_subsemigroup():
    print("Введите элементы множества:")
    elements = input().split()
    n = len(elements)

    print("Введите элементы подмножества:")
    subelements = input().split()

    print("Введите значения таблицы Кэли:")
    cayley = []
    for _ in range(n):
        cayley.append(input().split())
    cayley = np.array(cayley)

    x_i = subelements[:]
    while True:
        x_l = []
        for x in x_i:
            for y in subelements:
                x_l.append(cayley[elements.index(x)][elements.index(y)])
        tmp = list(set(x_i) | set(x_l))
        tmp.sort()

        if tmp == x_i:
            break

        x_i = tmp[:]

    print("Подполугруппа:")
    print(x_i)


def find_correlation(matrices):
    result = {}
    correlations = {}
    for key, value in matrices.items():
        if not any(np.array_equal(value, i) for i in result.values()):
            result[key] = value
        else:
            for k, v in result.items():
                if np.array_equal(v, value):
                    correlations[key] = k

    print("Копредставления:")
    for key, value in result.items():
        print(f"{''.join(key)}:")
        print(value)

    print("Полученные соотношения:")
    for key, value in correlations.items():
        print(''.join(key), "->", ''.join(value))


def make_semigroup_binrel():
    print("Введите элементы множества:")
    elements = input().split()
    n = len(elements)

    print("Введите количество бинарных отношений:")
    q = int(input())

    matrices = {}
    for i in range(q):
        print("Введите значения матрицы:")
        matrix = []
        for _ in range(n):
            matrix.append(list(map(int, input().split())))
        matrices[str(i + 1)] = np.array(matrix)

    while True:
        new_matrices = {}
        for key_i, value_i in matrices.items():
            for key_j, value_j in matrices.items():
                new_matrices[key_i + key_j] = value_i * value_j

        already_exists = []
        for mat in new_matrices.values():
            flags = []
            for mat_old in matrices.values():
                flags.append(np.array_equal(mat, mat_old))
            already_exists.append(any(flags))
            if not any(flags):
                break

        if all(already_exists):
            break

        matrices.update(new_matrices)

    find_correlation(matrices)
    

def make_semigroup():
    print("Введите элементы полугруппы:")
    elements = input().split()
    n = len(elements)

    print("Введите элементы множества преобразований:")
    generators_list = input().split()
    gn = len(generators_list)

    translations = []
    for i in range(gn):
        print(f"Введите значения преобразования '{generators_list[i]}' "
               "элементов полугруппы:")
        print(*elements)
        translations.append((generators_list[i], input().split()))

    copresentation = translations.copy()
    correlations = {}
    while True:
        is_inserted = False
        for key_i, value_i in translations:
            for key_j, value_j in copresentation:
                new_word = key_i + key_j

                new_value = []
                for elem in value_i:
                    if elem == "*":
                        sec_sem = "*"
                    else:
                        sec_sem = value_j[int(elem) - 1]
                    new_value.append(sec_sem)

                find_corr = False
                for k, v in copresentation:
                    if np.array_equal(new_value, v):
                        correlations[new_word] = k
                        find_corr = True
                if not find_corr:
                    copresentation.append((new_word, new_value))
                    is_inserted = True
        if not is_inserted:
            break

    print("Копредставление: ")
    for key, value in copresentation:
        print(key + ":", value)

    print("Полученные соотношения: ")
    for key, value in correlations.items():
        print(key, "->", value)


def main():
    flag = input("Построить подполугруппу по таблице Кэли? (да/НЕТ) ")
    if flag.lower() == "да":
        make_subsemigroup()

    flag = input("Построить полугруппу бинарных отношений по порождающему "
                 "множеству? (да/НЕТ) ")
    if flag.lower() == "да":
        make_semigroup_binrel()

    flag = input("Построить полугруппу по порождающему множеству и "
                 "определяющим соотношениям? (да/НЕТ) ")
    if flag.lower() == "да":
        make_semigroup()


if __name__ == "__main__":
    main()