Radice quadrata di permutazione


21

In matematica, una permutazione σ dell'ordine n è una funzione biiettiva dagli interi 1 ... n a se stessa. Questo elenco:

2 1 4 3

rappresenta la permutazione σ tale che σ (1) = 2, σ (2) = 1, σ (3) = 4 e σ (4) = 3.

Una radice quadrata di una permutazione σ è una permutazione che, se applicata a se stessa, dà σ . Ad esempio, 2 1 4 3ha la radice quadrata τ = 3 4 2 1.

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

perché τ ( τ (k)) = σ (k) per tutti 1≤k≤n.

Ingresso

Un elenco di n > 0 numeri interi, tutti compresi tra 1 e n inclusi, che rappresentano una permutazione. La permutazione avrà sempre una radice quadrata.

È possibile utilizzare un elenco di 0 ... n-1 invece purché l'input e l'output siano coerenti.

Produzione

La radice quadrata della permutazione, anche come matrice.

restrizioni

L'algoritmo deve essere eseguito in tempo polinomiale in n . Ciò significa che non puoi semplicemente passare in rassegna tutte le n ! permutazioni dell'ordine n .

Sono ammessi tutti i builtin.

Casi test:

Si noti che molti ingressi hanno più possibili uscite.

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

Sarei corretto nel dire che per una permutazione avere una radice quadrata quindi se contiene n cicli di lunghezza m allora n è pari o m è dispari?
Neil

@Neil Sì. Altrimenti la permutazione può essere rappresentata come un numero dispari di swap.
jimmy23013

Ah sì, è un modo molto migliore per dirlo.
Neil

Risposte:


4

Perl, 124 122 byte

Include +3 per -alp

Esegui con la permutazione basata su 1 su 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}"

La complessità è O (n ^ 3)


Perché la complessità O (n ^ 3)?
CalcolatriceFeline

@CatsAreFluffy Perché è un programma stupido :-). Considera ogni coppia di elementi (anche se già gestita, O (n ^ 2)) e comprime insieme i loro cicli (senza nemmeno sapere quando fermarsi, O (n)) quindi controlla se quello sarebbe un ciclo corretto per una radice quadrata . Nel programma puoi vedere i 3 loop nidificati come 2 mappe e un for
Ton Hospel

Oh. Ha senso.
Calcolatrice

2

Mathematica, 165 167 byte

Una funzione senza nome.

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

Semi-ungolfed:

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

Con quale magia funziona?
Calcolatrice

1
@CatsAreFluffy se ho capito correttamente il codice semi-non golfizzato, divide la permutazione in cicli, li raggruppa per lunghezza, quindi per quelli dispari li aumenta alla potenza (lunghezza + 1) / 2 mentre per quelli pari li accoppia e li sfoglia insieme. (Se i cicli pari non possono essere associati, la partizione non ha radice quadrata.)
Neil

0

Prolog - 69 caratteri

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

Spiegazione:

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
Immagino che questo richieda tempo esponenziale.
feersum

Oh giusto. Dovrò aggiustarlo.
AtnNn
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.