Re: Permutations
- To: mathgroup at smc.vnet.net
- Subject: [mg65564] Re: Permutations
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Fri, 7 Apr 2006 06:14:43 -0400 (EDT)
- Organization: The University of Western Australia
- References: <e12s2k$j79$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
In article <e12s2k$j79$1 at smc.vnet.net>,
"King, Peter R" <peter.king at imperial.ac.uk> wrote:
> I wish to be able to construct permutations by listing those positions
> that are unaltered, all other pairs swapping. So if I start from
> {a,b,c,d,e,f} and apply the rule {1,4} I get {a,c,b,d,f,e}. Note that
> this is the only kind of permutation that I need. ie there is always at
> least one pair of positions that aren't changed and in all other
> positions neighbouring pairs are swapped (the only other kind of
> permutation is where all pairs cross, I guess I can call this {} and it
> gives {b,a,d,c,f,e}).
>
> I am sure there is a trivial way of doing this (clearly I can construct
> matrices and do it by multiplication of the vector - or I can extract
> elements and swap the postions "by hand" but these seem unnecessarily
> tedious). Any thoughts out there?
I wonder what the application is? That may give a hint as to the best
solution. Anyway, here is one solution:
perm[x_List, {p_, q_}] :=
Module[{y = Flatten[Reverse /@ Partition[
Complement[Range[Length[x]], {p, q}], 2]]},
x[[Insert[Insert[y, p, p], q, q]]]]
along with
perm[x_List, {}]:= x[[Flatten[Reverse/@Partition[Range[Length[x]],2]]]]
Tests:
perm[{a,b,c,d,e,f}, {1, 4}]
{a, c, b, d, f, e}
perm[{a,b,c,d,e,f}, {2, 5}]
{c, b, a, f, e, d}
perm[{a,b,c,d,e,f}, {}]
{b, a, d, c, f, e}
Cheers,
Paul
_______________________________________________________________________
Paul Abbott Phone: 61 8 6488 2734
School of Physics, M013 Fax: +61 8 6488 1014
The University of Western Australia (CRICOS Provider No 00126G)
AUSTRALIA http://physics.uwa.edu.au/~paul