İkili Fonksiyonların Özellikleri


14

Soyut cebirdeki birçok önemli konu bir kümeye etki eden ikili bir fonksiyonu içerir. Bu tür konuların araştırılmasında bu işlevlerin bir dizi özelliği tanımlanmıştır.

Sorun, belirli bir alandaki belirli bir ikili işlevin bu özelliklerin beşine sahip olup olmadığını belirlemek olacaktır.

Özellikleri

kapatma

Etki alanında her olası çıkış varsa ikili bir işlev kapatılır.

Birleşim

Bir ikili girdiye işlevin uygulanma sırası sonucu etkilemezse, ikili işlev ilişkilendirilebilir. Yani, her zaman eşitse $çağrışımsaldır . Değer giriş olarak kullanıldığından ilişkilendirilebilir işlevlerin kapatılması gerektiğini unutmayın.(a $ b) $ ca $ (b $ c)(a $ b)

Yerdeğiştirme

Girişlerin sırasını değiştirmek sonucu değiştirmezse, ikili işlev değişebilir. Diğer bir deyişle, a $ bher zaman eşitse b $ a.

Kimlik

eEtki alanında, etki alanındaki a $ e = a = e $ aherkes için böyle bir öğe varsa, ikili işlevin bir kimlik öğesi vardır a.

Idempotence

İkili işlev, iki özdeş girişe uygulanırsa, bu sayıyı çıktı olarak verirse idempotenttir. Diğer bir deyişle, alan adındaki a $ a = aherkes için a.

Giriş

Bir matris formunda bir işlev verilecektir ve fonksiyon alan sayılar olur 0 ... n-1, nmatris yan uzunluğudur.

Değer (a $ b), matriste, ath. Satırın bth öğesi olarak kodlanır . Giriş matrisi ise Q, a $ b=Q[a][b]

Örneğin **, etki alanındaki üs alma işlevi ( Python'da) [0, 1, 2]şu şekilde kodlanır:

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

Sol ve sağ etki alanları aynıdır, bu nedenle matris her zaman kare olacaktır.

Listeler listesi, satır veya sütun ana düzeninde tek bir liste, dilinizin yerel matris nesnesi vb. Gibi giriş olarak herhangi bir uygun matris biçimini kullanabilirsiniz. Ancak, bir işlevi doğrudan giriş olarak alamazsınız.

Basit olması için, matris girişlerinin tümü tamsayı olacaktır. Dilinizin yerel tamsayı türüne uyduğunu varsayabilirsiniz.

Çıktı

Booleans listesi, her özellik için farklı bir karaktere sahip bir dize vb. Dahil olmak üzere yukarıdaki özelliklerden hangisini seçtiğinizi belirtebilirsiniz. Ancak, olası 24 alt kümenin her biri için ayrı, benzersiz bir çıktı olmalıdır. özellikleri. Bu çıktı kolaylıkla insan tarafından okunabilir olmalıdır.

Örnekler

Etki alanı n = 4'teki maksimum işlev:

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

Bu fonksiyon kapatma, ilişkilendirilebilirlik, değişebilirlik, kimlik ve idempotence özelliklerine sahiptir.

Etki alanı n = 3'teki üs alma işlevi:

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

Bu işlev yukarıdaki özelliklerden hiçbirine sahip değildir.

Etki alanı n = 3'teki toplama işlevi:

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

Bu işlev değişebilirlik ve kimlik özelliklerine sahiptir.

N = 3 alan adındaki K birleştiricisi:

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

Bu fonksiyon kapatma, ilişkilendirilebilirlik ve idempotence özelliklerine sahiptir.

Alan n = 3'teki mutlak fark işlevi:

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

Bu işlev kapatma, değişme ve kimlik özelliklerine sahiptir.

N = 3 alan adında çift yönlü ortalama işlev:

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

Bu fonksiyon kapatma, değişme, kimlik ve idempotence özelliklerine sahiptir.

N = 3 alan adındaki eşitlik işlevi:

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

Bu fonksiyon, kapatma ve değişme özelliklerine sahiptir.

Meydan okuma

Bu kod golf. Standart boşluklar geçerlidir. En az bayt kazanır.

Yanıtlar:


4

Pyth, 51 bayt

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

Çevrimiçi deneyin: Gösteri veya Test Paketi

Bu, 5 boole değerinin bir listesini yazdırır. Özellikleri sırayla belirtirler:

[Idempotence, Commutativity, Identity, Closure, Associativity]

İşte daha iyi bir çıktı biçimi: Demonstration veya Test Suite

Açıklama:

Idempotence:

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

Yerdeğiştirme:

CIQ   check if transpose(Q) is equal to Q

Kimlik:

}]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 ^

