Свойства бинарных функций

14

Многие важные темы в абстрактной алгебре включают бинарную функцию, действующую на множестве. Ряд свойств таких функций был определен при исследовании таких тем.

Ваша задача будет состоять в том, чтобы определить, обладает ли данная двоичная функция в данном домене пятью из этих свойств.

свойства

закрытие

Бинарная функция закрывается, если все возможные выходные данные находятся в домене.

Ассоциативность

Бинарная функция является ассоциативной, если порядок ее применения к серии входов не влияет на результат. То есть $ассоциативен, если (a $ b) $ cвсегда равен a $ (b $ c). Обратите внимание, что поскольку значение (a $ b)используется в качестве входных данных, ассоциативные функции должны быть закрыты.

Перестановочность

Бинарная функция является коммутативной, если изменение порядка входов не меняет результат. Другими словами, если a $ bвсегда равны b $ a.

тождественность

Бинарная функция имеет элемент тождественности, если eв домене существует какой-либо элемент, такой что a $ e = a = e $ aдля всех aв домене.

идемпотентность

Бинарная функция является идемпотентной, если ее применение к двум одинаковым входам дает это число в качестве выхода. Другими словами, если a $ a = aдля всех aв домене.

вход

Вам будет дана функция в виде матрицы, а доменом функции будут числа 0 ... n-1, где n- длина стороны матрицы.

Значение (a $ b)кодируется в матрице как элемент th- aй строки b. Если входная матрица есть Q, то a $ b=Q[a][b]

Например, функция возведения в степень ( **в Python) в домене [0, 1, 2]кодируется как:

[[1, 0, 0]
 [1, 1, 1]
 [1, 2, 4]]

Левый и правый домены одинаковы, поэтому матрица всегда будет квадратной.

Вы можете использовать любой удобный матричный формат в качестве входных данных, например, список списков, один список в основном порядке строк или столбцов, объект родной матрицы вашего языка и т. Д. Однако вы не можете принимать функцию непосредственно в качестве ввода.

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

Выход

Вы можете указать, какие из перечисленных выше свойств хранятся в любом выбранном вами формате, включая список логических значений, строку с различным символом для каждого свойства и т. Д. Однако для каждого из 24 возможных подмножеств должен быть отдельный уникальный вывод. свойств. Этот вывод должен быть легко читаемым человеком.

Примеры

Максимальная функция на домене n = 4:

[[0, 1, 2, 3]
 [1, 1, 2, 3]
 [2, 2, 2, 3]
 [3, 3, 3, 3]]

Эта функция обладает свойствами замыкания, ассоциативности, коммутативности, тождественности и идемпотентности.

Функция возведения в степень в области n = 3:

[[1, 0, 0]
 [1, 1, 1]
 [1, 2, 4]]

Эта функция не имеет ни одного из перечисленных выше свойств.

Функция сложения на домене n = 3:

[[0, 1, 2]
 [1, 2, 3]
 [2, 3, 4]]

Эта функция обладает свойствами коммутативности и тождественности.

K комбинатор в области n = 3:

[[0, 0, 0]
 [1, 1, 1]
 [2, 2, 2]]

Эта функция обладает свойствами замыкания, ассоциативности и идемпотентности.

Функция абсолютной разности в области n = 3:

[[0, 1, 2]
 [1, 0, 1]
 [2, 1, 0]]

Эта функция обладает свойствами замыкания, коммутативности и идентичности.

Функция среднего, округленная до четного, в области n = 3:

[[0, 0, 1]
 [0, 1, 2]
 [1, 2, 2]]

Эта функция обладает свойствами замыкания, коммутативности, тождественности и идемпотентности.

Функция равенства в области n = 3:

[[1, 0, 0]
 [0, 1, 0]
 [0, 0, 1]]

Эта функция обладает свойствами замыкания и коммутативности.

Вызов

Это код гольф. Применяются стандартные лазейки . Меньше байтов побеждает.

isaacg
источник

Ответы:

4

Pyth, 51 байт

[qKUQ@VQKCIQ}]Km{@RdCBQKJ!-sQK&JqF.bsm@L@QdYN.p,sQK

Попробуйте онлайн: демонстрация или тестовый набор

Это печатает список из 5 логических значений. Они указывают свойства в порядке:

[Idempotence, Commutativity, Identity, Closure, Associativity]

Вот лучший выходной формат: демонстрация или тестовый набор

Объяснение:

идемпотентность:

qKUQ@VQK
   Q       Q = input matrix
  UQ       [0, 1, ..., len(matrix)-1]
 K         assign to K
    @VQK   vectorized lookup of Q and K //gets the diagonal elements
qK         check, if this is equal to K

коммутативности:

CIQ   check if transpose(Q) is equal to Q

Идентичность:

}]Km{@RdCBQK
   m       K   map each d in K to:
        CBQ       the list [Q, transpose(Q)]
     @Rd          take the d-th element of each ^
    {             remove duplicates
}]K            check if [K] is in ^

