Supposons que vous obtenez un nombre (en utilisant bits dans le codage binaire).
À quelle vitesse pouvez-vous trouver (ou déterminer qu'il n'existe pas)
Par exemple, étant donné l'entrée , on peut sortir .
Un algorithme naïf pour le problème passerait en revue toutes les valeurs possibles de et rechercherait une valeur de qui satisfasse la propriété.
Une observation simple est qu'il n'est pas nécessaire de vérifier des valeurs de inférieures à ou supérieures à . Cependant (même si nous ne pouvions vérifier que O (1) valeurs k possibles par valeur n ), cela aboutit à un algorithme inefficace qui est exponentiel dans la taille d'entrée.
Une approche alternative serait de passer en revue les valeurs possibles de (il suffit de vérifier ) et pour chaque vérification des valeurs possibles . On peut alors utiliser:
Donc, pour un k donné, il suffit de vérifier valeurs dans la plage , en utilisant la recherche binaire (lorsque est fixe, augmente de façon monotone dans ), cela donne un algorithme polynomial fonctionnant en .
Cela me semble toujours inefficace et je suppose que cela pourrait être résolu en temps linéaire (dans la taille d'entrée).
Réponses:
Il n'est pas vrai que(n−k)k<(nk) . Par exemple (92)=36<49=(9−2)2 .
Je n'ai pas (encore) trouvé de solution subtile utilisant les propriétés arithmétiques des coefficients binomiaux, mais je peux suggérer une solution quelque peu bruteforce si cela aide :-)
Vous pouvez, pour chaque , résoudre pour en faisant une supposition initiale (par exemple ) et en utilisant une méthode analytique telle que Newton-Raphson. Vous voulez résoudre . La dérivée du côté gauche par rapport à est où est la fonction digamma, qui est facile à calculer .k n k!⋅m−−−−−√k (nk)−m=0 n (ψ(n+1)−ψ(n−k+1))(nk) ψ
La complexité d'une recherche de Newton-Raphson dépend uniquement de la complexité du calcul de la fonction et de sa dérivée, et du nombre de chiffres requis pour la solution (dans notre cas, nous avons juste besoin de l'entier le plus proche).
Donc, globalement, pour chaque la recherche devrait être (en supposant, comme vous semblez l'avoir fait, que le calcul d'un coefficient binomial prend un temps constant), la complexité totale de l'algorithme utilisant vos bornes pour serait donc .k O(1) k O(log(m))
la source