Длина цикла для совершенных перетасовок колод любого размера

10

Вызов

В кратчайшем количестве кода:

  1. Вычислите длину цикла перестановки идеального перемешивания на колоде карт любого размера n (где n ≥ 2, а n четное).
  2. Выведите таблицу всех длин циклов для 2 ≤ n ≤ 1000 ( четное n ).

Обратите внимание, что есть два основных способа определения идеального шаффла. Существует перетасовка , в которой первая карта находится сверху, а последняя - снизу, а в перетасовке первая и последняя карты перемещаются на одну позицию к центру. Вы можете выбрать, будете ли вы делать это в случайном порядке или в случайном порядке; алгоритм почти идентичен между ними.

  • перестановка 10-карточной колоды: [1,2,3,4,5,6,7,8,9,10] ↦ [1,6,2,7,3,8,4,9,5, 10].
  • в колоде из 10 карт: [1,2,3,4,5,6,7,8,9,10] ↦ [6,1,7,2,8,3,9,4,10, 5].

Графический пример

Здесь мы видим, что в случайном порядке в колоде из 20 карт продолжительность цикла составляет 18 шагов. (Это только для иллюстрации; ваше решение не обязано выводить циклы графически.) С другой стороны, классическая колода из 52 карт имеет продолжительность цикла перестановки всего 8 шагов (не показано).

Вне-перемешивание для колоды из 20 карт

В случайном порядке в колоде из 20 карт продолжительность цикла составляет всего 6 шагов.

В случайном порядке для колоды из 20 карт

Табличный пример вывода

Ваша программа должна выводить что-то похожее на это, хотя вы можете выбрать любой табличный формат, который вам больше нравится. Это для перестановки:

2 1
4 2
6 4
8 3
10 6
12 10
14 12
16 4
18 8
20 18
22 6
24 11
26 20
28 18
30 28
32 5
34 10
36 12
38 36
40 12
...many lines omitted...
1000 36

Вопросов

  1. Есть ли какая-либо связь между числовым входом n и его счетчиком циклов, когда n является степенью 2?
  2. Как насчет того, когда n не является степенью 2?
  3. Любопытно, что колода из 1000 карт имеет количество циклов вне случайного перемешивания всего 36, а колода из 500 карт имеет количество циклов вне случайного перемешивания 166. Почему это может быть?
  4. Какое наибольшее число вы можете найти, чье число циклов c значительно меньше n , а это означает, что отношение n / c максимально?
Тодд Леман
источник
1
Очень тесно связаны.
Мартин Эндер
Да, это больше о отображении результатов, хотя. Этот вопрос касается генерации таблицы для любого значения n ; это более математический характер.
Тодд Леман,
меня там смутило с циклами 6/8 в продемонстрированном на некоторое время :) (я думал, что моя реализация была неправильной). наконец, я посмотрел на изображение и увидел, что это 6 циклов, поэтому я отредактировал его. смешно
гордый haskeller
@ гордый haskeller - ах да, спасибо!
Тодд Леман
1
Это последовательность A002326 .
orlp

Ответы:

6

Хаскелл, 47 46 44 (в случайном порядке)

[[i|i<-[1..],mod(2^i)n<2]!!0|n<-[3,5..1001]]

основная реализация состоит в том, что это порядок 2 в мультипликативной группе модуля n+1 .

гордый хаскеллер
источник
1
Вы можете удалить l=- само выражение достаточно. Это допустимая программа при запуске в интерактивной командной строке.
Orlp
5

Pyth, 16 байт

mfq1%^2T+3yd)500

В случайном порядке с использованием A002326 .

orlp
источник
2

Pyth, 22 байта

