Cours issu de : http://tnsi.free.fr/ (lycée louis de Foix)
Entiers relatifs (signés), codés en complément à deux.
Le schéma de gauche associe à chaque nombre en binaire codé sur 4 bits sa valeur décimale. Dans le schéma de droite, on s’intéresse aux nombres codés sur 8 bits.
Les entiers standards de Python ne sont pas limités en taille (autrement que par la mémoire disponible).
Dans la plupart des langages (C/C++, Java, PHP…), les entiers sont codés sur un nombre donné de bits. On peut parfois distinguer les entiers signés des entiers non signés.
La bibliothèque numpy permet de manipuler les différents types d’entiers (import numpy as np).
• np.uint8 : entier non signé codé sur 8 bits (de 0 à 255)
• np.int8 : entier signé codé sur 8 bits (de – 128 à 127)
• np.uint32 : entier non signé codé sur 32 bits (de 0 à 4 milliards environ)
• np.int32 : entier signé codé sur 32 bits (de – 2 milliards à 2 milliards environ)
On dispose également des entiers codés sur 16 bits, 64 bits.
Vous testerez dans la console :
np.uint8(200)
np.int8(200)
np.int8(127)
np.int8(128)
np.int8(100) + np.int8(50)
Écriture binaire d’un entier positif
Écrire les nombres suivants en binaire et indiquer leur taille en bits.
14, 32, 43, 113, 128, 255, 400, 1315
Correction :
14 = 8 + 4 + 2 = (1110)2 → 4 bits
32 = 25 = (100000)2 → 6 bits
43 = 32 + 8 + 2 + 1 = (101011)2 → 6 bits
113 = 64 + 32 + 16 + 1 = (1110001)2 → 7 bits
128 = 27 = (10000000)2 → 8 bits
255 = (11111111)2 → 8 bits
1315 = 1024 + 256 + 32 + 2 + 1 = (10100100011)2 → 11 bits
« Définition NSI »
Le logarithme binaire, ou logarithme de base 2 d’un entier positif n est (approximativement) le nombre de chiffres dans l’écriture binaire de n.
Définition mathématique (la vraie)
On appelle logarithme de base 2 d’un réel strictement positif x le nombre noté log2 𝑥 = ln𝑥 / ln2. ln correspond au logarithme népérien.
Exemples
log2 14 ≈ 3,8
log2 32 = 5
log2 43 ≈ 5,4
log2 113 ≈ 6,8
log2 128 = 7
log2 255 ≈ 7,99
log2 1315 ≈ 10,4
Quelques propriétés
Pour tout entier naturel 𝑛, log2 2𝑛 = 𝑛
Pour tous entiers naturels 𝑘 et 𝑛, 𝑛 = 2𝑘 ⇔ 𝑘 = log2 𝑛
De plus, la fonction logarithme de base 2 étant strictement croissante, si 2𝑛 ≤ 𝑥 < 2𝑛+1 , alors 𝑛 ≤ log2 𝑥 < 𝑛+1
Lien avec la « définition NSI »
Le nombre de chiffes dans l’écriture binaire d’un entier positif n, qui correspond à sa taille en bits, est égal à ⌊log2 n⌋ + 1. (⌊ ⌋ représente la partie entière inférieure.)
Exemple :
Déterminons le nombre de chiffres de l’écriture binaire de 851.
512 ≤ 851 < 1024
Comme 512 = 29 et 1024 = 210, on a :
9 ≤ log2 851 < 10, donc l’écriture binaire de 851 comporte 10 chiffres.
En NSI, le logarithme en base 2 sert uniquement comme outil de comptage dans les calculs de complexité.
Exemple :
évaluation de complexité de la recherche dichotomique
def recherche_dicho(liste, x):
a,b = 0, len(liste) - 1
while b >= a:
c = (a + b)//2
if liste[c] == x:
return c
elif liste[c] < x:
a = c + 1
else:
b = c - 1
return - 1
On peut d’abord remarquer que le programme se termine bien puisque a et b sont deux entiers, et qu’à chaque étape, ou bien a croit, ou bien b décroit, et que la
boucle s’interrompe dès que b > a.
Soit n la longueur de la liste.
À l’exception de l’instruction while, toutes les opérations effectuées sont des affectations ou tests en temps constant. On doit juste estimer le nombre
maximum d’exécutions de la boucle while.
À chaque exécution de la boucle, la longueur de la liste est divisée par 2 (un peu plus même puisqu’on exclut une extrémité).
Dans le pire des cas (valeur cherchée non trouvée), la dernière exécution de la boucle se produit lorsque la liste est de longueur 1.
Or, 𝑛 / 2𝑘 ≈ 1 ⇔ 𝑛 ≈ 2𝑘 ⇔ 𝑘 ≈ log2 𝑛
Ainsi, dans le pire des cas, la boucle s’exécute log2 𝑛 fois.
La complexité de la recherche dichotomique dans une liste triée de longueur 𝑛𝑛 est donc en 𝑂(log2 𝑛).
Les graphiques ci-dessous montrent, avec différentes échelles, la croissance comparée des principales fonctions intervenant dans l’expression de la
complexité d’un algorithme.
Un algorithme avec une complexité exponentielle ne posera aucun problème sur des entrées de petites tailles (si n = 4 par exemple), mais risque de devenir inutilisable lorsque la valeur de n augmente.
Un algorithme avec une complexité en O(n log2 n) sera beaucoup plus rapide qu’un algorithme en O(n2) sur des entrées de grande taille.