Властивості двійкових функцій


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)кодується в матриці як ath- 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]]

Ця функція має властивості замкнутості та комутативності.

Виклик

Це код гольфу. Застосовуються стандартні лазівки . Найменший байт виграє.

Відповіді:


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

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

Дуже читати для коду-гольфу - приємно!
isaacg

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<:*'**

Якщо всі :*елементи ( ) в матриці ( Ae_) менше f<B = розмір (A) ( A,:B), надрукуйте a *( '**).

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

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

Створити всі трійки в домені ( B3m*). Ми друкуємо, Aякщо всі вони відповідають умові ( {...}%:*'A*).

Умова полягає в тому, що для деякого потрійного [i j k]лівого складання цього списку з A ( _{A==}*) і лівого складання його зворотного [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 = true, 0 = false, для кожного з властивостей у заданому порядку.

Повний код:

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)]);

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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.