V500,JyhNl{.u.iFc2NJUJ

Попробуйте онлайн: Демонстрация . Замените 500 на меньшее число, если оно слишком медленное.

Объяснение:

V500                     for N in [0, 1, ..., 499]:
      yhN                   (N + 1) * 2
     J                      assign to J
           .u      JUJ      apply the following expression J times
                            to N, starting with N = [0, 1, ..., J - 1],
                            and return all intermediate results:
                c2N            split N into 2 halfs
             .iF               and interleave them
         l{                 remove duplicates and give length
    ,                       make a pair and print
Jakube
источник
1
Это довольно безумно, что решение pyth, которое выполняет фактическую работу по перетасовке и подсчету колод, вдвое меньше, чем решение haskell, которое использует простую формулу для мгновенного предсказания результата
Falco
@Falco Я знаю правильно
гордый haskeller
1
@Falco Я на самом деле пытался сделать точный порт моего ответа, но я не мог понять, как это сделать. Так что я только что закончил играть с pyth в течение получаса
гордый haskeller
Будь рад, что ты не попробовал <> <
Falco
2

Mathematica, 53 (в случайном порядке)

Grid[{2#,MultiplicativeOrder[2,2#+1]}&/@Range[1,500]]

или не антагонистически разнесены

Grid[{2 #, MultiplicativeOrder[2, 2 # + 1]} & /@ Range[1, 501]]

Вывод:

   2    2
   4    4
   6    3
   8    6
  10   10
  12   12
  14    4
  16    8
  18   18
  20    6
 (* digits, digits, bo bidgits, banana fana, ... *)
  498  166
  500  166
 (* skip a bit, brother ...  *)
  998   36
 1000   60

Каждая запись в обоих столбцах горизонтально центрирована в их столбцах, но у меня нет дробных пробелов &#8194;...&#8202; здесь, чтобы повторить это.

Замечания:

  • Out-shuffle - это колода в колоде на две карты меньше. (Обратите внимание, что первая и последняя карты находятся в фиксированном положении на протяжении всей демонстрации в случайном порядке.) Следовательно, оба варианта приведут к одинаковым выходным спискам - второй столбец будет смещен на одну строку. Что касается «полномочий два» намека, в-перетасовки власти два палуб имеют узор {2^n - 2, n}, {2^n, 2n}. (Перемешать пары 2^nс n.)
  • Обратите внимание на пример в случайном порядке, что расстояние 2от ближайшего конца колоды удваивается на каждом шаге. {2, 4, 8, 15 = -5, -10, -20}, На самом деле это верно для каждой карты. Поэтому нам нужно только знать, какая сила 2соответствует 1моду, n+1где nколичество карт. (Обратите внимание, что в этом примере карты в последнем столбце, столбце -1, удваиваются до предпоследнего столбца, -2что означает, что 0это соответствует одной карте больше, чем в колоде, то есть «mod n+1».) Следовательно, MultiplicativeOrder [] Функция - путь (в Mathematica).
  • По умолчанию можно использовать TableForm [] вместо Grid [], но вывод аналогичен.
Эрик Тауэрс
источник
Ваш пример выходных данных кажется неправильным
гордый haskeller
@proudhaskeller: в случайном порядке или в случайном порядке? Любой разрешен. (И, как уже отмечалось, один - это просто сдвиг на одну строку в правом столбце другого.)
Эрик Тауэрс,
Они оба не подходят. Посмотрите пример вывода в вопросе. Может быть, ваш пример вывода неверен, а реальный код верен, а пример просто устарел, я не знаю, но, похоже, он не подходит.
гордый haskeller
roudhaskeller: Я, кажется, опечатал мой пример вывода в «8». И сумбурный - как минимум один раз. Редактирование. Спасибо за настойчивость. :-)
Эрик Тауэрс
0

С 86 (или 84)

Оценка исключает ненужные пробелы, включенные для наглядности.

i,j,n;
main(){
  for(;n<1002;printf("%d %d\n",n,j),n+=2)
    for(i=n,j=1;i=i*2%(n+1),i-n;)j++;
}

Это перетасовка, которая, как отмечают другие, является просто перетасовкой с удаленными стационарными картами на обоих концах.

Как указывалось другими, в случайном порядке позиция каждой карты удваивается каждый раз, но это нужно делать по модулю. n+1 . Мне нравится думать, что позиция дополнительной карты - это нулевая позиция слева от стола (вы можете думать об этом как о том, что вы держите обе стационарные карты из аут-шаффла). Очевидно, что позиция карты всегда должна быть положительной, поэтому нулевая позиция всегда остается пустой для случая случайного выбора.

Код инициализируется iзначением n. Затем он умножается на 2, принимает мод результата (n+1)и проверяет i, вернул ли он свое первоначальное значение ( i-nравно нулю). Он увеличивается jдля каждой итерации, кроме последней (отсюда необходимость инициализации jдо 1.)

В принципе, iможет быть с любым значением в диапазоне 1..n, при условии, что сравнение в конце проверяет, было ли оно инициализировано к тому же числу. Причиной выбора nбыло убедиться, что программа работает на случай n==0. проблема заключалась в том, что любое число по модулю (0+1)равно нулю, поэтому цикл в этом случае никогда не прерывался, если iбыл инициализирован константой, такой как 1.

Примеры вопросов включают в себя эквивалентный случай n==2для шаффла, поэтому было истолковано, что этот случай необходим. Если это не так, два байта n,могут быть сохранены путем инициализации iв 1, то же значение, что и j.

Уровень реки St
источник