In các hoán vị ngay cả của nhóm đối xứng Sn trong ký hiệu tuần hoàn


9

NHIỆM VỤ

ĐỊNH NGHĨA

Hãy xem xét các điểm {1,2,3,4,5} và tất cả các hoán vị của chúng. Chúng ta có thể tìm thấy tổng số hoán vị có thể có của 5 điểm này bằng một mẹo đơn giản: Hình ảnh lấp đầy 5 vị trí với các điểm này, vị trí đầu tiên sẽ có 5 số có thể, 4 số thứ hai (như một đã được sử dụng để điền vào vị trí đầu tiên) 3 thứ ba và như vậy. Do đó, tổng số Hoán vị là 5 * 4 * 3 * 2 * 1; đây sẽ là 5! hoán vị hoặc 120 hoán vị. Chúng ta có thể coi đây là nhóm đối xứng S5, và sau đó Nhóm đối xứng Sn sẽ có n! or (n*n-1*n-2...*1)hoán vị.

Hoán vị "chẵn" là một nơi có số chu kỳ độ dài chẵn. Nó là đơn giản nhất để hiểu khi viết bằng ký hiệu theo chu kỳ, ví dụ (1 2 3)(4 5)permutes 1->2->3->14->5->4và có một chu kỳ 3 chiều dài (1 2 3)và một chu kỳ 2 chiều dài (4 5). Khi phân loại hoán vị là lẻ hoặc chẵn, chúng ta bỏ qua các chu kỳ độ dài lẻ và nói rằng hoán vị này [ (1 2 3)(4 5)] là số lẻ vì nó có số lẻ {1} của các chu kỳ độ dài chẵn. Ngay cả ví dụ:

  1. (1)(2 3)(4 5)= hai 2 chu kỳ dài | NGAY CẢ |
  2. (1 2 3 4 5)= không có chu kỳ chiều dài chẵn | NGAY CẢ | * lưu ý rằng nếu không có chu kỳ độ dài chẵn thì sự hoán vị là chẵn.

Ví dụ kỳ lạ:

  1. (1 2)(3 4 5)= một chu kỳ 2 chiều dài | ODD |
  2. (1)(2 3 4 5)= một chu kỳ 4 chiều dài | ODD |

Là chính xác một nửa số hoán vị trong bất kỳ Nhóm đối xứng nào, thậm chí chúng ta có thể gọi nhóm chẵn là Nhóm xen kẽ N, vì vậy, S5 = 120 A5 = 60 hoán vị.

THÔNG BÁO

Hoán vị, ít nhất, nên được viết bằng ký hiệu tuần hoàn trong đó mỗi chu kỳ nằm trong ngoặc đơn khác nhau và mỗi chu kỳ đi theo thứ tự tăng dần. Ví dụ (1 2 3 4 5)không (3 4 5 1 2). Và đối với các chu kỳ có một số duy nhất, chẳng hạn như: (1)(2 3 4)(5)các điểm đơn / cố định có thể được loại trừ ý nghĩa (1)(2 3 4)(5) = (2 3 4). Nhưng danh tính {điểm mà tất cả các điểm được cố định (1)(2)(3)(4)(5)} nên được viết như ()chỉ để thể hiện nó.

CÁC THÁCH THỨC

Tôi muốn bạn, trong càng ít mã càng tốt, lấy bất kỳ số nguyên dương nào làm đầu vào {1,2,3,4 ...} và hiển thị tất cả các hoán vị của Nhóm luân phiên An trong đó n là đầu vào / tất cả các số chẵn hoán vị của Sn. Ví dụ:

Input = 3
()
(1 2 3)
(1 3 2)

Input = 4
()
(1 2)(3 4)
(1 3)(2 4)
(1 4)(2 3)
(1 2 3)
(1 3 2)
(1 2 4)
(1 4 2)
(1 3 4)
(1 4 3)
(2 3 4)
(2 4 3)

Và như trong các ví dụ tôi muốn cho tất cả các chu kỳ có độ dài được tách ra và đối với danh tính: đầu ra không có gì, (){không chỉ dấu ngoặc mà với bất cứ điều gì bạn đang sử dụng để hiển thị các hoán vị khác nhau} hoặc idđược chấp nhận.

ĐỌC THÊM

Bạn có thể tìm thêm thông tin ở đây:

CHÚC MAY MẮN

