Можем ли мы вычислить

11

Я ищу эффективный алгоритм для решения проблемы:

Входные данные : положительное целое число 3n (сохраняется в виде битов) для некоторого целого числа n0 .

Вывод : число n .

Вопрос : Можем ли мы вычислить n из битов 3n за O(n) времени?


Это теоретический вопрос, мотивированный моим ответом на вопрос по математике. Как найти формулу для этой биекции? , В этом вопросе автор хотел найти биекцию из

{2n3m:n0 and m0}
и натуральных чисел N={1,2,} . Я предложил
2m3n2m(2n+1)
как решение. Другой ответ там утверждал, что «нет простой формулы», что заставляет меня задаться вопросом, насколько (вычислительно) просто мое предлагаемое решение.

С моим предложенным решением, если мы знаем n и m , мы можем легко вычислить 2m(2n+1) (запишите двоичные цифры n за которыми следует 1 последующими m нулями). Это занимает O(n+m) времени.

Нахождение из битов 2 m 3 n равносильно нахождению младшего значащего бита (который можно вычислить путем подсчета сдвигов правильных битов, оставив в памяти 3 n ). Это занимает O ( м ) времени.m2m3n3nO(m)

Однако нам также нужно найти , что может быть сложнее. Можно было бы найти n путем повторного деления на 3 , но это кажется расточительным. Требуется n операций деления, каждая из которых займет O ( n ) времени, так что это всего O ( n 2 ) времени. [На самом деле, после каждой итерации количество цифр будет линейно уменьшаться, но это все равно приводит к времени O ( n 2 ) .]nn3nO(n)O(n2)O(n2)

Кажется, что мы должны быть в состоянии использовать, зная, что вход является степенью .3

Ребекка Дж. Стоунс
источник
2
Какая у вас точная модель вычислений? Какие операции разрешены за раз? (Если бы мы могли делать арифметику с такими числами, как log 2 3, это было бы весьма полезно ...)O(1)log23
Юваль Фильмус
3
Может ли downvoter объяснить downvote? Это не кажется тривиальным вопросом вообще. Какое время работы лучше при разумной модели вычислений?
Юваль Фильмус
1
Я представляю ленты с 0, 1 и пустыми ячейками (с бесконечным количеством лент). Я хочу, чтобы операции однобитового переключения и переключения влево / вправо выполнялись за раз. (Если у нас есть маркер 0-го бита на бесконечной ленте, то сдвиг влево / вправо достигается путем смещения маркера). В отличие от машины Тьюринга, я не хочу, чтобы перемещение указателя занимало какое-то время. Таким образом, «переключение 0-го бита» занимает то же время, что и «переключение 124126-го бита». O(1)
Ребекка Дж. Стоунс
Это может быть как-то связано с этим вопросом
Ж.-Е.
Является ли нижняя граница очевидной? Ω(n)
Борис Бух,

Ответы:

9

Очевидный подход:

(1) Вычислить приближение к . Вы можете приблизить его с точностью до аддитивной ошибки, равной 1, подсчитав количество битов в данном двоичном представлении, и с точностью до аддитивной ошибки, равной ϵ , дополнительно взглянув на верхнюю часть O ( log 1).log2(3n)ϵбиты входных данных. Это должно быть достаточночтобы выбрать постоянное значениее, так что (после объединения с ошибкой на стадии (2)) конечных результатов концов вверхпределах аддитивной погрешности1/2от правильной.O(log1ϵ)ϵ1/2

(2) Вычислить приближение к . Я не знаком с алгоритмами для этого, но я ожидаю, что они занимают полиномиальное время в количестве битов точности, которые вам нужны, и вам нужно только O ( log n ) битов точности.log2(3)O(logn)

(3) Разделите ответ на (1) на ответ на (2) и округлите до ближайшего целого числа.

Таким образом, первый шаг занимает линейное время (в большинстве моделей вычислений, хотя, возможно, не для некоторых моделей с недостаточной мощностью, таких как машины Тьюринга с одной головкой ), а остальные этапы должны быть полилогарифмическими.

Дэвид Эппштейн
источник
3
log2(3)tO(M(t)logt)M(t)O(tlogt2logt)t
Спасибо за ссылку и извиняюсь за то, что слишком ленив, чтобы самому ее найти.
Дэвид Эппштейн
9

n>03nL=log2(3n)+1

L2log23nL1log23.
L13L
n=L1log23.
Jeffε
источник
4

k3n3nmod10k3nmod5k35k3φ(5k)=5k1×4

Поэтому, используя дискретный логарифм и поднятие по Хензелю, я думаю, вы должны быть в состоянии вычислить из младших цифр очень эффективно. Другими словами, вы начинаете с вычисления с цифры , беря дискретный лог в основание по модулю ; это показывает и может быть сделано за время. Затем вы найдете дискретный логарифм к базе по модулю ; это показывает , и может быть сделано вnmodφ(5k)k3nnmod43n3nmod535nmod4O(1)3nmod25e25nmod20O(1) время (используя знания , вам нужно попробовать всего возможностей). Итерация. На каждом этапе вы используете знания чтобы помочь вам эффективно вычислить дискретный журнал , используя тот факт, что есть только возможных значений для .nmod45nmodφ(5k1)3nmod5kн мод φ ( 5 к )5nmodφ(5k)

Теперь просто позвольте быть достаточно большим, и это показывает .нkn

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

DW
источник