Suponha que você esteja obtendo um número (usando bits na codificação binária).
Quão rápido você pode encontrar (ou determinar que isso não existe) ?
Por exemplo, dada a entrada , pode-se produzir .
Um algoritmo ingênuo para o problema examinaria todos os valores possíveis para e procuraria um valor de que satisfaça a propriedade.
Uma observação simples é que não há necessidade de verificar valores menores que ou maiores que . No entanto (mesmo se pudéssemos verificar apenas possíveis valores de por valor), isso termina em um algoritmo ineficiente que é exponencial no tamanho da entrada.
Uma abordagem alternativa seria revisar os possíveis valores de (basta verificar ) e, para cada verificação, os possíveis valores. Podemos então usar:
Portanto, para um determinado , precisamos apenas verificar valores no intervalo , ao fazer isso usando a pesquisa binária (quando é corrigido, está aumentando monotonicamente em ), isso fornece um algoritmo polinomial em execução em .
Isso ainda me parece ineficiente e acho que isso poderia ser resolvido em tempo linear (no tamanho da entrada).
Respostas:
Não é verdade que(n−k)k<(nk) . Por exemplo (92)=36<49=(9−2)2 .
Ainda não encontrei uma solução sutil usando propriedades aritméticas dos coeficientes binomiais, no entanto, posso sugerir uma força bruta, se isso ajudar :-)
Você pode, para cada , resolver adotando uma estimativa inicial (por exemplo, ) e usando um método analítico como Newton-Raphson. Você deseja resolver . A derivada do lado esquerdo em relação a é que é a função digamma, fácil de calcular .k n k!⋅m−−−−−√k (nk)−m=0 n (ψ(n+1)−ψ(n−k+1))(nk) ψ
A complexidade de uma pesquisa de Newton-Raphson depende apenas da complexidade da computação da função e de sua derivada e do número de dígitos necessários para a solução (no nosso caso, apenas precisamos do número inteiro mais próximo).
Portanto, para cada a pesquisa deve ser (assumindo, como você parece ter feito, que calcular um coeficiente binomial leva tempo constante); portanto, a complexidade total do algoritmo que usa seus limites para seria .k O(1) k O(log(m))
fonte