Informatique commune MPSI 2021–2022
Thomas MEGARBANE
Table des mati` eres
1 Repr´esentation des nombres 1
I Point de vue g´en´eral . . . 1 II Repr´esentation des entiers . . . 1 III Repr´esentation des flottants . . . 5
Chapitre 1
Repr´ esentation des nombres
I Point de vue g´ en´ eral
Le premier int´erˆet de la programmation est de pouvoir faire descalculssur ordinateur plus rapidement qu’`a la main. Et les calculs les plus ´el´ementaires sont ceux que l’on fait avec des nombres r´eels. Le probl`eme, c’est qu’il faut pouvoir d´efinir les nombres qu’on fait manipuler `a un ordinateur :
— les entiers ne posent pas de probl`eme : on se ram`ene `a des additions ou des soustraction it´er´ees de l’entier 1, qui est la brique ´el´ementaire des entiers ;
— les rationnels se ram`enent aux entiers ´egalement, en tant que quotient d’entiers ;
— pour les irrationnels, il y a deux cas :
— soit il est racine d’un polynˆome (`a coefficients entiers) : on parle alors de nombres alg´ebriques et on peut les travailler comme les entiers. Par exemple, pour√
2, on travaille dans l’ensemble : Q[√
2] ={a+√
2b|a, b∈Q} qu’on assimile `a Q2 avec l’addition et la multiplication suivantes :
(a, b) + (a′, b′) = (a+a′, b+b′) et (aa′+ 2bb′, ab′ +ba′)
et on se ram`ene donc `a l’addition et `a la multiplication sur les rationnels. L’id´ee derri`ere est que
√2 est racine du polynˆome X2−2, et donc d`es que l’on voit des √
22 on les remplace par 2, et on retombe dansQ.
Plus g´en´eralement, si αest racine du polynˆomeP de degr´en pourn∈N∗, pour faire des calculs avecα on va se ramen´e `a des calculs surQn muni de l’addition coordonn´ee par coordonn´ee, et d’une multiplication un peu ´etrange qui provient des coefficients de P.
— soit il n’est pas racine d’un polynˆome : et on ne peut plus faire de calculs exacts. Par exemple, si on veut travailler avecπ, on ne pourra pas bien multiplier les quantit´es, comme les puissances deπ ne sont pas reli´ees par des rationnels. On est oblig´es de faire des calculs approch´es, et tout l’enjeu est alors de d´eterminer les erreurs possibles pour en estimer les cons´equences.
II Repr´ esentation des entiers
Les entiers sont repr´esent´es de deux mani`eres dans les programmes :
— lespetits entiers: directement manipulable sans probl`eme de repr´esentation, qui sont cod´es par un nombre fix´e et fini de caract`ere, sous forme detableaux. Par exemple, sur un processeurs 64 bits, il s’agit des ´el´ements de J0,264−1K ou deJ−263; 263−1K (selon le choix du programmeur). Il y a un champ d’action limit´e (car on ne peut pas repr´esenter ainsi tous les entiers), mais les calculs sont tr`es rapides (que ce soit pour +,−,×et mˆeme la division euclidienne).
1
2 CHAPITRE 1. REPR ´ESENTATION DES NOMBRES
— lesgrands entiers: exprim´es dans une base choisie (par exemple en base 2 qui est la plus classique, en base 24 pour la repr´esentation hexad´ecimale, ou en base 264si on veut travailler avec des ´el´ements qui sont des petits entiers). Les entiers sont alors donn´es par des listes de petits entiers, appel´es digits. Les op´erations sont plus complexes, mais des entiers arbitrairement grands peuvent ˆetre repr´esent´es.
Et les deux notions sont li´ees, dans la mesure o`u les digits d’un grand entier sont des petits entiers, et `a l’inverse qu’un petit entier n’est rien d’autre qu’un grand entier dont on a bloqu´e la taille (d’o`u la pr´esence d’un tableau au lieu d’une liste).
II.1 Repr´ esentation suivant une base
Les entiers exprim´es dans une base donnent des calculs assez facile, avec des syst`emes de retenues (pour le produit ou pour l’addition), `a la mani`ere de ce qu’on fait en base 10 quand on pose une op´eration.
L’existence de l’´ecriture repose sur les r´esultats suivants :
Th´eor`eme-D´efinition II.1. Etant donn´´ e n ∈ N et b ∈ N avec b > 1, il existe une unique suite (ak) ∈ J0, b−1KN telle que :
n=
+∞
X
k=0
akbk.
La suite (ak) ainsi d´efinie est nulle `a partir d’un certain rang (en particulier la somme ci-dessus est finie, donc a bien un sens). Ses premiers termes forment l’´ecriture de n en base b, not´ee n(b). Plus pr´ecis´ement, si on note p∈N tel que : ∀k > p, ak = 0, alors :
n(b) =apap−1. . . a0.
D´emonstration. Pour l’existence et l’unicit´e, on peut voir que la suite (ak) est la suite d´efinie par :
— a0 est le reste de la division euclidienne de n par b;
— pour tout k∈N : ak+1 est le reste de la division euclidienne de n−Pk l=0albl
bk+1 par b.
La suite des (uk) =
n−Pk
l=0albl
k∈N
´
etant une suite d´ecroissante d’entiers naturels : elle converge (car d´ecroissante minor´ee par 0) et elle est stationnaire (car c’est une suite convergente d’entiers). Une r´ecur- rence imm´ediate montre que pour toutk∈N,uk est un multiple debk+1, donc sa limite est n´ecessairement nulle (soit par un argument d’ordre arithm´etique, soit en regardant la suite d’entiers de bk+1uk
qui est une suite d’entiers tendant vers 0 par op´erations sur les limites, donc stationnaire `a 0, et de mˆeme pour (uk)).
Corollaire II.2. Soit x∈Q avec x >0qui s’´ecrit de la forme : x= n
bm pourn, n∈N et b∈N avec b >1.
Alorsx s’´ecrit de mani`ere unique sous la forme :
x=
p
X
k=−m
akbk
o`u les ak sont dans J0, b−1K.
On dit alors que x(b) =apap−1. . . a0, a−1a−2. . . a−p est l’´ecriture de x en base b.
D´emonstration. On applique le r´esultat pr´ec´edent `an =x·bm ∈N.
Remarque II.3. Il y a des nombres rationnels privil´egi´es suivant le choix de b :
— si b= 10 : on retrouve les nombres d´ecimaux (et l’´ecriture est celle dont on a l’habitude) ;
— si b= 2 : on obtient les nombres dyadiques.
II. REPR ´ESENTATION DES ENTIERS 3 Plus g´en´eralement, un rationnel x = pq sous forme irr´eductible s’exprime bien en base b si, et seulement si, tous facteurs premiers deq divisentb. Par exemple, un nombre dyadique est aussi un nombre d´ecimal.
Exemple II.4. Choisissons n∈N et b∈N avec b >1. Pour d´eterminer l’´ecriture de n en base b, on peut reprendre la suite donn´ee dans le th´eor`eme, ce qui donnerait :
def base(n,b):
L=[]
if n<b:
L=[n]
else :
L=(base(n//b,b)) L.append(n%b) return L
Le probl`eme est qu’un telle m´ethode peut ˆetre tr`es longue, `a cause de la premi`ere division euclidienne.
Par exemple, sin = 10100 et b= 10, alors on va perdre beaucoup de temps `a calculer le reste de la division euclidienne de n par b, puis b2, etc., chaque calcul ´etant `a la fois long et inutile.
On pr´ef`ere donc raisonner `a l’envers :
— on d´etermine d’abord p;
— on calcule ap;
— on descend ensuite.
ce qui donne :
def base2(n,b) : B=1
L=[]
N=n
while n >= B : B*=b
while B!=1 : B=B//b q= N//B L.append(q) N=N-q*B return L
II.2 Entiers sign´ es sur des mots de taille fixe
Les petits entiers sont repr´esent´es dans des tableaux de taille finie : la structure “fixe” des tableaux laisse moins de libert´e que les listes (utilis´ees pour les grands entiers) mais permet des calculs plus rapides puisque, en imposant une m´emoire limit´ee, les calculs “digit par digit” peuvent se faire simultan´ement par un mˆeme processeur.
On fixe ici une taille n, ce qui veut dire qu’un entier est repr´esent´e par la chaˆıne bn−1. . . b0. En syst`eme binaire, lesbivalent tous 0 ou 1, ce qui permet d’avoir 2nentiers, et qu’on utilise en g´en´eral pour repr´esenter les entiers entre 0 et 2n−1.
Laconvention sign´ee change un peu la donne :
— bn−1 code pour le signe de l’entier (0 s’il est positif et −1 s’il est n´egatif) ;
— bn−2. . . b1b0 code pour la valeur absolue (avec l’´ecriture en base 2).
Ceci pose quelques probl`emes :
4 CHAPITRE 1. REPR ´ESENTATION DES NOMBRES
— l’entier 0 poss`ede deux ´ecritures : 10. . .0 et 00. . .0, et donc on “perd” un entier en cours de route (on de repr´esente que 2n−1 entiers au lieu de 2n, puisqu’on repr´esente en fait l’ensemble J−2n−1 + 1; 2n−1−1K;
— la soustraction et l’addition sont deux op´erations totalement diff´erentes, et doivent donc ˆetre cod´ees
`
a part l’une de l’autre.
Mais ceci cache une subtilit´e des entiers que l’on repr´esente : ils sont en fait connus modulo 2n. Donc on peut transposer nos calculs deJ−2n−1+ 1; 2n−1−1K`aJ0; 2n−1K, avec la convention du compl´ement `a2 :
— les nombres positifs s’´ecrivent comme avant de la forme 0bn−1. . . b1b0 (ce qui correspond `a l’´ecriture en base 2) ;
— un nombre n´egatifm est cod´e par l’´ecriture en base 2 de 2n+m: cette ´ecriture se d´eduit facilement l’´ecriture de |m|, puisque cela revient `a changer tous les chiffres de |m| (les 0 deviennent des 1 et inversement), puis on ajoute 1.
Exemple II.5. Si n= 5, c’est-`a-dire qu’on repr´esente les entiers avec4 chiffres (en base 2) :
— on code 7 = 0·24+ 0·23+ 1·22+ 1·21 + 1·20 par 00111;
— pour coder −4 : on code 25 −4 = 32−4 = 28 = 16 + 8 + 4 + 0 + 0 ce qui donne 11100. Si on reprend `a partir du code de 4, `a savoir 00100, alors : en inversant ce code on obtient 11011, puis en rajoutant 1 on obtient bien (avec les retenues) 11100.
Et alors l’addition et la soustraction se codent d’une seule mani`ere, avec un “passage `a l’oppos´e” quand on fait une soustraction. La seule chose `a laquelle il faut prendre garde est que les calculs ne sont v´erifi´es que
“modulo 2n” du fait du choix de repr´esentation.
Exemple II.6. Prenons n= 8 et codons 37−18 comme une addition :
— on code 37 = 0 + 32 + 0 + 0 + 4 + 0 + 1 et 18 = 0 + 0 + 16 + 0 + 0 + 2 + 0respectivement par00100101 et 00010010;
— on laisse 37 tel quel, et on d´etermine la repr´esentation de −18 `a l’aide de celle de 18 : on inverse les chiffres ce qui donne 11101101, puis on rajoute 1 pour obtenir : 1110110;
— on se retrouve `a poser l’addition suivante :
37 0 0 1 0 0 1 0 1
18 0 0 0 1 0 0 1 0
−18 1 1 1 0 1 1 1 0
37−18 0 0 0 1 0 0 1 1
o`u en th´eorie il y aurait un 1 `a rajouter au d´ebut de la premi`ere ligne, mais qui disparaˆıt comme on fait nos calculs modulo 2n, alors que ce 1 correspondrait justement `a rajouter 2n.
II.3 Entiers multi-pr´ ecision en Python
Les entiers dans Python sont repr´esent´es (par d´efaut) comme des grands entiers : toutes les op´erations doivent ainsi prendre en compte la taille des entiers (c’est-`a-dire le nombre de digits pour les ´ecrire dans la base choisie, qui est un petit entier). Et ainsi leur temps de calculs d´epend de la taille des entiers consid´er´es.
Ce n’est pas le cas pour les entiers de petite taille, o`u on peut voir que toutes les op´erations se font par des boucles forde mˆeme taille (donc toutes les complexit´es sont les mˆemes).
On fixe b > 1 un entier qui d´esignera l’entier dans la base duquel Python fait ses calculs. On consid`ere n, m∈N, de tailles respectives p etq, c’est-`a-dire que :
n=
p
X
i=0
nibi etm =
q
X
j=0
mjbj
o`u les ni, mj sont des petits entiers.
Proposition II.7. Avec les mˆemes notations, on a : p = ⌊logb(n)⌋. Donc la taille de n en base b est :
⌊logb(n)⌋+ 1.
III. REPR ´ESENTATION DES FLOTTANTS 5 D´emonstration. On anp ̸= 0, donc on d´eduit l’encadrement : bp ≤n < bp+1. Et en appliquant lnb (qui est strictement croissante comme b >1) : p≤logb(n)< p+ 1, ce qui donne bien l’´egalit´e par d´efinition de la partie enti`ere.
Et la taille est le nombre de digits de n, donc p+ 1.
Proposition II.8. Avec les mˆemes notations, on a :
n+m=
max(p,q)
X
k=0
(nk+mk)·bk et n×m=
p+q
X
k=0
X
i+j=k
nimj
! bk
o`u on a compl´et´e les suites des chiffres par des 0 pour qu’elles soient bien d´efinies pour tous les indices suppl´ementaires qui apparaissent ci-dessus.
Remarque II.9. Le point important est que les ´ecritures ci-dessus sont un passage oblig´e, mais ne sont pasles ´ecritures en base b. Car rien de dit que les les (nk+mk) ou les
P
i+j=knimj
soient des entiers de J0, b−1K. On a donc un probl`eme de retenue `a prendre en compte quand on ´ecrit les algorithmes.
Proposition II.10. Si on consid`ere que l’addition et la multiplications avec les petits entiers ont des com- plexit´es de 1, alors :
— la complexit´e de l’addition est de l’ordre de max(p, q);
— la complexit´e de la multiplication “na¨ıve” pr´ec´edente est de l’ordre de p×q.
D´emonstration. Il suffit de compter le nombre d’op´erations ´el´ementaires :
— pour l’addition : il y a max(p, q) additions de petits entiers, puis au plus max(p, q) soustractions et additions pour g´erer les retenues ; donc au plus 3×max(p, q) additions ;
— pour la multiplication : on pr´ef`ere calculer la complexit´e en utilisant l’´ecriture : n×m=
p
X
i=0 q
X
j=0
nimjbi+j
qui donne au plus (car il y a ´eventuellement des termes nuls) (p+ 1)(q+ 1) multiplications, et autant d’additions, ce qui donne le r´esultat (aux corrections pr`es sur les retenues, mais qui sont de l’ordre de p+q).
Remarque II.11. Pour la multiplication, il y a d’autres m´ethodes plus efficaces qui permettent d’abaisser la complexit´e en calculant astucieusement certains termes. Les plus connues reposent sur des d´ecoupages ha- biles de sommes (la m´ethode de Karatsuba) ou alors des syst`emes de divisions euclidiennes puis remont´ees (avec la transform´ee de Fourier rapide,abr´eg´ee en FFT).
III Repr´ esentation des flottants
III.1 L’impossibilit´ e de repr´ esenter tous les nombres
Les autres nombres que les entiers (ou les nombres qui s’y ram`enent, comme les rationnels ou les nombres alg´ebriques) peuvent ˆetre manipul´es de mani`ere exacte dans les calculs. Mais il y a en fait un double probl`eme li´e `a cela :
— d´ej`a cela a un certain coˆut de manipuler de mani`ere exacte des nombres : un coˆut de m´emoire
´
evidemment (par exemple pour stocker un rationnel on doit stocker 2 entiers, qui peuvent vite devenir grands, pour une racine d’un polynˆome de degr´e n on manipule n rationnels `a chaque
´
etape), et un coˆut de calcul (les op´erations usuels demandent de nombreux calculs auxiliaires et prennent beaucoup plus de temps) ;
6 CHAPITRE 1. REPR ´ESENTATION DES NOMBRES
— et ensuite car ils ne repr´esentent que tr`es peu de nombres : l’infinit´e des nombres rationnels ou alg´e- brique est infiniment plus petite que celle des autres nombres (on parle d’ensembles d´enombrables, et d’ensemble non d´enombrable ayant la puissance du continu).
De fait, il est raisonnable de chercher une autre mani`ere de repr´esenter tous les nombres, qui ne pourra donc se faire de mani`ere exacte.
D´efinition III.1. On appelle nombre flottant ou nombre `a virgule flottante un nombre de la forme : x=s×m×be
o`u :
— s est le signe (±1) ;
— m est la mantisse (dont les formes peuvent varier) ;
— e est l’exposant (qui est un entier) ;
— b est la base (dans laquelle sont faits les calculs, souvent2 ou 10).
Remarque III.2. La mantisse peut avoir des formes tr`es variables, mais il s’agit le plus souvent d’un entier, ou d’un nombre de l’intervalle[1;b[ (cod´e en base b, ´eventuellement arrondi).
Dans le second cas, on parlera de virgule flottante normalis´ee : par exemple, si b = 10, c’est ce qui correspond `a la notation scientifique
III.2 Repr´ esentation de flottants sur des mots de taille fixe
Repr´esenter des flottants sur des mots de taille fixe, c’est se fixer des limites sur la m´emoire qu’on alloue pour repr´esenter un nombre. Il s’agit surtout de calibrer la m´emoire allou´ee aux composants informatiques utilis´es pour que les calculs soient optimis´es.
Exemple III.3. Si on raisonne en base 2, et qu’on d´ecide de repr´esenter des flottants par des mots de taille n, alors on fixe :
— un caract`ere pour le signe ;
— n1 caract`eres pour la mantisse : un dyadique `a n1 chiffres apr`es la virgule de [1,2[;
— n2 caract`eres pour l’exposant : un entier entre −2n2−1+ 1 et 2n2−1−1; avec 1 +n1+n2 =n.
Et on repr´esente ainsi tous les nombres dyadiques poss´edant au plusn1+1chiffres non nuls, n´ecessairement cons´ecutifs, dont la valeur absolue est comprise entre 2n2
On va donc en pratique arrondir un r´eel au dyadique le plus proche parmi ceux qui sont repr´esentables.
On a alors le probl`eme de repr´esentation de 0, qui est g´en´eralement repr´esent´e par la plus petite mantisse et le plus petit exposant, donc dans notre cas on a :
0 = ± 1,00. . .00
| {z }
´ecriture en base2
×2−2n2−1+1.
Remarque III.4. Si on raisonne en base10, et qu’on garde le mˆeme type d’encodage, on retrouve l’´ecriture scientifique avec n1 chiffres significatifs (donn´es par la mantisse).
Remarque III.5. Avec des petites astuces de convention, on peut repr´esenter davantage de nombres avec des mots de mˆeme taille : on parle alors de nombres d´enormalis´es. On peut par exemple rajouter des notations pour repr´esenter ±∞ en leur r´eservant par exemple le plus grand exposant possible.
III.3 Limites des calculs en flottants
Il y a un double probl`eme avec le calcul en flottants sur mots de taille fixe : on ne peut pas repr´esenter tous les nombres, et les calculs sont approch´es.
III. REPR ´ESENTATION DES FLOTTANTS 7
— certains nombres ne peuvent ˆetre repr´esent´es (des nombres trop grands ou trop petits), et on peut se retrouver `a des d´ebordements (ou overflows) quand le r´esultat d’une op´eration est trop grand ou des sous-passements (ou underflows) lorsqu’ils sont trop petits ;
— on y perd en pr´ecision, car des nombres diff´erents seront repr´esent´es d’une mˆeme mani`ere, et on peut par exemple se trouver avec des cancellations(des soustractions de deux nombres tr`es grands et tr`es proches qui peuvent donner des valeurs nulles) ou des absorptions(des additions de nombres d’ordre de grandeur diff´erents qui font disparaˆıtre le nombre le plus petit).
Selon les conventions choisies, on peut se pr´evenir de trop grandes erreurs avec la d´efinition de NaN(”not a number”) qui peut ˆetre la sortie d’une op´eration interdite (du type une division par 0), et qui, `a d´efaut de donner un r´esultat qui devrait ˆetre erron´e, dit qu’il n’y a pas de r´esultat fiable `a une op´eration.
Proposition III.6. L’addition sur les flottants n’est pas associative.
D´emonstration. Par exemple avec une repr´esentation en base 2 avec une mantisse `a 20 chiffres : 1 + 2100 = 2100. Et donc :
(1 + 2100)−2100= 2100−2100 = 0 1 + (2100−2100) = 1 + 0 = 0
Remarque III.7. Ainsi, pour calculer des sommes ou des diff´erences en flottants, il faut commencer par regrouper ensemble les petits termes, pour ˆetre sˆur qu’ils ne soient pas absorb´es par les plus grands trop vite.
Proposition III.8. On ne peut estimer num´eriquement des approximations de formes ind´etermin´ees avec des flottants.
Exemple III.9. Prenons un calcul du type 00 fr´equent en calcul num´erique : le calcul d’une d´eriv´ee par limite de taux d’accroissement du type f(x+h)−f(x)
h . Alors on a deux probl`emes li´es aux arrondis :
— pour h trop petit, son approximation comme flottant sera h= 0, et le calcul ne sera pas faisable ;
— mˆeme s’il est faisable, les arrondis du num´erateurs pourront conduire `a des ´el´ements absorbants et donner de nombreuses erreurs.
Remarque III.10. Il y a en principe deux m´ethodes pour ´eviter ce genre de probl`emes :
— utiliser des techniques de calcul litt´eral : on simplifie alors les expressions pour lever les ind´eter- minations en amont des applications num´eriques pour limiter les erreurs dues `a l’utilisation de flottants ;
— accepter son destin, mais en avoir conscience : estimer pr´ecis´ement les erreurs, et surtout les r´epercussions d’erreurs.