Kapanış:

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

Birleşim:

&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, 178171 bayt

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

Sırayla kapanma, ilişkilendirilebilirlik, değişebilirlik, kimlik ve idempotence olan beş boole içeren bir liste döndürür.

Kullanım örneği: f [[1, 0, 0],[0, 1, 0],[0, 0, 1]]-> [True,False,True,False,False].

Nasıl çalışır:

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

Edit @xnor kaydedilecek bazı baytlar buldu. Teşekkürler!


Nasıl c=all(l>)?
xnor

Ayrıca [i%i|i<-b]==b,.
xnor

Kod golf için çok okunabilir - güzel!
isaacg

4

CJam, 95 bayt

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*

Öğesinin bir alt dizisini yazdırır *AC1I. *için sembolüdür kapatılması , Aiçindir birleştirici , Ciçindir değişmeli , 1içindir kimlik ve Iiçindir İdempotent .


Giriş dizisi q~A ( :A) içinde okunur ve saklanır .

kapatma

Ae_A,:Bf<:*'**

Matristeki ( :*) tüm ( ) öğeler B = boyut (A) ( ) ' dan Ae_küçükse , a ( ) yazdırın .f<A,:B*'**

Birleşim

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

Etki alanındaki ( B3m*) tüm üçleri oluşturun . AHepsi bir koşulu ( {...}%:*'A*) karşılarsa yazdırırız .

Durum, bazı üçlü yani [i j k], sol-katlama bu listeyi A ( _{A==}*) ve sol-katlanması, ters [k j i]( \W%birlikte) bir op ( {Az==}*), bir ters çevrilmiş versiyonunu A, eşittir ( =).

Yerdeğiştirme

Bir onun devrik eşit olmak zorundadır: A_z=. Öyleyse, yazdırırız C( 'C=).

Kimlik

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.

Kimlik mutlaka benzersizdir, bu yüzden sadece bir tane yazdırabiliriz 1.

Etkisiz

Ae_B)%B,='I*

Diyagonalin eşit olup olmadığını kontrol edin B,. Öyleyse, bir 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)])

Dikkat edilmesi gereken önemli bir nokta, kapalı olmayanların ilişkisel olmama anlamına gelmesidir. Bu özelliklerin çoğu, matrisin bazı özellikleri kullanılarak kolayca kontrol edilebilir:

  • Kapanış : Verilen aralıktaki tüm matris girdileri?
  • İlişkilendirme : Her zaman kontrol edilmesi en zor olanı
  • Değişebilirlik : Matris simetrik mi?
  • Kimlik : k-dizisi ve k-sütunu tam olarak dizinlerin listesi olacak şekilde bir dizin k var mı?
  • İdempotence : Diyagonal indeks listesine karşılık geliyor mu?

Standart Matlab gösterimi ile giriş: [a,b;c,d]veya [[a,b];[c,d]]veya [a b;c d]vb

Çıktı, verilen sırayla özelliklerin her biri için sıfır, 1 = doğru, 0 = yanlış olanlardan oluşan bir vektördür.

Tam kod:

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

Kapatma, Birliktelik, Değişebilirlik, Kimlik ve Idempotence olmak üzere beş 0/1 değerine sahip bir dizi döndüren anonim bir işlev.

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]

Daha az golf

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
)

Ölçek

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.