การเปลี่ยนแปลงรูตสแควร์


21

ในวิชาคณิตศาสตร์มีการเปลี่ยนแปลง σของการสั่งซื้อnเป็นฟังก์ชัน bijective จากเลข 1 ... nกับตัวเอง รายการนี้:

2 1 4 3

แสดงให้เห็นถึงการเปลี่ยนแปลงσดังกล่าวว่าσ (1) = 2 σ (2) = 1 σ (3) = 4 และσ (4) = 3

รากของการเปลี่ยนแปลงσคือการเปลี่ยนแปลงที่เมื่อนำไปใช้กับตัวเองให้σ ตัวอย่างเช่น2 1 4 3มีรากที่τ3 4 2 1 =

k           1 2 3 4
τ(k)        3 4 2 1
τ(τ(k))     2 1 4 3

เพราะτ ( τ (k)) = σ (k) สำหรับ1≤k≤nทั้งหมด

อินพุต

รายชื่อของn > 0 จำนวนเต็มทั้งหมดระหว่าง 1 และnรวมเป็นตัวแทนของการเปลี่ยนแปลง การเรียงสับเปลี่ยนมักจะมีรากที่สอง

คุณสามารถใช้รายการ 0 ... n-1แทนตราบใดที่อินพุตและเอาต์พุตของคุณสอดคล้องกัน

เอาท์พุต

สแควร์รูทของการเรียงสับเปลี่ยนก็เป็นเหมือนอาร์เรย์

ข้อ จำกัด

อัลกอริทึมของคุณจะต้องทำงานในเวลาพหุนามในn นั่นหมายความว่าคุณไม่สามารถวนรอบnทั้งหมดได้! พีชคณิตของการสั่งซื้อn

บิลด์อินใดก็ได้ที่ได้รับอนุญาต

กรณีทดสอบ:

โปรดทราบว่าอินพุตจำนวนมากมีเอาต์พุตที่เป็นไปได้หลายรายการ

2 1 4 3
3 4 2 1

1
1

3 1 2
2 3 1

8 3 9 1 5 4 10 13 2 12 6 11 7
12 9 2 10 5 7 4 11 3 1 13 8 6

13 7 12 8 10 2 3 11 1 4 5 6 9
9 8 5 2 12 4 11 7 13 6 3 10 1

ฉันจะพูดถูกไหมถ้าการเรียงสับเปลี่ยนมีสแควร์รูทแล้วถ้ามันมี n รอบของความยาว m ดังนั้น n คือ n หรือ m เป็นคี่หรือไม่?
Neil

@ นีลใช่ มิฉะนั้นการเรียงสับเปลี่ยนสามารถแสดงเป็นจำนวนคี่สลับ
jimmy23013

อาใช่นั่นเป็นวิธีที่ดีกว่ามากในการวาง
Neil

คำตอบ:


4

Perl, 124 122 ไบต์

รวมถึง +3 สำหรับ -alp

เรียกใช้ด้วยการเปลี่ยนรูปตาม 1 บน STDIN:

rootperm.pl <<< "8 3 9 1 5 4 10 13 2 12 6 11 7"

rootperm.pl:

map{//;@{$G[-1]^$_|$0{$_}}{0,@G}=(@G=map{($n+=$s{$_=$F[$_-1]}++)?():$_}(0+$',0+$_)x@F)x2,%s=$n=0for@F}@F;$_="@0{1..@F}"

ความซับซ้อนคือO (n ^ 3)


ทำไมความซับซ้อน O (n ^ 3)?
CalculatorFeline

@CatsAreFluffy เพราะเป็นโปรแกรมที่โง่ :-) มันพิจารณาแต่ละองค์ประกอบ (แม้ว่าจะมีการจัดการแล้ว, O (n ^ 2)) และรหัสไปรษณีย์ของพวกเขารอบกัน (ไม่ทราบว่าเมื่อใดที่จะหยุด, O (n)) จากนั้นตรวจสอบว่าจะเป็นวงจรที่เหมาะสมสำหรับรากที่สอง . ในโปรแกรมคุณสามารถดูลูปซ้อนกัน 3 วงเป็น 2 แผนที่และสำหรับ
Ton Hospel

โอ้ มีเหตุผล.
CalculatorFeline

2

Mathematica, 165 167ไบต์

ฟังก์ชั่นที่ไม่มีชื่อ

PermutationList[Cycles@Join[Riffle@@@#~(s=Select)~EvenQ@*(l=Length)~SortBy~l~Partition~2,#[[Mod[(#+1)/2Range@#,#,1]&@l@#]]&/@#~s~OddQ@*l]&@@PermutationCycles@#,l@#]&

กึ่ง ungolfed:

PermutationList[
    Cycles@Join[
        Riffle@@@Partition[SortBy[Select[#,EvenQ@*Length],Length], 2],
        #[[Mod[(Length@#+1)/2Range@Length@#,Length@#,1]]]& /@ Select[#,OddQ@*Length]
    ]& @@ PermutationCycles @ #,
    Max@#
]&

มันใช้เวทย์อะไรได้บ้าง?
CalculatorFeline

1
@CatsAreFluffy ถ้าฉันเข้าใจโค้ดกึ่งไม่ถูกต้องมันจะแบ่งการเรียงสับเปลี่ยนออกเป็นวง ๆ จัดกลุ่มตามความยาวจากนั้นถ้าเป็นเลขคี่จะยกให้เป็นพลังงาน (ความยาว + 1) / 2 ในขณะที่เลขคู่นั้น จับคู่พวกเขาและกระเพื่อมเข้าด้วยกัน (หากไม่สามารถจับคู่วงรอบได้พาร์ติชันจะไม่มีสแควร์รูท)
Neil

0

Prolog - 69 ตัวอักษร

p([],_,[]). p([H|T],B,[I|U]):-p(T,B,U),nth1(H,B,I). f(X,Y):-p(Y,Y,X).

คำอธิบาย:

permutate([], _, []).                 % An empty permutation is empty
permutate([X|Xs], List, [Y|Ys]) :-    % To permutate List
  permutate(Xs, List, Ys),            % Apply the rest of the permutation
  nth1(X, List, Y).                   % Y is the Xth element of List

root(Permutation, Root) :-            % The root of Permutation
  permutate(Root, Root, Permutation). % Applied to itself, is Permutation

3
ฉันคิดว่านี่ใช้เวลาชี้แจง
feersum

โอ้ใช่. ฉันจะต้องแก้ไขมัน
AtnNn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.