# How to define even permutations correctly?

I define even permutations as following, but there may be some error. I use it in two different way and get different output.

evenper[x_] := Select[Permutations[x], Signature[#] == 1 &]


Way 1:

evenper[x_] := Select[Permutations[x], Signature[#] == 1 &]
manual=evenper[{a, b, c, d}]
phi = 1.61803398875;
p1 = manual /. {a -> phi, b -> 1, c -> 1/phi, d -> 0};
p2 = manual /. {a -> phi, b -> 1, c -> -1/phi, d -> 0};
p3 = manual /. {a -> phi, b -> -1, c -> 1/phi, d -> 0};
p4 = manual /. {a -> phi, b -> -1, c -> -1/phi, d -> 0};
p5 = manual /. {a -> -phi, b -> 1, c -> 1/phi, d -> 0};
p6 = manual /. {a -> -phi, b -> 1, c -> -1/phi, d -> 0};
p7 = manual /. {a -> -phi, b -> -1, c -> 1/phi, d -> 0};
p8 = manual /. {a -> -phi, b -> -1, c -> -1/phi, d -> 0};
list1=Union[p1, p2, p3, p4, p5, p6, p7, p8]//Sort;


This result is what I want.

Way 2:

evenper[x_] := Select[Permutations[x], Signature[#] == 1 &]

phi = 1.61803398875;
list20 = #*{phi, 1, 1/phi, 0} & /@ (Tuples[{{1, -1}, {1, -1}, {1, -1}, {1}}]);
list2 = Flatten[evenper[#] & /@ list20, 1] // Sort;


But you will find list1 != list2 as following

Position[list1, {-1.618033988749895, 0, 0.6180339887498948, -1}]
Position[list2, {-1.618033988749895, 0, 0.6180339887498948, -1}]
(*{}*)
(*{{6}}*)

• Would you attempt to give a more minimal example of the updated problem? That is a lot of code to read through with the care needed for debugging. – Mr.Wizard Sep 19 '14 at 13:55
• @Mr.Wizard Hi, the problem is updated. The error lies in the definition of evenper, but I do not know why. – Eden Harder Sep 20 '14 at 1:55
• A more accurate value for phi is phi = GoldenRatio//N; Also , it is unnecessary to use Sort in the definition of list1 since Union already sorts. – Bob Hanlon Sep 20 '14 at 5:48

Thanks for updating your Question. With the new, clearer example I believe I can see the issue.

## Analysis

The first method uses evenper on Symbolic values that are in canonical order:

r1 = evenper[{a, b, c, d}]

{{a, b, c, d}, {a, c, d, b}, {a, d, b, c}, {b, a, d, c}, {b, c, a, d}, {b, d, c, a},
{c, a, b, d}, {c, b, d, a}, {c, d, a, b}, {d, a, c, b}, {d, b, a, c}, {d, c, b, a}}


Recalling the definition of Signature

Signature[list]
gives the signature of the permutation needed to place the elements of list in canonical order.

We cannot therefore expect the same permutations to be selected if evenper is used on on elements that are not in canonical order:

rls = {a -> 2, b -> 1, c -> 3, d -> 4};
r2 = evenper[{a, b, c, d} /. rls]
r2 /. Reverse[rls, 2]
% === r1

{{2, 1, 4, 3}, {2, 3, 1, 4}, {2, 4, 3, 1}, {1, 2, 3, 4}, {1, 3, 4, 2}, {1, 4, 2, 3},
{3, 2, 4, 1}, {3, 1, 2, 4}, {3, 4, 1, 2}, {4, 2, 1, 3}, {4, 1, 3, 2}, {4, 3, 2, 1}}

{{a, b, d, c}, {a, c, b, d}, {a, d, c, b}, {b, a, c, d}, {b, c, d, a}, {b, d, a, c},
{c, a, d, b}, {c, b, a, d}, {c, d, b, a}, {d, a, b, c}, {d, b, c, a}, {d, c, a, b}}

False


## Solution

If you wish to apply a certain set of permutations to arbitrary expressions, regardless of their canonical ordering, you can first permute a list of indices (natural numbers) and then use Part to extract them from the expression list:

Select[Permutations @ Range @ 3, Signature[#] == 1 &]
{z, a, p}[[#]] & /@ %

{{1, 2, 3}, {2, 3, 1}, {3, 1, 2}}

{{z, a, p}, {a, p, z}, {p, z, a}}


perms = Select[Permutations @ Range @ 4, Signature[#] == 1 &];

phi = 1.61803398875;

tup = # {phi, 1, 1/phi, 0} & /@ Tuples[{1, -1}, 4];

result = Union @@ Outer[Part, tup, perms, 1];

result == list1

True


As rasher informed me in a comment a greatly improved method for Mathematica 8 or later is to use AlternatingGroup and Permute as follows:

fn = # ~Permute~ AlternatingGroup[Length @ #] &;

fn @ {z, a, p}

{{z, a, p}, {a, p, z}, {p, z, a}}

perms === fn @ Range @ 4

True

• For your toolbag - proper (and much more efficient for non-trivial sizes) is:Permute[#,AlternatingGroup@Length@#]&... – ciao May 5 '15 at 23:51
• @ciao Thanks! I'll amend my answer. I am grateful that you continue to contribute even in nontraditional ways. :-) – Mr.Wizard May 6 '15 at 0:02
• Ah, I now understand what OP will be using this for; s/he is trying to generate vertices of polychorons… the stuff with the golden ratio makes me think of the 600-cell. – J. M.'s ennui May 6 '15 at 0:33

The sorting (ordering) done by Union is different for different forms of expressions, e.g., analytic versus numeric expressions for a number.

Union[{2., (Sqrt[5] + 1)/2}]


{2., 1/2 (1 + Sqrt[5])}

% // N


{2., 1.61803}

Union[{2., (Sqrt[5] + 1.0)/2}]


{1.61803, 2.}

SortBy[{2., (Sqrt[5] + 1)/2}, N]


{1/2 (1 + Sqrt[5]), 2.}