Я шукаю ефективний алгоритм для проблеми:
Введення : додатне ціле число (зберігається як біти) для деякого цілого числа .
Вихід : Число .
Запитання : Чи можемо ми обчислити з бітів за час?
Це теоретичне запитання, мотивоване моєю відповіддю на математичне запитання. Як знайти формулу цього біекція? . У цьому питанні автор хотів знайти бісекцію з та натуральні числа . Я запропонував як рішення. Інша відповідь там стверджує, що "немає простої формули", що змушує мене замислитися, наскільки (обчислювально) просте моє запропоноване рішення.
З моїм запропонованим рішенням, якщо ми знаємо і , ми можемо легко обчислити (записати двійкові цифри наступним а потім нулями). Це займає час .
Знаходження з бітів означає знаходження найменш значущого біта (який можна обчислити підрахунком правильних зрушень бітів, залишивши в пам'яті ). Це займає час.2 m 3 n 3 n O ( м )
Однак нам також потрібно знайти , що може бути складніше. Можна було б знайти , повторно ділившись на , але це здається марнотратним. Для цього потрібно операцій поділу, кожна з яких займе час , тому в цілому це час . [Власне, після кожної ітерації кількість цифр лінійно зменшиться, але це все одно призводить до часу .]n 3 n O ( n ) O ( n 2 ) O ( n 2 )
Схоже, ми повинні мати можливість використовувати, знаючи, що вхід - це сила .