Académique Documents
Professionnel Documents
Culture Documents
I. Puissances entières
I.1. Définition, calcul naïf
⟐ Définition 1
• Pour un nombre réel 𝑥 et pour un nombre entier naturel 𝑛 > 0, la puissance 𝑛-ème de 𝑥 est le nombre
noté 𝑥𝑛 et défini par le produit de 𝑥 par lui-même 𝑛 fois : 𝑥𝑛 = ⏟⏟⏟⏟⏟⏟⏟
𝑥 × ⋯ × 𝑥.
𝑛 facteurs
• Si 𝑛 = 0, on aura pour 𝑥 ≠ 0, 𝑥 = 1. Par convention, on pose souvent 00 = 1.
0
1
• Enfin 𝑥−𝑛 n’est défini que si 𝑥 ≠ 0 et est l’inverse de la puissance 𝑛-ème de 𝑥 : 𝑥−𝑛 = .
𝑥𝑛
⊛ Illustration 1
En utilisant cette méthode, on calcule les puissances de proche en proche.
Étapes 20 21 22 23 24 25 26 27
Calculs 1 2 × 1 = 2 2 × 2 = 4 2 × 4 = 8 2 × 8 = 16 2 × 16 = 32 2 × 32 = 64 2 × 64 = 128
On a donc calculé 21 → 22 → 23 → 23 → 24 → 25 → 26 → 27 .
⊛ Illustration 2
On peut se servir de cette propriété pour limiter le nombre de puissances calculées :
2
27 = 2 × 26 = 2 × (23 )
2 2 2
27 = 2 × (2 × 22 ) = 2 × (2 × (21 ) ) .
Au lieu de calculer toutes les puissances 20 ; ⋯ ; ⋯ ; 26 pour obtenir 27 , on va calculer
21 → 22 → 23 → 26 → 27 .
Algorithme récursif de puissances :
def puiss_r(x, n):
assert type(n) == int and type(x) == float or int
if n == 0: Commentaires
return 1
if n > 0: 1. Bloc conditionnel 2 : cas exposant positif :
if n%2 == 0: (a) si l’exposant est pair, on le « coupe en deux » :
y = puiss_r(x, n/2) 26 = 23 × 23 ;
return y*y
return x*puiss_r(x, n-1) (b) sinon, il est impair et on isole juste un facteur pour
return 1/puiss_r(x, -n) avoir un autre facteur d’exposant pair : 27 = 2 × 26 .
2. La dernière ligne traite le cas des exposants négatifs.
Remarques sur ce deuxième algorithme
• L’algorithme est dit récursif car la sortie de la fonction fait appel à la fonction elle-même (par exemple :
return x*puiss_r(x, n-1)).
• Le gain en nombres de multiplications à effectuer repose sur if n%2 == 0:
la partie : y = puiss_r(x, n/2)
Cette stratégie est appelée « diviser pour régner ». return y*y
Étape 21 3 4 5
3 17 577 665 857
Largeur exacte 𝑟 2
2 12 408 470 832
Valeur approchée de 𝑟 2 1,5 1,4166... 1,414 215 686 274 5099... 1,414 213 562 374 6899...
886 731 088 897
L’étape 6 donnerait 627 013 566 048
≈ 1,414 213 562 373 095 1454.
Pour comparer : √2 ≈ 1,414 213 562 373 095 0488. Python donne : sqrt(2) : 1.4142135623730951
def rac(x):
assert x >= 0
L’idée reste la même : pour un rectangle de largeur 𝑟, si son
r, s = x, 1
aire vaut 𝑥, alors sa largeur vaut 𝑥𝑟 . La prochaine largeur sera
while abs(r-s) >= 1e-15:
s = r donc la moyenne 12 (𝑟 + 𝑥𝑟 ).
r = 1/2*(r + x/r)
return r
1 𝑎
La démonstration repose sur la converge monotone, la fonction ϕ𝑎 ∶ 𝑥 ↦ 2 (𝑥 + 𝑥 ) étant croissante sur
[√𝑎 ; 𝑎], on montre par récurrence que pour tout nombre entier naturel 𝑛 : √𝑎 ⩽ 𝑟𝑛 ⩽ 𝑟𝑛+1 ⩽ 𝑎.
‡ Proposition 5
𝑟0 = 𝑎
La vitesse de convergence de la suite 1 𝑎 est quadratique : pour tout nombre entier
{𝑟𝑛+1 = 2 (𝑟𝑛 + 𝑟𝑛 )
naturel 𝑛, |𝑟𝑛 − √𝑎| ⩽ 21𝑛 |𝑎 − √𝑎|.
Par conséquence, la précision de la valeur approchée est bien doublée à chaque nouveau terme.
1
La démonstration repose sur le fait que la fonction ϕ𝑎 est contractante : comme |ϕ′𝑎 (𝑥)| ⩽ 2
pour 𝑥 > 0, pour
1
𝑎 > 0 et 𝑏 > 0, |𝑓 (𝑏) − 𝑓 (𝑎)| ⩽ 2
|𝑏 − 𝑎|. Une récurrence donne alors l’inégalité attendue en remarquant que
Remarque : la notation originelle de la fonction l ou l. est devenue log ou Log. Une norme de 1961 a imposée
la notation ln : les premiers langages informatiques avaient néanmoins implémenté cette fonction avec log,
notation que l’on retrouve encore de nos jours. Pour ajouter à la confusion, log s’est imposé comme notation
ln(𝑥)
pour le logarithme décimal : log(𝑥) = ln(10) et qui est souvent implémenté avec la notation log10.
III.2. Intérêt historique des logarithmes
‡ Proposition 6 : relation fonctionnelle de ln
Pour tous nombres réels 𝑎 > 0 et 𝑏 > 0, ln(𝑎𝑏) = ln(𝑎) + ln(𝑏).
On en tire les relations ln ( 𝑎𝑏 ) = ln(𝑎) − ln(𝑏) et ln (𝑎𝑏 ) = 𝑏 ln(𝑎).
Apparu au milieu XVIIe siècle, les logarithmes ont permis un gain en terme d’efficience en calculs.
⊛ Illustration 4
En disposant d’abaques de logarithmes (qui donnent des valeurs de ln(𝑎) en fonction de 𝑎), on peut sim-
plifier certains calculs fastidieux.
• Pour réaliser le produit 1234 × 5678 :
∗ On cherche dans l’abaque les logarithmes des deux facteurs :
ln(1234) ≈ 7,118 016 et log(5678) ≈ 8,644 354.
∗ Comme ln(1234 × 5678) = ln(1234) + ln(5678), on fait la somme des logarithmes :
7,118 016 + 8,644 354 = 15,762 370.
∗ On cherche la valeur dans le logarithme vaut 15,762 370 : on trouve 7 006 648.
∗ On peut comparer l’erreur commise : 1234 × 5678 = 7 006 652 soit une erreur relative de 5 × 10−7 .
1
• Pour réaliser l’extraction 5678 9 :
∗ On cherche dans l’abaque le logarithmes de l’exposé : log(5678) ≈ 8,644 354.
1
1
∗ Comme ln (5678 9 ) = 9
ln(5678), on effectue la division 8,644 354 ÷ 9 ≈ 0,960 48378.
∗ On cherche la valeur dans le logarithme vaut 0,960 48378 : on trouve 2,612 960.
1
∗ On peut comparer l’erreur commise : 5678 9 ≈ 2,612 960, donc conforme à 10−6 près.
⊛ Illustration 5
Cette approximation n’est pertinente que sur un intervalle d’amplitude limité autour de 1.
• ln(1,01) ≈ 0,009 950 vs 1,01 − 1 = 0,01 : erreur relative de 5 × 10−3 .
• ln(1,000 000 005 164 349) ≈ 0,000 000 005 164 349 vs 1,000 000 005 164 349 − 1 = 0,000 000 005 164 349.
Commentaires :
Algorithme de Briggs
L’idée de l’algorithme est de tirer profit de l’approximation
𝑥 ≈ 1 ⇒ ln(𝑥) ≈ 𝑥 − 1.
from math import sqrt
def logn(x): On calcule n fois la racine carrée de 𝑥 : cette succession
assert x > 0 de racines carrées assure de trouver une valeur proche de 1.
r = x C’est l’objet de la boucle conditionnelle.
n = 0
while abs(r-1) > 1e-8: À l’issue de cette boucle, r est assez proche de 1 pour que
r = sqrt(r) son logarithme soit calculé par r-1 dans la sortie.
n = n + 1
return (r-1) * 2**n L’identité ln (√𝑥) = 12 ln(𝑥) implique que les n calculs de
racine carrée reviennent à diviser le logarithme par 2𝑛 : on
compense en multipliant par 2𝑛 dans la sortie.
III.3.1. Comparaison d’efficacité
En important la fonction log, on teste la validité de cet algorithme.
for k in range(10, 101, 10):
print(log(k), logn(k), abs(log(k)-logn(k)))
2.302585092994046 2.3025850653648376 2.762920825460924e-08
2.995732273553991 2.995732307434082 3.388009117699653e-08
3.4011973816621555 3.4011974334716797 5.1809524226342774e-08
3.6888794541139363 3.6888794898986816 3.578474538912246e-08
3.912023005428146 3.9120230674743652 6.204621927352605e-08
4.0943445622221 4.09434449672699 6.549511066822333e-08
4.248495242049359 4.2484952211380005 2.091135886672646e-08
4.382026634673881 4.382026672363281 3.7689400045337607e-08
4.499809670330265 4.499809622764587 4.756567761887709e-08
4.605170185988092 4.605170130729675 5.525841650921848e-08
Les meilleures approximations (ici de l’ordre de 10−8 par rapport à la fonction pythonesque) sont obtenues avec
la condition de boucle abs(r-1) > 10**-8.
Piste d’explication : si r est « trop » proche de 1, la perte en chiffres significatifs de r-1 entraîne les erreurs.
III.3.2. Approche analytique
On est assuré que la condition de boucle renverra False en un nombre fini d’étapes par la proposition suivante.
‡ Proposition 8
𝑢0 = 𝑥 > 0
La suite définie par converge de manière monotone vers 1 (décroissante si 𝑢0 > 1,
{𝑢𝑛+1 = √𝑢𝑛
croissante si 0 < 𝑢0 < 1).
La fonction 𝑥 ↦ √𝑥 est croissante sur [0 ; +∞[ et 0 < 𝑥 < 1 ⇒ 𝑥 ⩽ √𝑥 alors que 𝑥 > 1 ⇒ √𝑥 ⩽ 𝑥.
Une récurrence montre alors le caractère monotone et borné par le premier terme et 1. La convergence monotone
permet alors de conclure. Quant à la limite, comme elle vérifie ℓ = √ℓ, ℓ = 1.
Les algorithmes, les abaques de racine carrée étant connues et utilisées à l’époque de Napier et Briggs font que
la mise en œuvre de calculs itérés de racine carrée n’était pas un obstacle. Des abaques de logarithme ont donc
été « rapidement » mises au point.
def logC(x):
assert x > 0
memm = [2.302585092994046, 0.6931471805599453, 0.09531017980432493,
0.009950330853168092, 0.0009995003330834232, 9.999500033329732e-05,
9.999950000398841e-06, 9.999994999180668e-07, 9.999999505838704e-08,
9.999999889225291e-09, 1.000000082240371e-09, 1.000000082690371e-10,
1.0000000827353709e-11, 1.000088900581841e-12, 9.992007221625909e-14,
9.992007221626358e-15, 1.110223024625156e-15]
p, xx = 0, x
if x < 1: Commentaires
return -logC(1/x)
while xx > 10: Le programme est composé d’un bloc conditionnel, d’une
xx = xx / 10 boucle conditionnelle et d’une boucle d’itération.
p = p + 1 1. Bloc conditionnel : ramène le calcul de ln(𝑥) pour 𝑥 < 1 à
y = (p+1) * memm[0] − ln ( 𝑥1 ) (meilleure précision).
for k in range(16):
z = 1 + 10**-k 2. Boucle conditionnelle : détermine la valeur p de l’exposant
while xx*z <= 10: dans la notation scientifique 𝑚 × 10𝑝 .
xx = xx * z 3. Bloc itératif : pour chaque valeur 𝑘, on cherche à trouver :
y = y - memm[k+1] • le plus petit entier 𝑘 tel que 2𝑘 ⩽ 10
𝑥
⩽ 2𝑘+1 ;
return y
• puis le plus petit entier 𝑘 tel que 1,1𝑘 ⩽ 10
𝑘1 ⩽ 1,1
𝑘+1
;
2 𝑥
• et ainsi de suite.
4. Le logarithme cherché se détermine par combinaison li-
néaire des valeurs 𝑘 associées aux logarithmes de la mé-
moire morte.
III.5. Comparaison d’efficacité
IV. Exponentielle
IV.1. Définition
⟐ Définition 4
𝑦′ = 𝑦
La fonction exponentielle est l’unique fonction 𝑦 solution du problème de Cauchy .
{𝑦(0) = 1
‡ Proposition 10
On peut évaluer pour ℎ « petit » : exp(ℎ) ≈ (1 + ℎ).
Pour une valeur 𝑥, et pour ℎ fixé, on a avec 𝑛 = ⌊ ℎ𝑥 ⌋, exp(𝑥) ≈ (1 + ℎ)𝑛 .
En terme d’erreur relative, la version proposée ne diffère pas significativement de la fonction native de Python
(erreur proche de 10−16 ).
L’algorithme natif de Python est plus performant :
• pour une valeur de l’intervalle [709 ; 709,8[ où il donne une valeur (au-delà, il donnera aussi inf) ;
• pour une valeur de l’intervalle [−745 ; −709[ où il donne des valeurs non nulles.
V. Factorielle
V.1. Définition, calcul naïf
⟐ Définition 5
Pour un nombre entier naturel 𝑛 > 0, la factorielle de 𝑛 est le nombre noté 𝑛! et est le produit des nombres
entiers positifs de 1 à 𝑛 : 𝑛! = 1 × ⋯ × 𝑛.
Par convention, on pose 0! = 1.
‡ Proposition 12
Pour tout nombre entier naturel 𝑛 > 0, (𝑛 + 1)! = (𝑛 + 1) × 𝑛!.
⊛ Illustration 6
12! = 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 10 × 11 × 12
12! = 210 × 35 × 52 × 7 × 11
Ces questions recouvrent beaucoup de questionnements et de difficultés (fiabilité, sécurité, efficacité, ...).
Si les ordinateurs quantiques prévoient de modifier certains des paradigmes suivants, les technologies actuelles
reposent sur les principes suivants :
• il existe une unité de base de stockage, appelée bit, qui n’existe qu’en deux états (conventionnellement
notés 0 et 1) ;
• à l’état physique, un bit correspond à un dispositif reposant sur le passage du courant électrique :
∗ lors de la lecture de l’état, si le courant ne passe pas, c’est l’état 0, sinon, c’est l’état 1 ;
∗ sur une unité de stockage, on peut faire passer le dispositif unitaire d’un état à un autre (en général, par
envoi d’une tension importante).
La technologie mémoire flash 3 , la plus répandue actuellement, repose sur une grille flottante contenue dans
l’oxyde de grille. Une tête de lecture/écriture permet de mesurer la tension (lecture) mais aussi de piéger/dé-
piéger les électrons (écriture) par effet tunnel par exemple.
2. Toute donnée, réelle ou abstraite, manipulable par la pensée humaine (Claude SHANNON).
3. Quelques schémas et compléments éclairants à consulter sur wikipedia.
2. Problèmes positionnel.
• On ne teste pas l’égalité de deux flottants, on préfèrera abs(f1-f2) > 1e-12 à f1 == f2.
• Le calcul peut être non associatif.
>>> 1e-100 + 1 - 1 >>> 1 - 1 + 1e-100
0.0 1e-100