คุณสมบัติของฟังก์ชั่นไบนารี


14

หัวข้อที่สำคัญมากมายในพีชคณิตนามธรรมเกี่ยวข้องกับฟังก์ชั่นไบนารีที่ทำหน้าที่ในชุด จำนวนคุณสมบัติของฟังก์ชั่นดังกล่าวได้ถูกกำหนดไว้ในการตรวจสอบหัวข้อดังกล่าว

ความท้าทายของคุณคือการพิจารณาว่าฟังก์ชั่นไบนารีที่กำหนดในโดเมนที่กำหนดมีคุณสมบัติห้าประการเหล่านี้หรือไม่

คุณสมบัติ

การปิด

ฟังก์ชั่นไบนารีปิดถ้าทุกผลลัพธ์ที่เป็นไปได้อยู่ในโดเมน

การเชื่อมโยงกัน

ฟังก์ชั่นไบนารีคือการเชื่อมโยงถ้าลำดับที่ฟังก์ชั่นที่ใช้กับชุดของอินพุตไม่ส่งผลกระทบต่อผล นั่นคือ$เป็นแบบเชื่อมโยงถ้าเสมอเท่ากับ(a $ b) $ c a $ (b $ c)โปรดทราบว่าเนื่องจากใช้ค่า(a $ b)เป็นอินพุตฟังก์ชันการเชื่อมโยงต้องถูกปิด

commutativity

ฟังก์ชั่นไบนารีคือสับเปลี่ยนหากการเปลี่ยนลำดับของอินพุตไม่เปลี่ยนผลลัพธ์ ในคำอื่น ๆ ถ้าเสมอเท่ากับa $ bb $ a

เอกลักษณ์

ฟังก์ชั่นไบนารีมีองค์ประกอบตัวตนหากมีองค์ประกอบบางอย่างeในโดเมนเช่นนั้นa $ e = a = e $ aสำหรับทุกคนaในโดเมน

idempotence

ฟังก์ชั่นไบนารีคือ idempotent ถ้าใช้กับสองอินพุตเหมือนกันให้หมายเลขนั้นเป็นเอาท์พุท ในคำอื่น ๆ ถ้าa $ a = aสำหรับทั้งหมดaในโดเมน

อินพุต

คุณจะได้รับฟังก์ชั่นในรูปแบบของเมทริกซ์และโดเมนของฟังก์ชันจะเป็นตัวเลข0 ... n-1ที่nความยาวด้านของเมทริกซ์อยู่

ค่า(a $ b)จะถูกเข้ารหัสในเมทริกซ์เป็นองค์ประกอบที่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]]

ฟังก์ชั่นนี้มีคุณสมบัติของการปิด, การเชื่อมโยง, การสับเปลี่ยน, การระบุตัวตนและ idempotence

ฟังก์ชันการยกกำลังบนโดเมน n = 3:

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

ฟังก์ชั่นนี้ไม่มีคุณสมบัติด้านบน

ฟังก์ชั่นการเพิ่มบนโดเมน n = 3:

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

ฟังก์ชั่นนี้มีคุณสมบัติของการเปลี่ยนและตัวตน

K combinator บนโดเมน n = 3:

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

ฟังก์ชั่นนี้มีคุณสมบัติของการปิดการเชื่อมโยงและ idempotence

ฟังก์ชันความแตกต่างสัมบูรณ์บนโดเมน n = 3:

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

ฟังก์ชั่นนี้มีคุณสมบัติของการปิดการสับเปลี่ยนและตัวตน

ฟังก์ชั่นเฉลี่ย, การปัดเศษไปยังคู่บนโดเมน n = 3:

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

ฟังก์ชั่นนี้มีคุณสมบัติของการปิด, สับเปลี่ยน, เอกลักษณ์และ idempotence

ฟังก์ชันความเสมอภาคบนโดเมน 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]

นี่คือรูปแบบผลลัพธ์ที่ดีกว่า: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

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

commutativity:

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

associativity:

&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*

พิมพ์ subsequence *AC1Iของ *เป็นสัญลักษณ์ของการปิด , Aสำหรับการเชื่อมโยง , Cสำหรับการสลับ , 1เป็นตัวตนและIเป็นidempotent


อาร์เรย์อินพุตถูกอ่าน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จะเท่ากัน (= )

commutativity

ต้องเท่ากับ transpose ที่: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ได้

idempotent

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

สิ่งสำคัญที่ควรสังเกตคือการไม่ปิดหมายถึงการไม่เชื่อมโยง คุณสมบัติเหล่านั้นจำนวนมากสามารถตรวจสอบได้ง่ายโดยใช้คุณสมบัติบางอย่างของเมทริกซ์:

  • ปิด : รายการเมทริกซ์ทั้งหมดในช่วงที่กำหนดหรือไม่
  • การเชื่อมโยง : เช่นเดียวกับการตรวจสอบที่ยากที่สุดเสมอ
  • Commutativity : เมทริกซ์สมมาตรหรือไม่
  • เอกลักษณ์ : มีดัชนี k เช่นนั้นที่แถว k-th และคอลัมน์ k-th นั้นเป็นรายการของดัชนีหรือไม่?
  • Idempotence : เส้นทแยงมุมสอดคล้องกับรายการดัชนีหรือไม่?

การป้อนข้อมูลผ่านทางสัญกรณ์มาตรฐาน Matlab: [a,b;c,d]หรือ[[a,b];[c,d]]หรือ[a b;c d]ฯลฯ

เอาท์พุทเป็นเวกเตอร์ของศูนย์ a, 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]

น้อย golfed

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.