Les gens jouent un peu vite et perdent avec la notation big-O. Dans le cas de GCD, ils le font généralement de 2 façons:
1) Vous avez raison, la complexité algorithmique, et donc la notation O-Big, doit être exprimée en termes de taille dans les bits de l'entrée , pas en termes de valeurs de l'entrée. C'est ainsi que P, NP et ainsi de suite sont définis. En supposant que l'entrée binaire et arbitrairement-grands nombres (comme une représentation BigNum), et N le nombre de bits d'entrée, votre GCD nécessite au plus 2^N soustractions, dont chacune nécessite un temps O (N) pour parcourir chaque chiffre de la les nombres étant soustraits. Donc c'est O (N * 2^N). GCD peut bien sûr être fait beaucoup plus rapidement si vous utilisez la division plutôt que la soustraction: O (N^2). Donc, quand nous disons que testing primality was proved in 2002 to be done in polynomial time, c'est la définition technique de la complexité, et nous voulons dire polynomial dans le nombre de chiffres (qui est la partie difficile), pas polynomial dans le nombre d'entrée lui-même (qui est trivialement facile à faire en "temps sous-linéaire" en utilisant la division d'essai). En pratique, pour les algorithmes qui prennent un nombre fixe d'entrées entières, il est plus pratique de parler de complexité comme si N était l'entrée elle-même, pas la taille de l'entrée. Ce n'est pas dangereux tant que vous comprenez ce que vous voulez dire dans les cas qui peuvent être ambigus.
2) En pratique, les entrées entières sont souvent de taille fixe, 32 bits ou autre, et leurs opérations telles que l'addition, la multiplication et la division sont O (1). Nous utilisons ces faits de manière sélective dans notre analyse d'ordre. Techniquement si votre programme GCD n'accepte que les entrées jusqu'à (2^32-1), alors c'est O (1). Il a une limite supérieure fixe sur son temps de fonctionnement. Fin de l'analyse
Bien que techniquement correct ce n'est pas une analyse très utile. Presque tout ce que vous faites sur un vrai ordinateur est O (1) sur la même base, que la taille du problème est limitée par le matériel.
Il est généralement plus pratique d'accepter que l'addition est O (1) parce que les nombres sont de taille fixe, mais ignorer que GCD est aussi O (1), prétendre que son comportement est dans la plage [1, 2^32) s'étend à l'infini et l'analyse sur cette base. Alors avec N le maximum des deux entrées, il en résulte des soustractions O (N): O (N), chacune prenant un temps constant. Encore une fois, cela n'est pas ambigu une fois que vous connaissez les termes de référence, mais méfiez-vous de comparer incorrectement la première analyse de l'algorithme d'Euclide avec division, O (N^2), avec cette analyse de l'algorithme avec soustraction, O (N). N n'est pas le même dans chaque, et la soustraction est pas plus rapide ;-)
veuillez lire les questions SO existantes + réponses sur ce sujet. –
Votre code, BTW, trouve le diviseur commun le plus grand ** (gcd), également connu sous le nom de facteur commun le plus élevé (hcf). Le «plus petit dénominateur commun» d'un ensemble de fractions est le moins commun ** multiple ** des dénominateurs, ce qui est autre chose. [Pour deux entiers x et y, nous avons lcm (x, y) = xy/gcd (x, y).] – ShreevatsaR
ShreevatsaR, merci, je l'ai changé. L'anglais n'est pas ma langue maternelle, donc je n'étais pas sûr de savoir comment ça s'appelle. –