Возвращает k th перестановку по вашей схеме:
IEnumerable<int> Perm(IEnumerable<int> source, int k)
{
return source.Select((x, i) => ((k >> i) & 1) == 1 ? -x : x);
}
Пример:
var data = new[] { 1, 2, 3, 4 };
for (int k = 0; k < (1 << data.Length); k++)
{
Console.WriteLine(string.Join(", ", Perm(data, k)));
}
Выход:
1, 2, 3, 4
-1, 2, 3, 4
1, -2, 3, 4
-1, -2, 3, 4
1, 2, -3, 4
-1, 2, -3, 4
1, -2, -3, 4
-1, -2, -3, 4
1, 2, 3, -4
-1, 2, 3, -4
1, -2, 3, -4
-1, -2, 3, -4
1, 2, -3, -4
-1, 2, -3, -4
1, -2, -3, -4
-1, -2, -3, -4