Теория групп и Python

Как написать код Python, чтобы проверить, является ли операция ∗ на множестве {0,1,..,n−1}, определенной таблицей Кэли, ассоциативной или нет.

Мой попытался код:

def is_associative_cayley_table(table):
    if not is_cayley_table(table):
        return False

    for i in range (0,len(table)):
        for j in range (0,len(table)):
            for k in range (0,len(table)):
                if (table[table[i][j])][k])==(table[i][(table[j][k])]):
                   print("Okay")
                else
                   return False

2 ответа

Решение

Вместо печати "Okay"n^3 раз, вы можете просто захотеть вернуть bool,

def is_associative_cayley_table(table):
    if not is_cayley_table(table):
        return False

    for i in range (0,len(table)):
        for j in range (0,len(table)):
            for k in range (0,len(table)):
                if (table[table[i][j])][k])!=(table[i][(table[j][k])]):
                   return False
    return true

Кроме того, пока нет алгоритма для проверки ассоциативности множества.
Вы должны использовать грубую силу.

Лучшее, что вы можете сделать, это использовать тест ассоциативности Light, который не улучшает время выполнения худшего случая O(n^3), Это просто упрощает задачу в некоторых случаях.

Или с пониманием генератора в python:

      def is_associative(table, n):
    return all(table[x][table[a][y]] == table[table[x][a]][y] \
           for a in np.arange(n) for x in range(n) for y in range(n))

# calay table for ({0,1,...,n-1}, +n), addition modulo n, which is an Abelian group

n = 4
calay_table = np.zeros((n, n), dtype=int)
calay_table[0] = np.arange(n)
for i in range(1, n):
    calay_table[i] = np.roll(calay_table[i-1],-1)

print(calay_table)
# [[0 1 2 3]
# [1 2 3 0]
# [2 3 0 1]
# [3 0 1 2]]

is_associative(calay_table, n)
# True

У нас могли бы быть умные реализации теста ассоциативности Лайта .

Другие вопросы по тегам