Step by step ... Informazioni sulle gare, come allenarsi, chi corrompere.

Вы не находите странным, что некоторые "почти равные" числа записываются абсолютно по-разному? Например, в десятичной системе счисления числа `29` и `30` отличаются всего на единицу, но их запись не содержит ни одной общей цифры.
Во избежание такой ситуации код АЛФАВИТ предлагает запись чисел последовательностью нулей и единиц:
Десятичная система счисления: `|0|1|2|3|4|5|6|7|8`
АЛФАВИТ: `| 0 | 1 | 11 | 10 | 110 | 111 | 101 | 100 | 1100`
Правило построения следующего числа в коде АЛФАВИТ таково: в предыдущем числе нужно изменить крайний правый символ, если это возможно, если нет — приписать слева единицу.
(a) Какому числу в десятичной системе счисления соответствует запись в АЛФАВИТе `111111`?
(b) Какое число следует за ним в этом коде?
(c) Опишите алгоритм, рассчитывающий для каждого числа в коде АЛФАВИТ число, следующее за ним.



@темы: Теория чисел

Комментарии
28.06.2013 в 23:09

Только дурак нуждается в порядке — гений господствует над хаосом.
если это возможно
Это всегда возможно. Если имеется ввиду «если для получения предыдущего числа цифра не менялась», то возникают вопросы по формальному описанию соответствия десятичных цифр строкам АЛФАВИТа — `6 != 5 + 1`, в частности.

Или я чего-то не понимаю в действии оператора `+ 1`?
28.06.2013 в 23:15

На плечах гигантов, на спинах электронов
Adjirranirr, надо полагать, что действия с числами мы в АЛФАВИТе не производим. Это только средство записи. Как иероглифы. Нули и единицы не имеют никакой семантики. Здесь чистый синтаксис.
28.06.2013 в 23:15

Только дурак нуждается в порядке — гений господствует над хаосом.
Если считать, что первые 8 неотрицательных целых чисел не подчиняются правилам `+1`, то тогда `9 = 8 + 1 = 1101`, `10 = 9 + 1 = 11101`, `11 = 10 + 1 = 11100`. Тогда вторая справа цифра всегда будет нулем, т.к. она инвариантна по действию оператора `+1`.
28.06.2013 в 23:17

На плечах гигантов, на спинах электронов
если это возможно
Это всегда возможно.

Это мой корявый перевод. (
28.06.2013 в 23:21

Только дурак нуждается в порядке — гений господствует над хаосом.
Здесь чистый синтаксис.
Тем не менее, претензия на взаимное соответствие слов АЛФАВИТа натуральным числам есть.
У нас есть достаточно данных для построения строгой аксиоматики над этими словами — `1 \in `АЛФАВИТ*, `S(n) \in`АЛФАВИТ*, вполне упорядоченность (откуда — индукция). Так что формализация эквивалентна аксиомам Пеано или построению непредельных ординалов.
28.06.2013 в 23:29

На плечах гигантов, на спинах электронов
Что-то тут нечисто...
Получается, вопросы (а) и (b) не имеют смысла...
28.06.2013 в 23:33

Только дурак нуждается в порядке — гений господствует над хаосом.
Если не смотреть на тот факт, что `6 != 5 + 1`, и строить формализацию от нуля с заданной функцией следования, то получится примерно следующее:

(без оптимизации кода, VS C++ 2012, /O2)

Вывод:

28.06.2013 в 23:42

Только дурак нуждается в порядке — гений господствует над хаосом.
Для формального описания оператора `+1` достаточно заметить, что `(n + 1) + 1 = 1 \oplus \hat(n)`, где `\hat(n)` обозначает изменение последнего символа, а `\oplus` — конкатенацию строк.
Тогда `(((n + 1) + 1) + 1) + 1 = 11 \oplus n`; тогда последний символ нужно менять в том и только в том случае, когда `\text{len} (n) + \text{ld} (n)` четно; `\text{len} (\cdot)` и `\text {ld} (\cdot)` — функции, возвращающие длину строки `n` и ее крайний правый символ соответственно.
28.06.2013 в 23:47

На плечах гигантов, на спинах электронов
Нет. Кажется, я поняла, как звучит условие.

в предыдущем числе нужно изменить крайний правый символ, если это возможно, если нет — приписать слева единицу.
В предыдущем числе нужно изменить первую справа цифру, изменение которой даст число, которого еще не было. Если ни одной цифры при таком условии изменить нельзя, то ....... (далее по тексту).

Приношу извинения за неверный перевод.
28.06.2013 в 23:52

Только дурак нуждается в порядке — гений господствует над хаосом.
Вот теперь стало интереснее =)

Приношу извинения за неверный перевод.
Ничего страшного.
29.06.2013 в 01:10

в предыдущем числе нужно изменить крайний правый символ

Пример алфавита не удовлетворяет этому требованию.
Алфавит в задаче - пример кода, в котором соседние числа отличаются только одним битом.
Переход из N битных слов в N+1 битные осуществляется только тогда, когда N-битные комбинации исчерпаны.

Вообще говоря, существует много способов написать такой код, но есть один с определённой закономерностью (именно он дан в примере). И он даже специальное название имеет в АТК.
Практическое применение этого кода - допустим, у нас есть N бинарных переключателей. Нужно проверить все комбинации, при этом минимизировать число переключений.
29.06.2013 в 01:33

Только дурак нуждается в порядке — гений господствует над хаосом.
Ну это код Грэя в первозданном виде, без нулей на ведущих позициях.

Переход из N битных слов в N+1 битные осуществляется только тогда, когда N-битные комбинации исчерпаны.
А вот это я доказать не смог =) Полнота (т.е. равенство АЛФАВИТ = {0, 1}*) сразу ведет к симметричности относительно «предельных» чисел (т.е. таких, после которых идет переход длины) с изменением ведущего бита; откуда формула для преобразования бинарного представления в код: Gray (n) = n ⊕ [n / 2]. Отсюда уже несложно получить формулу обратного преобразования — n = Gray (n) ⊕ [Gray (n)/2] ⊕ ... ⊕ [Gray (n)/2k].
29.06.2013 в 01:36

Ну это код Грэя в первозданном виде

я знаю. :)

А вот это я доказать не смог

доказать исходя из каких условий? В коде Грея это выполняется. А условие в данной задаче не соответствует примеру, следовательно - где-то неточность.
29.06.2013 в 01:41

Только дурак нуждается в порядке — гений господствует над хаосом.
Условие просто не подправлено.

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

В такой формулировке это код Грэя, а вот доказать соответствие у меня пока не получилось.