Закрытие:

J!-sQK
   sQ    sum(Q) //all elements of Q
  -  K   remove the elements, that also appear in K
 !       ckeck, if the results in an empty list
J        store the result in J

Ассоциативность:

&JqF.bsm@L@QdYN.p,sQK
               .p,sQK  all permutations of [sum(Q), K] //all 2 ;-)
    .b                 map each pair (N,Y) of ^ to:
       m      N           map each d of N to:
          @Qd                the row Q[d]
        @L   Y               map each element of Y to the corr. element in ^
      s                   unfold this 2-d list
  qF                   check if they result in identically lists
&J                     and J
Jakube
источник
5

Haskell, 178 171 байт

import Data.List
f x=[c,c&&and[(m%n)%o==m%(n%o)|m<-b,n<-b,o<-b],x==t,all(elem b)[x,t],b==[i%i|i<-b]]where c=all(l>)(id=<<x);b=[0..l-1];a%b=x!!a!!b;l=length x;t=transpose x

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

Пример использования: f [[1, 0, 0],[0, 1, 0],[0, 0, 1]]-> [True,False,True,False,False].

Как это устроено:

f x=[
  c,                         -- closure (see below)
  c&&and[(m%n)%o==m%(n%o)|   -- assoc: make sure it's closed, then check the
          m<-b,n<-b,o<-b],   --        assoc rule for all possible combinations
  x==t,                      -- comm: x must equal it's transposition
  all(elem b)[x,t],          -- identity: b must be a row and a column
  b==[i%i|i<-b]              -- idemp: element at (i,i) must equal i
  ]
  where                      -- some helper functions
  c=all(l>)(id=<<x);         -- closure: all elements of the input must be < l 
  b=[0..l-1];                -- a list with the numbers from 0 to l-1
  a%b=x!!a!!b;               -- % is an access function for index (a,b)
  l=length x;                -- l is the number of rows of the input matrix
  t=transpose x

Правка @xnor нашла несколько байтов для сохранения. Благодарность!

Ними
источник
Как насчет c=all(l>)?
xnor
Также [i%i|i<-b]==b.
xnor
Очень читабельно для код-гольфа - приятно!
Исаак
4

CJam, 95 байт

q~:Ae_A,:Bf<:*'**B3m*{_{A==}*\W%{Az==}*=}%:*'A*A_z='C*B{aB*ee_Wf%+{A==}f*B,2*='1*}%Ae_B)%B,='I*

Печатает подпоследовательность *AC1I. *является символом для замыкания , Aдля ассоциативного , Cдля коммутативного , 1для тождественного и Iдля идемпотентного .


Входной массив читается q~и сохраняется в A ( :A).

закрытие

Ae_A,:Bf<:*'**

