Есть специальный цикл по всем перестановкам:
forperm. Примеры запуска есть в документации к PARI. Ну или вот:
Код:
? forperm([1,2,3],r, print(r); );
Vecsmall([1, 2, 3])
Vecsmall([1, 3, 2])
Vecsmall([2, 1, 3])
Vecsmall([2, 3, 1])
Vecsmall([3, 1, 2])
Vecsmall([3, 2, 1])
?
Но для получения всех перестановок надо непременно указывать массив в возрастающем порядке! Достаточно применить к нему оператор
Set() (только он и дубли удалит):
Код:
? forperm([2,3,1],r, print(r); );
Vecsmall([2, 3, 1])
Vecsmall([3, 1, 2])
Vecsmall([3, 2, 1])
? forperm(Set([2,3,1]),r, print(r); );
Vecsmall([1, 2, 3])
Vecsmall([1, 3, 2])
Vecsmall([2, 1, 3])
Vecsmall([2, 3, 1])
Vecsmall([3, 1, 2])
Vecsmall([3, 2, 1])
?
Код:
for ( i=1,6, S[i]=i);
Можно сделать проще и быстрее:
S=vector(6,i,i); почему-то не работало.
Работает:
Код:
? S=[1,2,3,4,5]
[1, 2, 3, 4, 5]
? n=1;m=4;[S[n],S[m]]=[S[m],S[n]]
[4, 1]
? S
[4, 2, 3, 1, 5]
?
-- 03.11.2022, 22:12 --Кажется я не вполне понял что хотелось ...