Và vì đây là codegolf, bất cứ ai có thể in hoán vị của Nhóm xen kẽ trong các byte ngắn nhất sẽ thắng.


2
Chào mừng bạn đến với Câu đố lập trình và Code Golf! Thông thường, chúng tôi cho phép đầu ra linh hoạt, để các ngôn ngữ có vấn đề với việc xuất ra đúng định dạng không có nhược điểm không công bằng. Được phép xuất ra ví dụ [[1, 2], [3, 4]]thay vì (1 2)(3 4)?
Ad Nam

@Ad Nam Có, tôi nên làm rõ. Miễn là các chu kỳ khác nhau được hiển thị riêng biệt, sẽ không có vấn đề gì với cách bạn thể hiện điều này.
Harry

Hoán vị "chẵn" là một trong đó có một số chẵn các hoán vị chẵn. " Điều này trông giống như một định nghĩa theo chu kỳ. Có thể giới thiệu ký hiệu chu kỳ trước và sau đó viết lại câu đó thành "... số chẵn của chu kỳ dài chẵn"?
Martin Ender

Ngoài ra, làm thế nào để tôi đặt chu kỳ (2 3 1 4)theo thứ tự tăng dần? Bạn có nghĩa là chúng ta chỉ nên đặt yếu tố nhỏ nhất ở phía trước?
Martin Ender

@MartinEnder Có phần tử nhỏ nhất nên đi đầu tiên miễn là nó không gây rối với trình tự, như vậy là (2 3 1 4)không 2->3->1->4->2nó có thể được viết (1 4 2 3)với phần tử nhỏ nhất của nó đầu tiên
Harry

Câu trả lời:


5

Bình thường, 26 byte

t#Mf%+QlT2mcdf<>dTS<dTd.pS

          m            .pSQ   Map over permutations d of [1, …, Q]:
             f        d         Find all indices T in [1, …, Q] such that
               >dT                the last Q-T elements of d
              <   S<dT            is less than the sorted first T elements of d
           cd                   Chop d at those indices
   f                          Filter on results T such that
      Q                         the input number Q
     + lT                       plus the length of T
    %    2                      modulo 2
                                is truthy (1)
t#M                           In each result, remove 0- and 1-cycles.

Dùng thử trực tuyến

Giải pháp này dựa trên một sự chọn lọc gọn gàng giữa các hoán vị trong ký hiệu một dòng và hoán vị trong ký hiệu chu kỳ. Tất nhiên, có một sự lựa chọn rõ ràng trong đó hai ký hiệu đại diện cho cùng một hoán vị:

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] = (1 8 9 2 4 3 6) (5 10 7)

nhưng điều đó sẽ mất quá nhiều mã. Thay vào đó, chỉ cần cắt ký hiệu một dòng thành từng mảnh trước tất cả các số nhỏ hơn tất cả các số trước, gọi các chu trình này và tạo ra một hoán vị mới từ chúng.

[8, 4, 6, 3, 10, 1, 5, 9, 2, 7] ↦ (8) (4 6) (3 10) (1 5 9 2 7)

Để đảo ngược sự lựa chọn này, chúng ta có thể thực hiện bất kỳ hoán vị nào ở dạng chu kỳ, xoay từng chu kỳ sao cho số nhỏ nhất của nó là trước, sắp xếp các chu kỳ sao cho số nhỏ nhất của chúng xuất hiện theo thứ tự giảm dần và xóa tất cả các dấu ngoặc.


OP yêu cầu hoán vị danh tính được thể hiện mà không cần một chu kỳ. Tôi nghĩ sẽ tốt hơn nếu không phải như vậy.
dặm

1
Harry dường như ổn câu trả lời Jelly của tôi, trong đó in 1 chu kỳ ngay cả cho id. Có lẽ anh ấy có thể kêu vang?
Lynn

Tôi cũng không chắc lắm với cách nói của nó, và tôi không nhận thấy rằng giải pháp (của Lynn) cũng làm như vậy.
dặm

Tôi hiểu rằng bạn không thể biểu thị hoán vị danh tính bằng cách sử dụng chuỗi trống, vì vậy tôi đã sửa đổi câu trả lời của mình để giữ tất cả các chu kỳ 1 (cũng thuận tiện tiết kiệm 6 byte).
Neil

