Mon manuel dit: "Nous définissons la fonction comme suit: f ( 1 ) = 2 et f ( i + 1 ) = 2 f ( i ) 1.2 . Notez que étant donné n , nous pouvons facilement trouver dans O ( n 1,5 ) fois le nombre i tel que n soit pris en sandwich entre f ( i ) et f ( i + 1 . "
Comment puis-je me convaincre que nous pouvons en fait facilement trouver en temps O ( n 1,5 ) ? Comme f est défini récursivement, je pense que nous devons calculer f ( 1 ) , f ( 2 ) , f ( 3 ) … f ( j ) jusqu'à f ( j ) ≥ n . Afin de connaître le temps que prennent ces calculs, je pense que nous devons trouver une borne supérieure appropriée pour i dépendant de net nous devons trouver une borne supérieure sur le temps d'exécution de la fonction . En fin de compte, nous pouvons espérer montrer la proposition citée. Malheureusement, je ne vois ni une chose ni l'autre.
J'ai oublié de mentionner: veuillez noter que nous sommes dans un contexte non déterministe. Donc est supposé être calculable dans O ( n 1.5 ) par une machine de Turing non déterministe.
Étant donné que bon nombre de personnes ont déjà lu cette question, certaines d’entre elles la trouvant utile et intéressante également, mais personne n’a répondu jusqu’à présent, je souhaite fournir plus d’informations sur le contexte: la déclaration citée fait partie intégrante de la preuve de le théorème de la hiérarchie temporelle non déterministe. La preuve (avec la réclamation) peut être trouvée par exemple dans le livre d'Arora et Barak , mais j'ai trouvé pas mal d'autres ressources sur le Web qui présentent la même preuve. Chacun de ceux-ci appelle la revendication facile ou triviale et ne précise pas comment trouver en temps O ( n 1,5 ) . Donc, soit toutes ces ressources viennent d'être copiées depuis Arora et Barak, soit la revendication n'est en fait pas si difficile.
la source
Réponses:
Désigner par la longueur d'un nombre x , soit ⌊ log 2 x ⌋ + 1 (pour x > 0 ). Le calcul de 2 x nécessite le temps O ( x ) dans le modèle RAM, et donc le calcul de f ( i + 1 ) à partir de f ( i ) prend du temps O ( f ( i ) 1,2 ) = O ( | f|x| x ⌊log2x⌋+1 x>0 2x O(x) f(i+1) f(i) . Puisque f ( i ) croît plus rapidement que géométriquement, le temps global pour calculer f ( i + 1 ) est O ( | f ( i + 1 ) | ) . Comme vous le faites remarquer, vous devez le faire jusqu'à ce que f ( i + 1 ) ≥ n , ce qui signifie que f ( i ) < n . Par conséquent, la durée totale de fonctionnement estO(f(i)1.2)=O(|f(i+1)|) f(i) f(i+1) O(|f(i+1)|) f(i+1)≥n f(i)<n .O(|f(i+1)|)=O(f(i)1.2)=O(n1.2)
Dans le modèle de machine de Turing avec une seule bande, le calcul de prend le temps O ( x log x ) , et donc le temps de fonctionnement total est O ( n 1,2 log n ) = O ( n 1,5 ) . L'algorithme de calcul de 2 x remplace [ x ] par 1 [ [ x ] ] (ici [ x ] est la représentation binaire de x et [ [2x O(xlogx) O(n1.2logn)=O(n1.5) 2x [x] 1[[x]] [x] x est la représentation binaire utilisant différents chiffres 0 ′ , 1 ′ ), puis exécute à plusieurs reprises la transformation [ [ x ] ] ⟶ 0 [ [ x - 1 ] ] , ce qui prend du temps O ( | x | ) = O ( log x ) .[[x]] 0′,1′ [[x]]⟶0[[x−1]] O(|x|)=O(logx)
la source