• Aucun résultat trouvé

Informatique commune MPSI Thomas MEGARBANE

N/A
N/A
Protected

Academic year: 2022

Partager "Informatique commune MPSI Thomas MEGARBANE"

Copied!
10
0
0

Texte intégral

(1)

Informatique commune MPSI 2021–2022

Thomas MEGARBANE

(2)
(3)

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

(4)

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

(5)

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.

(6)

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 :

(7)

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.

(8)

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) ;

(9)

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.

(10)

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.

Références

Documents relatifs

Dans le cas où le test est assuré, la ou les instructions intercalées entre &#34;then&#34; et &#34;else&#34; sont exécutées et ce peut d'ailleurs être une autre instruction

[r]

Ce logarithme sera particulièrement adapté pour la manipulation des puissances de 10 et donc la manipulation des très grands et des très petits nombres décimaux. On l’utilisera

Th´ eor` eme 12 (existence et unicit´ e du projet´ e orthogonal d’un point sur une droite) : Soit D une droite de vecteur directeur − → u et soit A un point du plan?. Donner

NB : Cette trace écrite doit être brève et fonctionnelle pour l’élève Il évalue constamment les apprentissages par des exercices d’application Il remédie aux

Faire le crible d’Eratosthène, enregistré dans un dictionnaire : on commence avec comme clefs tous les entiers de 1 à n (fixé), et finalement on ne garde que les clefs qui sont

sexe et poste : deux variables de type caractère ('f' pour féminin, 'm' pour masculin; 'a' pour analyste, 'p' pour programmeur, 'o' pour opérateur).. numero : numéro de l'employé

On utilisera pour ce TP le serveur de bases de donn´ ees PostgreSQL accessible avec les param` etres (serveur, identifiant, mot de passe, base) donn´ es pendant la s´ eance.. Il est