이진 함수의 속성


14

추상 대수학에서 많은 중요한 주제는 집합에 작용하는 이진 함수를 포함합니다. 이러한 주제의 조사에서 그러한 기능의 많은 속성이 정의되었습니다.

주어진 도메인에서 주어진 이진 함수가 이러한 속성 중 다섯 가지를 소유하는지 확인해야합니다.

속성

폐쇄

가능한 모든 출력이 도메인에 있으면 이진 함수가 닫힙니다.

연관성

이진 함수는 함수가 일련의 입력에 적용되는 순서가 결과에 영향을 미치지 않으면 연관됩니다. 즉, 항상 같으면 $연관됩니다 . 값 이 입력으로 사용되므로 연관 함수를 닫아야합니다.(a $ b) $ ca $ (b $ c)(a $ b)

전산

입력 순서를 바꾸어도 결과가 바뀌지 않으면 이진 함수는 교환 형입니다. 즉, a $ b항상 같으면 b $ a입니다.

정체

e도메인 a $ e = a = e $ a에 모든 요소가 포함되도록 일부 요소 가 도메인에있는 경우 이진 함수에는 identity 요소가 있습니다 a.

dem 등식

이진 함수는 두 개의 동일한 입력에 적용하면 해당 숫자가 출력으로 제공되는 경우 dem 등수입니다. 다시 말해, 도메인 a $ a = a에 모두 해당 a되는 경우 입니다 .

입력

행렬의 형태로 함수가 주어지고 함수의 도메인은 숫자가 될 것입니다 0 ... n-1. 여기서 n행렬의 측면 길이입니다.

(a $ b)은 행렬에서 3 a번째 행의 3 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]]

이 함수에는 폐쇄, 연관성, 정류 성, 동일성 및 dem 등성이 있습니다.

도메인 n = 3의 지수 함수 :

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

이 함수에는 위의 속성이 없습니다.

도메인 n = 3의 추가 기능 :

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

이 함수는 commutativity 및 identity 속성을 갖습니다.

도메인 n = 3의 K 조합 자 :

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

이 함수에는 폐쇄, 연관성 및 dem 등성이 있습니다.

도메인 n = 3의 절대 차 함수 :

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

이 함수에는 폐쇄, 정류 및 동일성의 속성이 있습니다.

도메인 n = 3에서 짝수로 반올림 한 평균 함수 :

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

이 함수에는 클로저, commutativity, identity 및 idempotence의 속성이 있습니다.

도메인 n = 3의 등식 함수 :

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

이 함수는 클로저 및 commutativity 특성을 갖습니다.

도전

이것은 코드 골프입니다. 표준 허점이 적용됩니다. 최소 바이트가 이깁니다.

답변:


4

Pyth, 51 바이트

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

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

이렇게하면 5 개의 부울 값 목록이 인쇄됩니다. 순서대로 속성을 나타냅니다.

[Idempotence, Commutativity, Identity, Closure, Associativity]

다음은 더 나은 출력 형식입니다. 데모 또는 테스트 스위트

설명:

dem 등식 :

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

하스켈, 178171 바이트

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

5 개의 부울이있는 목록을 반환합니다.이 목록은 닫힘, 연관성, commutativity, identity 및 idempotence입니다.

사용 예 : 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 = size (A) ( A,:B) 보다 경우 a *( '**)를 인쇄하십시오 .

연관성

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

도메인에서 모든 트리플을 생성합니다 (B3m* ). A모두 조건을 만족하면 인쇄 합니다 ({...}%:*'A* ).

조건은 들어 일부 트리플 즉 인 [i j k], 좌측의 폴딩이 목록 ( _{A==}*) 좌 접는 그 역방향 [k j i]( \W%)와 연산 ( {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.

dem 등원

Ae_B)%B,='I*

대각선이 같은지 확인하십시오 B,. 그렇다면을 인쇄하십시오 I.


3

MATLAB, 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)])

주목해야 할 중요한 것은 비 폐쇄는 비 연관을 의미한다는 것입니다. 행렬의 일부 속성을 사용하여 이러한 속성 중 다수를 쉽게 확인할 수 있습니다.

  • 폐쇄 : 주어진 범위의 모든 매트릭스 항목?
  • 연관성 : 항상 확인하기 가장 어려운 것
  • 전이 : 매트릭스는 대칭인가?
  • ID : k 번째 행과 k 번째 열이 정확히 인덱스 목록과 같은 인덱스 k가 있습니까?
  • Idempotence : 대각선이 지수 목록에 해당합니까?

: standar을 matlab에 표기를 통해 입력 [a,b;c,d]하거나 [[a,b];[c,d]]또는 [a b;c d]

출력은 주어진 순서대로 각 속성에 대해 1의 제로, 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

자바 스크립트 (ES6) 165

Closure, Associativity, Commutativity, Identity 및 Idempotence 순서로 5 개의 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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.