Я ищу эффективный алгоритм для решения проблемы:
Входные данные : положительное целое число (сохраняется в виде битов) для некоторого целого числа .
Вывод : число .
Вопрос : Можем ли мы вычислить из битов за времени?
Это теоретический вопрос, мотивированный моим ответом на вопрос по математике. Как найти формулу для этой биекции? , В этом вопросе автор хотел найти биекцию из
С моим предложенным решением, если мы знаем и , мы можем легко вычислить (запишите двоичные цифры за которыми следует последующими нулями). Это занимает времени.
Нахождение из битов 2 m 3 n равносильно нахождению младшего значащего бита (который можно вычислить путем подсчета сдвигов правильных битов, оставив в памяти 3 n ). Это занимает O ( м ) времени.
Однако нам также нужно найти , что может быть сложнее. Можно было бы найти n путем повторного деления на 3 , но это кажется расточительным. Требуется n операций деления, каждая из которых займет O ( n ) времени, так что это всего O ( n 2 ) времени. [На самом деле, после каждой итерации количество цифр будет линейно уменьшаться, но это все равно приводит к времени O ( n 2 ) .]
Кажется, что мы должны быть в состоянии использовать, зная, что вход является степенью .
источник
Ответы:
Очевидный подход:
(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) и округлите до ближайшего целого числа.
Таким образом, первый шаг занимает линейное время (в большинстве моделей вычислений, хотя, возможно, не для некоторых моделей с недостаточной мощностью, таких как машины Тьюринга с одной головкой ), а остальные этапы должны быть полилогарифмическими.
источник
источник
Поэтому, используя дискретный логарифм и поднятие по Хензелю, я думаю, вы должны быть в состоянии вычислить из младших цифр очень эффективно. Другими словами, вы начинаете с вычисления с цифры , беря дискретный лог в основание по модулю ; это показывает и может быть сделано за время. Затем вы найдете дискретный логарифм к базе по модулю ; это показывает , и может быть сделано вnmodφ(5k) k 3n nmod4 3n 3nmod5 3 5 nmod4 O(1) 3nmod25 e 25 nmod20 O(1) время (используя знания , вам нужно попробовать всего возможностей). Итерация. На каждом этапе вы используете знания чтобы помочь вам эффективно вычислить дискретный журнал , используя тот факт, что есть только возможных значений для .nmod4 5 nmodφ(5k−1) 3nmod5k н мод φ ( 5 к )5 nmodφ(5k)
Теперь просто позвольте быть достаточно большим, и это показывает .нk n
Вам нужно выяснить, является ли время выполнения , но мне кажется, что это может быть. Я подозреваю, что достаточно, чтобы позволить , и я подозреваю, что вы можете выполнять каждую итерацию за время, всего .k = O ( n ) O ( 1 ) O ( n )O(n) k=O(n) O(1) O(n)
источник