二項関数のプロパティ


14

抽象代数の多くの重要なトピックには、セットに作用するバイナリ関数が含まれます。このようなトピックの調査では、このような関数の多くのプロパティが定義されています。

課題は、特定のドメイン上の特定のバイナリ関数がこれらのプロパティのうち5つを所有しているかどうかを判断することです。

プロパティ

閉鎖

可能なすべての出力がドメイン内にある場合、バイナリ関数は閉じられます。

連想性

関数が一連の入力に適用される順序が結果に影響を与えない場合、バイナリ関数は結合的です。つまり、常にに等しい$場合、結合的(a $ b) $ cですa $ (b $ c)。値(a $ b)は入力として使用されるため、連想関数を閉じる必要があることに注意してください。

可換性

入力の順序を入れ替えても結果が変わらない場合、バイナリ関数は可換です。言い換えれば、a $ b常に等しい場合b $ a

身元

eドメインa $ e = a = e $ aにすべての要素が存在するような要素がドメインに存在する場合、バイナリ関数にはアイデンティティ要素がありaます。

べき等

バイナリ関数は、2つの同一の入力に適用してその数を出力として与えた場合、べき等です。言い換えれば、ドメイン内のa $ a = aすべての場合a

入力

行列形式の関数が与えられます。関数の領域は数値0 ... n-1になります。ここnで、は行列の辺の長さです。

(a $ b)は、行列でath行のbth要素としてエンコードされます。入力行列である場合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]]

この関数には、可換性と同一性の特性があります。

ドメインn = 3のKコンビネーター:

[[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

5つのブール値を持つリストを返します。これらは、クロージャ、結合性、可換性、恒等性、dem等の順です。

使用例: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

code-golfで非常に読みやすい-いいね!
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あり、dem等性のためである。


入力配列が読み取らq~れ、A(:A)に保管されます。

閉鎖

Ae_A,:Bf<:*'**

:*マトリックス(Ae_)内のすべての()要素f<がB = size(A)(A,:B)より小さい場合は、*'**)を出力します。

連想性

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

ドメイン内のすべてのトリプルを生成します(B3m*)。Aすべてが条件を満たしている場合に印刷します({...}%:*'A*)。

条件は、一部のトリプルでは[i j k]、そのリストをA_{A==}*)で左に折り畳み、その逆[k j i]\W%)をA op{Az==}*)で左に折り畳み、の反転バージョンAが等しい(=)ということです。

可換性

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.

IDは必然的に一意であるため、印刷できるのは1つだけ1です。

べき等

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

注目すべき重要なことは、閉じられていないことは非連想を意味するということです。これらのプロパティの多くは、マトリックスのいくつかのプロパティを使用して簡単に確認できます。

  • 閉包:与えられた範囲内のすべての行列エントリ?
  • 連想性:常にチェックするのが最も難しいもの
  • 可換性:行列は対称ですか?
  • 同一性:k番目の行とk番目の列がまさにインデックスのリストになるようなインデックスkがありますか?
  • 冪等:インデックスのリストに対角線対応していますか?

標準のMatlab表記による入力:[a,b;c,d]または[[a,b];[c,d]]または[a b;c d]など

出力は、指定された順序の各プロパティの1、0、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

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.