순열 제곱근


21

수학에서, 차수 n순열 σ 는 정수 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

모든 1≤k≤n에 대해 τ ( τ (k)) = σ (k) 이기 때문이다 .

입력

순열을 나타내는 1과 n 사이 의 n > 0 정수 목록 . 순열에는 항상 제곱근이 있습니다.

입력과 출력이 일치 하는 한 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

순열이 제곱근을 갖기 위해 길이 m의 n 사이클을 포함하면 n이 짝수 또는 m이 홀수라고 말하는 것이 맞습니까?
Neil

@ 닐 예. 그렇지 않으면 순열이 홀수의 스왑으로 표시 될 수 있습니다.
jimmy23013

아, 그래야 훨씬 더 나은 방법입니다.
Neil

답변:


4

펄, 124122 바이트

에 +3 포함 -alp

STDIN에서 1 기반 순열로 실행하십시오.

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 개의 맵과 for
Ton Hospel

오. 맞는 말이다.
CalculatorFeline

2

수학, 165167 바이트

명명되지 않은 함수.

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

프롤로그-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.