Pierwiastek kwadratowy permutacji

21

W matematyce permutacja σ rzędu n jest funkcją podwójną od liczb całkowitych 1 ... n do siebie. Ta lista:

2 1 4 3

reprezentuje permutację σ tak, że σ (1) = 2, σ (2) = 1, σ (3) = 4, i σ (4) = 3.

Pierwiastek kwadratowy permutacji σ jest permutacją, która zastosowana do siebie daje σ . Na przykład 2 1 4 3ma pierwiastek kwadratowy τ = 3 4 2 1.

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

ponieważ τ ( τ (k)) = σ (k) dla wszystkich 1≤k≤n.

Wkład

Lista liczb całkowitych n > 0, wszystkie od 1 do n włącznie, reprezentujące permutację. Permutacja zawsze będzie miała pierwiastek kwadratowy.

Zamiast tego możesz użyć listy 0 ... n-1, o ile dane wejściowe i wyjściowe są spójne.

Wydajność

Pierwiastek kwadratowy permutacji, również jako tablica.

Ograniczenia

Twój algorytm musi działać w czasie wielomianowym w n . Oznacza to, że nie możesz po prostu przejść przez wszystkie n ! permutacje rzędu n .

Wszelkie wbudowane są dozwolone.

Przypadki testowe:

Zauważ, że wiele wejść ma wiele możliwych wyników.

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
lirtosiast
źródło
Czy miałbym rację mówiąc, że jeśli permutacja ma pierwiastek kwadratowy, to jeśli zawiera n cykli o długości m, to albo n jest parzyste, albo m jest nieparzyste?
Neil
@Neil Tak. W przeciwnym razie permutację można przedstawić jako nieparzystą liczbę zamian.
jimmy23013
Ach tak, to o wiele lepszy sposób.
Neil
1
powiązane
Liam

Odpowiedzi:

4

Perl, 124 122 bajtów

Obejmuje +3 za -alp

Uruchom z permutacją opartą na 1 na 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}"

Złożoność wynosi O (n ^ 3)

Ton Hospel
źródło
Dlaczego złożoność O (n ^ 3)?
CalculatorFeline
@CatsAreFluffy Ponieważ to głupi program :-). Bierze pod uwagę każdą parę elementów (nawet jeśli jest już obsługiwana, O (n ^ 2)) i zamyka ich cykle razem (nawet nie wiedząc, kiedy zatrzymać, O (n)), a następnie sprawdza, czy byłby to odpowiedni cykl dla pierwiastka kwadratowego . W programie można zobaczyć 3 zagnieżdżone pętle jako 2 mapy i for
Ton Hospel
O. Ma sens.
CalculatorFeline
2

Mathematica, 165 167 bajtów

Funkcja bez nazwy.

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

Częściowo nie golfowy:

PermutationList[
    Cycles@Join[
        Riffle@@@Partition[SortBy[Select[#,EvenQ@*Length],Length], 2],
        #[[Mod[(Length@#+1)/2Range@Length@#,Length@#,1]]]& /@ Select[#,OddQ@*Length]
    ]& @@ PermutationCycles @ #,
    Max@#
]&
feersum
źródło
Jaką magią to działa?
CalculatorFeline
1
@CatsAreFluffy, jeśli dobrze zrozumiałem częściowo nie-golfowy kod, dzieli on permutację na cykle, grupuje je według długości, a następnie dla nieparzystych podnosi je do potęgi (długość + 1) / 2, podczas gdy dla parzystych łączy je i łączy je ze sobą. (Jeśli nie można sparować cykli parzystych, wówczas partycja nie ma pierwiastka kwadratowego.)
Neil
0

Prolog - 69 znaków

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

Wyjaśnienie:

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
AtnNn
źródło
3
Wyobrażam sobie, że zajmuje to wykładniczy czas.
feersum
Och, racja. Będę musiał to naprawić.
AtnNn