Допустим, у нас есть строка «ABCD», и мы хотим извлечь букву в i-й позиции из n-й перестановки строки.
В этом примере я знаю, что есть факториал(4) = 24 перестановки, и список можно легко найти с помощью itertools.permutations, что даст следующее:
f (0, n) == ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B ',' B ',' B ',' B ',' C ',' C ',' C ',' C ',' C ',' C ',' D ',' D ',' D ', 'D', 'D', 'D'] [n]
f (1, n) == ['B', 'B', 'C', 'C', 'D', «D», «A», «A», «C», «C», «D», «D», «A», «A», «B», «B», «D», «D ',' A ',' A ',' B ',' B ',' C ',' C '] [n]
f (2, n) == [' C ','D ',' B ',' D ',' B ',' C ',' C ',' D ',' A ',' D ',' A ',' C ',' B ',' D ', 'A', 'D', 'A', 'B', 'B','C', 'A', 'C', 'A', 'B'] [n]
f (3, n) == ['D', 'C', 'D',«B», «C», «B», «D», «C», «D», «A», «C», «A», «D», «B», «D», «A',' B ',' A ',' C ',' B ',' C ',' A ',' B ',' A '] [n]
Это довольно легко дляi == 0, у нас есть f (0, n) == "ABCD" [n // 6], но поиск шаблона при увеличении i становится все более и более сложным.
Мне все равнокак перестановки упорядочены, так что может быть легко найти общий шаблон для каждого значения i ...
Я планирую использовать это с набором из 256 элементов и факториальной (256) перестановок, поэтому вычислениеперестановки - не вариант.
Редактировать: у меня уже есть функция для этого, но она слишком медленная, и мне было интересно, можно ли найти какой-нибудь эквивалентный результат с помощью простой формулы, использующей, например, побитовые операции ...
Edit-3: вот еще один подход, использующий полиномиальные аппроксимации для воссоздания перестановок, поэтомудругой формулировкой проблемы может быть «как воссоздать i-й коэффициент многочлена для n-й перестановки?».
Это список из n, перестановка, коэффициент многочлена (и, наконец, перестановка, перестроенная изкоэффициенты полинома) для N = 4:
0 [0, 1, 2, 3] [Дробь (0, 1), Дробь (1, 1), Дробь (0, 1),Фракция (0, 1)] [0, 1, 2, 3]
1 [0, 1, 3, 2] [Фракция (0, 1), Фракция (-3, 4), Фракция (5, 2), фракция (-2, 3)] [0, 1, 3, 2]
2 [0, 2, 1, 3] [фракция (0, 1), фракция (11,2), фракция (-9, 2), фракция (1, 1)] [0, 2, 1, 3]
3 [0, 2, 3, 1] [фракция (0, 1)Фракция (7, 4), Фракция (1, 2), Фракция (-1, 3)] [0, 2, 3, 1]
4 [0, 3, 1, 2] [Фракция(0, 1), фракция (33, 4), фракция (-13, 2), фракция (4, 3)] [0, 3, 1, 2]
5 [0, 3, 2, 1] [Фракция (0, 1), Фракция (19, 3), Фракция (-4, 1), Фракция (2, 3)] [0, 3, 2, 1]
6 [1, 0, 2, 3] [Фракция (1, 1), Фракция (-15, 4), Фракция (7,2), фракция (-2, 3)] [1, 0, 2, 3]
7 [1, 0, 3, 2] [фракция (1, 1), фракция (-17, 3), Фракция (6, 1), фракция (-4, 3)] [1, 0, 3, 2]
8 [1, 2, 0, 3] [фракция (1, 1),Фракция (21, 4), Фракция (-11, 2), Фракция (4, 3)] [1, 2, 0, 3]
9 [1, 2, 3, 0] [Фракция (1, 1), фракция (-1, 3), фракция (2, 1), фракция (-2, 3)] [1, 2, 3, 0]
10 [1, 3, 0, 2] [Фракция (1, 1), Фракция (31, 4), Фракция (-15, 2), Фракция (5, 3)] [1, 3, 0, 2]
11 [1, 3, 2, 0] [Фракция (1, 1), Фракция (17, 4), Фракция (-5, 2), Фракция (1, 3)] [1, 3, 2, 0]
12 [2, 0, 1, 3] [Фракция (2, 1), Фракция (-17, 4), Фракция (5, 2), Фракция (-1, 3)] [2, 0, 1, 3]
13 [2, 0, 3, 1] [Фракция (2, 1), Фракция (-31, 4), Фракция (15, 2), Фракция (-5, 3)][2, 0, 3, 1]
14 [2, 1, 0, 3] [Фракция (2, 1), Фракция (1, 3), Фракция (-2, 1), Фракция (2, 3)] [2, 1, 0, 3]
15 [2, 1, 3, 0] [Фракция (2, 1), Фракция (-21, 4), Фракция (11, 2), Фракция (-4, 3)] [2, 1, 3 , 0]
16 [2, 3, 0, 1] [Фракция (2, 1), Фракция (17, 3), Фракция (-6, 1), Фракция (4, 3)] [2, 3, 0, 1]
17 [2, 3, 1, 0] [Фракция (2, 1), Фракция (15, 4), Фракция (-7, 2), Фракция (2, 3)] [2, 3, 1, 0]
18 [3, 0, 1, 2] [Фракция (3, 1), Фракция (-19, 3), Фракция (4, 1), Фракция (-2, 3)] [3, 0, 1 , 2]
19 [3, 0, 2, 1] [Фракция (3, 1), Фракция (-33, 4), Фракция (13, 2), Фракция (-4, 3)] [3, 0, 2 , 1]
20 [3, 1, 0, 2] [Фракция (3, 1), Фракция (-7, 4), Фракция (-1, 2), Фракция (1, 3)] [3, 1, 0 , 2]
21 [3, 1, 2, 0] [Фракция (3, 1), Фракция (-11, 2), Фракция (9, 2), Фракция (-1, 1)] [3, 1, 2 , 0]
22 [3, 2, 0, 1] [Фракция (3, 1), Фракция (3, 4), Фракция (-5, 2), Фракция (2, 3)] [3, 2, 0, 1]
23 [3, 2, 1, 0] [Фракция (3, 1), Фракция (-1, 1), Фракция (0, 1), Фракция (0, 1)] [3, 2, 1, 0]
Мы ясно видим, что существует симметрия: coefs [i] = [3 - coefs [23-i] [0]] + [-c для c в coefs [23-i] [1:]], поэтому это способ исследовать, но я понятия не имею, что это возможно.