Если все ( :*) элементы в matrix ( Ae_) меньше, f<чем B = size (A) ( A,:B), выведите a *( '**).

Ассоциативность

B3m*{_{A==}*\W%{Az==}*=}%:*'A*

Создайте все тройки в домене ( B3m*). Мы печатаем, Aесли все они удовлетворяют условию ( {...}%:*'A*).

Условие состоит в том, что для некоторой тройки [i j k], сворачивание влево этого списка с помощью A ( _{A==}*) и сворачивание влево его reverse [k j i]( \W%) с помощью A op ( {Az==}*), перевернутая версия A, равны ( =).

Перестановочность

Должна быть равна его транспонирование: A_z=. Если это так, мы печатаем C( 'C=).

тождественность

B{                         }%   For each element X in the domain (0..N-1):
  aB*                           Make N copies.
     ee                         [[0 X] [1 X] ...]
       _Wf%+                    [[0 X] [1 X] ... [X 0] [X 1] ...]
            {A==}f*             [A(0, X) A(1, X) ... A(X, 0) A(X, 1)]
                   B,2*=        This list should equal the domain list repeated twice.
                        '1*     If so, X is an identity: print a 1.

Идентификационные данные обязательно уникальны, поэтому мы можем напечатать только один 1.

идемпотент

Ae_B)%B,='I*

Проверьте, равна ли диагональ B,. Если это так, распечатайте I.

Линн
источник
3

Матлаб, 226

a=input('');n=size(a,1);v=1:n;c=all(0<=a(:)&a(:)<n);A=c;for i=v;for j=v(1:n*c);for k=v(1:n*c);A=A&a(a(i,j)+1,k)==a(i,a(j,k)+1);end;end;b(i)=all(a(i,:)==v-1 & a(:,i)'==v-1);end;disp([c,A,~norm(a-a'),any(b),all(diag(a)'==v-1)])

Важно отметить, что незакрытый подразумевает неассоциативность. Многие из этих свойств можно легко проверить с помощью некоторых свойств матрицы:

  • Закрытие : Все все записи матрицы в заданном диапазоне?
  • Ассоциативность : как всегда самый сложный для проверки
  • Коммутативность : симметрична ли матрица?
  • Идентичность : существует ли индекс k такой, что k-я строка и k-й столбец - это точно список индексов?
  • Идемпотентность : соответствует ли диагональ списку индексов?

Ввод через стандартную запись Matlab: [a,b;c,d]или [[a,b];[c,d]]или и [a b;c d]т. Д.

Выходными данными является вектор из нулей, 1 = истина, 0 = ложь, для каждого из свойств в данном порядке.

Полный код:

a=input('');
n=size(a,1);
v=1:n;
c=all(0<=a(:)&a(:)<n);               %check for closedness
A=c;
for i=v;
   for j=v(1:n*c); 
      for k=v(1:n*c);
          A=A&a(a(i,j)+1,k)==a(i,a(j,k)+1);   %check for associativity (only if closed)
      end;
   end;
   b(i)=all(a(i,:)==v-1 & a(:,i)'==v-1);      %check for commutativity
end
%closure, assoc, commut, identity, idempotence
disp([c,A,~norm(a-a'),any(b),all(diag(a)'==v-1)]);
flawr
источник
3

JavaScript (ES6) 165

Анонимная функция, возвращающая массив с пятью значениями 0/1 в порядке закрытия, ассоциативности, коммутативности, идентичности и идемпотентности.

q=>q.map((p,i)=>(p.map((v,j)=>(w=q[j][i],v-w?h=C=0:v-j?h=0:0,q[v]?A&=!q[v].some((v,k)=>v-q[i][q[j][k]]):A=K=0),h=1,p[i]-i?P=0:0),h?I=1:0),A=P=K=C=1,I=0)&&[K,A,C,I,P]

Меньше гольфа

f=q=>(
  // A associativity, P idempotence, K closure, C commuativity
  // assumed true until proved false
  A=P=K=C=1, 
  I=0, // Identity assumed false until an identity element is found
  q.map((p,i)=> (
      h=1, // assume current i is identity until proved false
      p[i]-i? P=0 :0, // not idempotent if q[i][i]!=i for any i
      p.map((v,j)=> (
          w=q[j][i], // and v is q[i][j]
          v-w // check if q[j][i] != q[i][j]
          ? h=C=0 // if so, not commutative and i is not identity element too
          : v-j // else, check again for identity
            ? h=0 // i is not identity element if v!=j or w!=j
            : 0,
          q[v] // check if q[i][j] in domain
            ? A&=!q[v].some((v,k)=>v-q[i][q[j][k]]) // loop for associativity check
            : A=K=0 // q[i][j] out of domain, not close and not associative
        )
      ),
      h ? I=1 : 0 // if i is the identity element the identity = true
    )
  ),
  [K,A,C,I,P] // return all as an array
)

Тестовое задание

f=q=>
  q.map((p,i)=>(
    p.map((v,j)=>(
      w=q[j][i],
      v-w?h=C=0:v-j?h=0:0,
      q[v]?A&=!q[v].some((v,k)=>v-q[i][q[j][k]]):A=K=0
    ),h=1,p[i]-i?P=0:0),
    h?I=1:0
  ),A=P=K=C=1,I=0)
  &&[K,A,C,I,P]

// test

console.log=x=>O.textContent+=x+'\n';

T=[
 [
  [[0, 1, 2, 3],
   [1, 1, 2, 3],
   [2, 2, 2, 3],
   [3, 3, 3, 3]]
 ,[1,1,1,1,1]] // has the properties of closure, associativity, commutativity, identity and idempotence.
,[ // exponentiation function on domain n=3:
  [[1, 0, 0],
   [1, 1, 1],
   [1, 2, 4]]
 ,[0,0,0,0,0]] // has none of the above properties.
,[ // addition function on domain n=3:
  [[0, 1, 2],
   [1, 2, 3],
   [2, 3, 4]] 
 ,[0,0,1,1,0]] // has the properties of commutativity and identity.
,[ // K combinator on domain n=3:
  [[0, 0, 0],
   [1, 1, 1],
   [2, 2, 2]]
 ,[1,1,0,0,1]] // has the properties of closure, associativity and idempotence.
,[ // absolute difference function on domain n=3:
  [[0, 1, 2],
   [1, 0, 1],
   [2, 1, 0]]
 ,[1,0,1,1,0]] // has the properties of closure, commutativity and identity.
,[ // average function, rounding towards even, on domain n=3:
  [[0, 0, 1],
   [0, 1, 2],
   [1, 2, 2]]
 ,[1,0,1,1,1]] // has the properties of closure, commutativity, identity and idempotence.
,[ // equality function on domain n=3:
  [[1, 0, 0],
   [0, 1, 0],
   [0, 0, 1]]
 ,[1,0,1,0,0]] // has the properties of closure, commutativity,
]  

T.forEach(t=>{
  F=t[0],X=t[1]+'',R=f(F)+'',console.log(F.join`\n`+'\n'+R+' (expected '+X+') '+(X==R?'OK\n':'Fail\n'))
  })
<pre id=O></pre>

edc65
источник