1
Tôi đã chỉnh sửa câu hỏi của mình để rõ ràng hơn, tôi muốn "một chu kỳ" được tách ra như bạn đã làm trong phần thứ hai của câu trả lời của bạn. Cũng được thực hiện bằng cách này.
Harry

6

Toán học, 84 49 31 byte

GroupElements@*AlternatingGroup

Thành phần của hai chức năng. Đầu ra ở dạng {Cycles[{}], Cycles[{{a, b}}], Cycles[{{c, d}, {e, f}}], ...}đại diện (), (a b), (c d)(e f), ....


3

J , 53 byte

[:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]

Các chu kỳ trong mỗi hoán vị được biểu diễn dưới dạng các mảng được đóng hộp vì J sẽ tạo ra các mảng bị rách bằng không.

Nếu đầu ra được thư giãn, sử dụng 41 byte

[:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]

trong đó mỗi hoán vị có thể chứa một chu kỳ và không chu kỳ.

Sử dụng

   f =: [:(<@((>:@|.~]i.<./)&.>@#~1<#@>)@C.@#~1=C.!.2)!A.&i.]
   f 3
┌┬───────┬───────┐
││┌─────┐│┌─────┐│
│││1 2 3│││1 3 2││
││└─────┘│└─────┘│
└┴───────┴───────┘
   f 4
┌┬───────┬───────┬─────────┬───────┬───────┬───────┬───────┬─────────┬───────┬───────┬─────────┐
││┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌─────┐│┌─────┐│┌───┬───┐│┌─────┐│┌─────┐│┌───┬───┐│
│││2 3 4│││2 4 3│││1 2│3 4│││1 2 3│││1 2 4│││1 3 2│││1 3 4│││1 3│2 4│││1 4 2│││1 4 3│││2 3│1 4││
││└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└─────┘│└─────┘│└───┴───┘│└─────┘│└─────┘│└───┴───┘│
└┴───────┴───────┴─────────┴───────┴───────┴───────┴───────┴─────────┴───────┴───────┴─────────┘

Đối với việc cấy ghép thay thế,

   f =: [:((1+]|.~]i.<./)&.>@C.@#~1=C.!.2)!A.&i.]
   f 3
┌─────┬─┬─┐
│1    │2│3│
├─────┼─┼─┤
│1 2 3│ │ │
├─────┼─┼─┤
│1 3 2│ │ │
└─────┴─┴─┘

Điều này thực sự đẹp ... cũng được thực hiện.
Harry

2

Thạch , 34 28 byte

L€’SḂ
ṙLR$Ṃµ€Ṣ
Œ!ŒṖ€;/Ç€ÑÐḟQ

Hãy thử nó ở đây .

Giải trình

Mỗi dòng trong một chương trình Jelly xác định một chức năng; cái dưới cùng là đỉnh núi main.

  • Dòng đầu tiên xác định một hàm kiểm tra xem một sản phẩm chu kỳ có phải là số lẻ hay không.

    L€      Length of each
      ’     Add 1 to each length 
       S    Take the sum
        Ḃ   Modulo 2
    
  • Dòng thứ hai bình thường hóa một phân vùng hoán vị [1…n]thành sản phẩm theo chu kỳ như sau:

         µ€    For each list X in the partition:
    ṙLR$          Rotate X by each element in [1…length(X)].
        Ṃ         Get the lexicographically smallest element.
                  Thus, find the rotation so that the smallest element is in front.
           Ṣ   Sort the cycles in the partition.
    

    Điều này sẽ biến ví dụ (4 3)(2 5 1)thành (1 2 5)(3 4).

Đây là chương trình chính. Nó nhận một đối số ntừ dòng lệnh và:

Œ!              Compute all permutations of [1…n].
  ŒṖ€           Compute all partitions of each permutation.
     ;/         Put them in one big list.
       ǀ       Normalize each of them into a cycle product.
         ÑÐḟ    Reject elements satisfying the top function,
                i.e. keep only even cycle products.
            Q   Remove duplicates.

Tôi đã thử chạy nó với 5 như một đầu vào, và không có đầu ra nào cả. Tập lệnh này chỉ dành cho Nhóm A3 và A4 hay nó có khả năng cung cấp cho bất kỳ nhóm nào không? Tôi thậm chí chưa bao giờ thấy Jelly trước đây vì vậy bất kỳ lời giải thích nào sẽ hữu ích.
Harry

Không, tôi chỉ đặt 3 và 4 vào cuộc chiến, vì vậy cho đến nay bạn đang chiến thắng nhưng tôi thực sự chỉ muốn tìm hiểu thêm.
Harry

Jelly thực sự có tích hợp sẵn cho các phân vùng, mà tôi quên mất! Rất may, một người bạn đã nhắc nhở tôi. Vì vậy, bây giờ nó hiệu quả hơn (xử lý n = 5, yay!) ngắn hơn.
Lynn

OP đã chỉnh sửa câu hỏi để làm rõ rằng 1 chu kỳ phải được tách ra.
Anders Kaseorg

2

JavaScript (Firefox 30-57), 220 218 212 211 byte

f=(a,p)=>a[2]?[for(i of a)for(j of f(a.filter(m=>m!=i),p,p^=1))[i,...j]]:[[a[p],a[p^1]]]

Đáng buồn thay, 88 byte chỉ đủ để tạo nhóm xen kẽ như một danh sách hoán vị a, do đó, nó sẽ khiến tôi phải trả thêm 132 130 124 123 byte để chuyển đổi đầu ra sang định dạng mong muốn:

n=>f([...Array(n).keys()],0).map(a=>a.map((e,i)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&s)

Tôi đã quản lý để cắt giảm phiên bản ES6 của mình xuống còn 222 216 215 byte:

n=>(g=(a,p,t=[])=>a[2]?a.map(e=>g(a.filter(m=>m!=e),p,[...t,e],p^=1)):[...t,a[p],a[p^1]].map((e,i,a)=>{if(e>i){for(s+='('+-~i;e>i;[a[e],e]=[,a[e]])s+=','+-~e;s+=')'}},s='')&&r.push(s))([...Array(n).keys(r=[])],0)&&r

Tôi không phiền nếu định dạng không theo ký hiệu chu kỳ hoàn hảo miễn là: mỗi hoán vị và chu kỳ của nó được hiển thị riêng biệt (như [1 2 3] [4 5] và << 123> <45 >> cả hai đều được chấp nhận ) và các chu kỳ của một chiều dài được tách ra. Có lẽ điều này có thể rút ngắn câu trả lời của bạn
Harry

@ Tôi không bao giờ thể hiện (1,2,3)(4,5)- đó là một hoán vị kỳ lạ! Hiện tại tôi sẽ hiển thị, ví dụ (1,2,3)(4)(5)- không chỉ loại bỏ các chu kỳ có độ dài 6 byte mà tôi còn kết quả với một kết quả trống cho chu kỳ nhận dạng sẽ khiến tôi mất thêm 4 byte để sửa.
Neil

Nếu bạn có nghĩa là không có gì được in cho danh tính thì tôi sẽ chấp nhận điều đó như tôi đã nói as for the identity outputs of nothing ... are accepatble. Và những gì sẽ được hiển thị nếu bạn xuất "dữ liệu thô" của mình, nó có ở dạng (1,2,3) (4) (5) hoặc dưới dạng gì khác không?
Harry

@Harry Bây giờ không bao gồm các chu kỳ có độ dài một, bao gồm một mục trống cho danh tính và vẫn quản lý để lưu một byte!
Neil

@Harry Dữ liệu thô sẽ là [1, 2, 0, 3, 4]ví dụ cụ thể, vì vậy không ở đâu gần những gì bạn muốn.
Neil

1

GAP , 32 byte

Cảm ơn @ChristianSievers đã giảm một nửa số lượng.

f:=n->List(AlternatingGroup(n));

Sử dụng tại dấu nhắc:

gap> f(4);
[ (), (1,3,2), (1,2,3), (1,4,3), (2,4,3), (1,3)(2,4), (1,2,4), (1,4)(2,3), (2,3,4), (1,3,4), (1,2)(3,4), (1,4,2) ]

Định dạng rất đẹp, tôi nghĩ GAP là một lựa chọn rất tốt để trả lời vấn đề này.
Harry

Câu trả lời của bạn không hiển thị nơi một hoán vị kết thúc và tiếp theo bắt đầu. Giả sử chức năng không cần in các giá trị dưới dạng hiệu ứng phụ, nhưng có thể chỉ trả về các giá trị dưới dạng danh sách sẽ được trình thông dịch in, tôi sẽ làmf:=n->List(AlternatingGroup(n));
Christian Sievers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.