tous informatique pour tous plan...
TRANSCRIPT
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Informatique pour tousLe programme de cette année
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 6 septembre 2013 - Lycée du parc
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Organisation matérielle◮ Cours : vendredi 13-14 ; salle 434.
◮ TP : A.Garcia, mercredi 8-10 ; S.Gonnord jeudi 16H(semaines B), salle 717. Début... le 11 septembre.
◮ DS ? Oui !
◮ Pour vos machines : Pythonxy (Windows) ouAnaconda (Mac) par exemple.
◮ Il faudra bosser ? Bof... en cours et en TP !
◮ Il faut un bouquin ? Bof, pas vraiment !
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Plan général1. Éléments d’un ordinateur :
◮ hard ;◮ soft ;◮ stockage de l’information.
2. Algorithmique et programmation :◮ algorithmique, pseudo-code ;◮ langage Python ;◮ passer de l’un à l’autre.
3. Ingénierie numérique :◮ résolution de systèmes (pivot de Gauss) ;◮ résolution d’équations de la forme f (x) = 0 ;◮ résolution approchée d’équations différentielles.
4. Bases de données◮ le problème du stockage structuré ;◮ le « langage » SQL ;◮ mise en œuvre effective.
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
HardMon nouveau jouet (gamma) :
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Soft◮ Système d’exploitation (OS)
◮ Windows, Unix, ...◮ Interface entre le matériel, les applications et les
utilisateurs.◮ Gère les entrées/sorties, le système de fichier, ...
◮ Au niveau utilisateur◮ Logiciels (Chrome, LibreOffice, WOW...)◮ Environnement de développement (Idle, Eclipse,
Spyder...)
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Stockage de l’information
... 0 1 1 0 0 ...
◮ Les entiers : «de longueur arbitrairement grande»
◮ Les réels : avec un nombre fixé de «chiffres»significatifs.
◮ Et plein d’autres trucs ! (HP)
◮ Conséquences : on ne peut pas «calculer» n’importequoi avec n’importe quelle précision.
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Algorithmique : préliminaire
52 +62 +72 + · · ·+142 +152
=
15
∑k=5
k2
Les petits points, ce n’est PAS vulgaire !
Et accessoirement, comment on calcule cette somme ?
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Déroulement de ce cours◮ réfléchir au cours 1 ;
◮ écrire le cours 1 ;
◮ présenter le cours 1 ;
◮ réfléchir au cours 2 ;
◮ écrire le cours 2 ;
◮ présenter le cours 2 ;
◮ ...
◮ ...
◮ réfléchir au cours 33 ;
◮ écrire le cours 33 ;
◮ présenter le cours 33.
Un peu long à écrire, non ?
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Pareil... mais mieux ( ?)◮ Sous forme d’algorithme :
pour n de 1 à 33 faireréfléchir au cours n
écrire le cours n
présenter le cours n
◮ Plus synthétique, non ?
◮ Ben oui, mais c’est fondamentalement la mêmechose !
◮ Que pensez-vous de ça ?
pour n de 1 à 33 faireréfléchir au cours n
écrire le cours n
pour n de 1 à 33 faireprésenter le cours n
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Un dernier exemple◮ Un algorithme :
s← 0pour k de 5 à 15 faire
s← s+ k2
◮ Que vaut s à la fin ?◮ Déroulons l’algorithme :
◮ s← 0 (s vaut 0)◮ s← s+52 (s vaut alors 0+52)◮ s← s+62 (s vaut alors 52 +62)◮ · · ·
◮ s← s+142 (s vaut alors 52 +62 + · · ·+142)◮ s← s+152 (s vaut alors 52 +62 + · · ·+152)
◮ Algorithme : conception←→ compréhension.
◮ Bref : ici encore, les petits points, c’est crucial.
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Quelques lignes de code
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Du problème au programme◮ Un problème : trouver le plus petit n ∈ N tel que
n
∑k=0
k2≥ 841.
◮ Un algorithme raisonnable :s← 0n← 0tant que s < 841 faire
n← n+1s← s+n2
◮ Un «programme» qui répond au problème :
s, n = 0, 0
while s < 841:
n = n + 1
s = s + n**2
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Un système à résoudre◮ Le système :
2x + 2y − 3z = 2−2x − y − 3z = −56x + 4y + 4z = 16
◮ La question... Quelle est-elle ?
◮ Résolution ? On exprime x à l’aide de y et z, puis z àl’aide de y , puis on trouve z, puis y , puis x .
Hop, trop fastoche !NOOOOOOOOOOOOOOOOOON !
PLUS JAMAIS ÇA !
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Pivot de Gauss◮ Mise sous forme triangulaire◮ Résolution◮ Équivalences préservées
2x + 2y − 3z = 2−2x − y − 3z = −56x + 4y + 4z = 16
L2←L2+L1⇐⇒
L3←L3−3L1
2x + 2y − 3z = 21y − 6z = −3
− 2y + 13z = 10
L3←L3+2L2⇐⇒
2x + 2y − 3z = 2y − 6z = −3
z = 4
L2←L2+6L3⇐⇒
2x + 2y − 3z = 2y = 21
z = 4
L1←L1−2L2+3L3⇐⇒
2x = −28y = 21z = 4
Il y a une seule solution, qui est le triplet (−14,21,4).
◮ C’est propre, simple. AUCUNE BIDOUILLE◮ Ça se programme très facilement.
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Dichotomie
y=x2 −2
a0 b0
a1 b1
a2 b2
a3 b3
a4 b4
a5 b5
1 21.51.25
1.375
1.43751.40625
√2
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Méthode de Newton
y=x2 −2
u0 =2u1 =1.5
u2 ≃1.417√2 ≃1.414
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Les équations différentielles◮ Le problème.
y ′′ =−y vs. y ′′ =−sin(y)
◮ Résolution approchée◮ Des exemples :
◮ Le pendule amorti
θ′′(t) =−k1 sin(θ(t))− k2θ′(t).
◮ Chute d’un objet, avec frottements
m−→a = m
−→g − k
−→v .
◮ Des systèmes différentiels{
x ′(t) = −0.2x(t) − y(t)y ′(t) = x(t) − 0.2y(t)
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
De jolis dessins (1/3) : pendule amorti
θ′′(t) =−k1 sin(θ(t))− k2θ′(t)
0 2 4 6 8 10 12t
0
π
2π
3π
θ(t)
θ′(0)=1
θ′(0)=2
θ′(0)=5
θ′(0)=8
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
De jolis dessins (2/3) : chute de pommes
m−→a = m
−→g − k
−→v
0.0 0.5 1.0 1.5 2.0 2.5 3.0x(t)
0.0
0.5
1.0
1.5
2.0
z(t)
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
De jolis dessins (3/3) : X ′ = AX
A ∈
{(
−0.2 −11 −0.2
)
,
(
1 00 2
)
,
(
1 00 −2
)
,
(
1 10 1
)}
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Entre les deux
k1, k2 = 1, 1
def pendule_amorti(X, _):
theta, thetap = X
return array([thetap, -k1*np.sin(theta)-k2*thetap])
t = np.arange(0, 30, 0.01)
r = odeint(pendule_amorti, array([0, 1]), t)
pl.plot(r[:, 0], r[:, 1])
...
r = odeint(pendule_amorti, array([0, 8]), t)
pl.plot(r[:, 0], r[:, 1], ’-’, linewidth=4)
pl.grid()
...
pl.savefig(’portrait-amorti.pdf’)
pl.show()
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Stocker intelligemment l’information◮ Pour l’administration :
◮ Antonio Garcia : maths en 841◮ Antonio Garcia : maple en 841 [Révoqué]◮ Stéphane Gonnord : maths en 933◮ Stéphane Gonnord : maple en 933◮ Stéphane Gonnord : option info en 931, 932, 933◮ Cédric Mancini : physique en 841◮ Antonio Garcia : IPT en 841◮ Stéphane Gonnord : IPT en 841◮ ...
◮ Quel bazar !
◮ Qui enseigne de l’option info ou de l’info pour tousdans une classe de la forme ××1 ?
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
Stocker intelligemment l’informationAlors, comment ranger ça ?
◮ Dans un tableau ?
Mouais...
◮ Dans un tableur ?
Mouais...
◮ Dans une boîte noire à laquelle on accède parmagie ?
Yeah !
Il reste à apprendre le «abracadabra» pour accéder à laboîte noire.
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
SQL : un langage de requêtes◮ Un exemple ?
SELECT Nom FROM Enseignements WHERE
( Matiere in (’Option info’, ’IPT’)
AND
MOD(Classe,10)=1) )
◮ Un autre ?
SELECT el.nom FROM eleves el
WHERE (SELECT count (*)
FROM colles colle
WHERE colle.eleve=el.nom
AND colle.note<10)
> 9
◮ En pratique ? requètes via Python ou via unclicodrome.
Informatique pourtous
Stéphane Gonnord
Plan général
Éléments d’unordinateurHard
Soft
Stockage de l’information
Algorithmique etprogrammationAlgorithmes
Python
Passage de l’un à l’autre
Ingénierie numériquePivot de Gauss
Dichotomie et Newton
Méthode d’Euler
Bases de donnéesStocker intelligemmentl’information
Le langage SQL
End gameMerci de votre attention !
I wrote 20 short programs in Python yesterday. It was
wonderful. Perl, I’m leaving you. [XKCD 353]
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Ouvrons la bêteQuelques éléments d’architecture matérielle
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 13 septembre 2013 - Lycée du parc
Les photos ne sont pas toutes libres de droit
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Plan1. Un bestiaire :
◮ quelques ordinateurs à la maison ;◮ éléments communs.
2. Description d’un ordinateur :◮ théorie (Turing, von Neuman) ;◮ real world ;◮ fonctionnement approximatif.
3. Désossons la bête :◮ la carte mère ; le microprocesseur ;◮ la RAM, le disque dur ;◮ etc.
4. Quelques comparaisons :◮ 2000 vs. 2013 ;◮ 1000 vs. 300 vs. 50.
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Le ZX 81
Le début de l’histoire...
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Le petit dernier : γ
Et il fonctionne !
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Calculatrice 5 fonctions
Plus rustique...
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Un serveur (Meert)
Le serveur... et la freebox
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Votre serviteur
Euler
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Un bon vieux smartphone
Un vieil (3 ans) HTC
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Une tablette
Et son utilisation principale
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Une unité centrale...
qui ne marche plus !
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Bizarre
Une machine de Turing...
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
À guichet ouvert
En revenant de Nantes...
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
HPC
Quelques pétaflops sous le capot.
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Éléments communsPoints communs (partiels) entre ces bidules :
◮ «calculent» ;
◮ fonctionnent avec des « programmes » écrit à lanaissance et/ou plus tard ;
◮ entrées ;
◮ sorties ;
◮ stockage de données ;
◮ connectivité.
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Point de vue de Turing (1936)
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Une machine de Turing
... # 0 1 1 0 0 1 F ...
Que fait le « programme » suivant ?
qa,#−→ qa,#,D
qa,0 −→ qa,1,D
qa,1 −→ qa,0,D
qa,F −→ qr ,F ,G
qr ,0 −→ qr ,0,G
qr ,1 −→ qr ,1,G
qr ,#−→ qF ,#,⊥
Mouais... on ne va pas aller bien loin avec ça !
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Des tas de machines de Turing
... # 1 1 0 1 0 1 F ...
Écrire un « programme » sur machines de Turing qui...◮ ajoute un 0 en fin de ruban ;◮ ajoute un 0 en début de ruban ;◮ ajoute 1 à l’entier codé. Exemple : 42+1 = 43...
110101 −→ 001101
◮ multiplie par 2 l’entier codé ;◮ ...◮ résout un sudoku !
Thèse de Church-Turing
Tout ce qu’on peut « calculer », on peut le calculer avecune machine de Turing.
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Point de vue de von Neumann (1945)
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Dans la réalité
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Fonctionnement approximatif (1/3)La vie monotone de l’unité de contrôle :
Lire instruction
Incrémenter PC
Décoder instruction
Exécuter instruction
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Fonctionnement approximatif (2/3)Exemples d’instructions :
◮ LOAD : charge une valeur de la mémoire vers unrégistre.
◮ STORE : l’opération inverse !
◮ ADD : fait la somme de deux régistres, et la placedans un troisième.
◮ BNE : Branch if Not Equal, pour les tests.
LOAD R0, B ; charge B dans le registre R0
LOAD R1, C ; charge C dans le registre R1
ADD R2, R0, R1 ; R2 <- R0 + R1
STORE R2, A ; stocke R2 à l’adresse A
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Fonctionnement approximatif (3/3)En réalité, c’est « un peu » plus complexe :
◮ programme et données dans la RAM ;
◮ différentes mémoires (cache de différents niveaux,RAM) ;
◮ des tas de bus à synchroniser ;
◮ pipeline ;
◮ unité de prédiction de branchement ;
◮ périphériques ;
◮ ...
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
«La plaque maternelle»Carte mère (motherboard)
www.ldlc.com, août 2013 :majoritairement de 40e à 100e (jusqu’à 1000e...)
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Carte mère◮ supporte l’ensemble des éléments ;
◮ est placée dans un boitier, et connectée àl’alimentation ;
◮ BIOS ;
◮ Bus ;
◮ ...
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Le (micro)processeur (Central Processing Unit)
◮ Intel, AMD, ...
◮ majoritairement de 30 à 150e (jusqu’à 2000e...).
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Le CPU◮ multicœurs ;
◮ multiprocesseurs ;
◮ caches de différents niveaux ;
◮ CPU vs. GPU ;
◮ ...
Bref, les électroniciens hard ont encore du plein emploipour quelques années !
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
RAM
RAM nue, puis dans son slot, sur la carte mère
◮ de 500 Mo à 8 Go ;
◮ nombreux types (SDR, DDR, DDR2, ...) ;
◮ nombreuses fréquences ;
◮ 1 Go DDR2 800 MHz : de 15 à 30e
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Disque dur (Hard Drive)
◮ capacité : de 100 Go à 6 To ;◮ vitesse de rotation (de 5000 à 15000 tpm) ;◮ cache (de 8 à 128 Mo) ;◮ 1 To, 7200 tpm, 32 Mo cache : de 60 à 80 e
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Cartes mémoire (Solid State Drive)
◮ de 1 Go à 128 Go ;
◮ alternative raisonnable aux disques durs ;
◮ nombreux types (SD, SDHC, MicroSD, ...) ;
◮ 1 Go DDR2 800 MHz : de 15 à 30e
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Cartes d’extension◮ Le port :
◮ Les extensions (connectique, son, wifi...) :
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Kilo, méga, giga, tera, peta◮ bytes vs bits ;
◮ 210≃ 103 ;
◮ Mo (usage ; 106) vs Mio (mébioctets ; 220)
Ordres de grandeur :◮ Fréquences :
◮ processeur (1 GHz à 4 GHz) ;◮ bus (1 GHz, soit par exemple 32 Go par seconde) ;◮ mémoire (du même ordre ; un peu inférieur).
◮ Quantités de données :◮ cache (de 0.128 Mo en L1 à 12 Mo en L2) ;◮ RAM (0.5 Go à 8 Go) ;◮ CD-ROM (0.2 à 0.9 Go), DVD (4 à 8 Go) et Blu ray
(25 à 100 Go).◮ SSD (1 à 128 Go), HD (100 à 6000 Go).
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Il y a plus de 10 ansDébut 2000 :
◮ Modèle : HP Vectra VL 400.
◮ Gamme : « je m’achète un gros PC » (genre 1000 eactuellement).
◮ Prix (estimé) : ∼ 2000 e.
◮ Processeur : Pentium III, 800 MHz, 256 ko de cache.
◮ Disque dur : 10 Go ; RAM : 128 Mo.
◮ Bonne carte graphique de l’époque.
◮ Windows 2000.
Bref...
Un Raspberry π avant l’heure !
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
Trois budgets◮ Raspberry π : modèle B, plus une SSD 8 Go
◮ deux autres configurations (sans écran) : rue ducommerce, août 2013.
Gamma, 40 e Config. 300 e Config. 1000 eProc. 0.7 MHz 2*3.4 GHz 4*3.4 GHzCache 0.128 Mo 1 Mo 16 Mo
HD/SSD 0 / 8 Go 0.5 To / 0 1 To/16 GoRAM 0.5 Go 4 Go 16 Go
Vidéo GPU très correct Bon GPU ÉnôôôrmeOS Linux Non Windows 8
Ouvrons la bête
Stéphane Gonnord
Plan
BestiaireZolis photos
Éléments communs
Description d’unordinateurThéorie
Real world
Désossons le bestiauCommun à tous
Mémoire/stockage
Cartes d’extension
De gros chiffres
QuelquescomparaisonsAu néolithique
Trois budgets
End gameMerci de votre attention !
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Après le hard, le softOS, IDE and all that
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 20 septembre 2013 - Lycée du parc
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Plan1. Système d’exploitation :
◮ à quoi ils servent ;◮ qui ils sont.
2. Le contenu d’un disque dur :◮ dossiers vs. fichiers ;◮ documents vs. exécutables ;◮ à toi, à moi, à lui.
3. Apprendre à travailler avec un ordinateur :◮ de l’ordre dans ses dossiers et fichiers ;◮ le choix des noms ;◮ sauvegardes et gestion des versions.
4. Utiliser un IDE :◮ Le casting Python◮ Python for nerds ;◮ Spyder vs. Idle.
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Système d’exploitation (Operating System)◮ Est lancé au boot de l’ordinateur, éventuellement
après un choix (grub/lilo).
◮ Interface entre l’utilisateur, le matériel et lesapplications.
◮ Organisation du «système de fichier» (DD...).◮ Gestion des différents utilisateurs :
◮ dossiers personnels ;◮ droits en lecture, écriture, exécution.
◮ Lancement des applications/processus, gestion duparallélisme.
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
OS : un peu d’histoireIt’s a warm summer evening in ancient Greece...
Systèmes d’exploitations des ordinateurs personnels :◮ Unix (1969)◮ DOS (1981) - QDOS puis MS-DOS
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
OS : situation en 2013◮ Ordinateurs personnels :
◮ Windows : 92%◮ OS X (macs, base Unix) : 7%◮ Base Unix (Linux, BSD...) : 1%
Grandes disparités selon les milieux...
◮ Serveurs d’entreprise, web, cloud : majoritairementLinux
◮ High Performance Computing (gros zordinateurs) :◮ Base Unix (Linux, BSD...) : 98%◮ Windows : 2%
◮ Smartphones :◮ Android (Linux) : 79%◮ iOS (base Linux) : 14%◮ Blackberry, Windows mobile, ... : < 7%.
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Partitionnement du disqueUn disque, beaucoup de partitions
stephane@euler:~$ df -BM
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/sda3 182677M 100205M 73266M 58% /
udev 2001M 1M 2001M 1% /dev
tmpfs 805M 1M 804M 1% /run
none 5M 0M 5M 0% /run/lock
none 2011M 2M 2010M 1% /run/shm
stephane@meert:~$ df -BM
Sys. de fichiers 1M-blocs Utilisé Disponible Uti% Monté sur
/dev/sda1 18645M 6207M 11485M 36% /
none 1M 0M 1M 0% /sys/fs/cgroup
udev 992M 1M 992M 1% /dev
tmpfs 201M 1M 200M 1% /run
none 5M 0M 5M 0% /run/lock
none 1002M 0M 1002M 0% /run/shm
none 100M 0M 100M 0% /run/user
/dev/sda3 213814M 160679M 42268M 80% /home
/dev/sdb1 469325M 178937M 266541M 41% /mnt/savedisk
(en fait, il y a plusieurs disques !)
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Des tas de fichiers !
stephane@euler:~$ find / -type f 2>/dev/null | wc -l
1398531
stephane@euler:~$ find ~/ -type f 2>/dev/null | wc -l
295888
stephane@meert:~$ find / -type f 2>/dev/null | wc -l
1512922
stephane@meert:~$ find ~/ -type f 2>/dev/null | wc -l
149208
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Dossiers vs fichiersÀ la souris :
Ou en ligne de commande :
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
De façon plus abstraite
info-pour-tous
... tp-sup
01-02-decouverte
... ... ...
... 16-bd3
... ... ...
... sujets-tp-python.tex
... cours-sup
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Les terminaux : pas que pour les geeks
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Fichiers : exécutables vs. documents◮ LibreOffice : titi.ods, toto.doc, tata.xls,tagada.txt...
◮ Word : toto.doc, tagada.txt, ...
◮ Chrome, Internet Explorer, Firefox, Safari :proutch.html
◮ LATEX : ce_fichier.tex, ce_fichier.pdf,ce_fichier.log...
◮ WoW : des tas de fichiers de configuration !
◮ gcc : toto.c (source) toto.out (exécutableproduit)...
◮ Idle, Spyder : tp-01.py
◮ und so weiter.
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Droits, groupesLes fichiers ont un propriétaire. Les utilisateurs des droits
plus ou moins étendus.◮ Droits :
◮ écriture ;◮ lecture ;◮ exécution.
◮ Groupes :◮ root, superuser ;◮ utilisateur de base ;◮ groupe d’utilisateur plus ou moins vaste ;◮ tout le monde.
◮ Ces notions ont du sens :◮ sur un ordinateur personnel ;◮ sur un réseau (celui du lycée) ;◮ sur le cloud (dropbox, drive, ...) ;◮ mais aussi les réseaux sociaux, dans une certaine
mesure.
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Droits, groupes
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Structure ni trop plate ni trop étirée
MAL !
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Noms de fichiersPlusieurs religions plus ou moins permissives.Exemple de compromis :
◮ Bien :◮ tp-1.py
◮ tp_1.py
◮ premier_tp_python_de_l_annee.py (mais lourd)
◮ Mal :◮ tp-1
◮ tp 1.py
◮ tépé1.py
◮ 1er-tp.py
◮ tp-1-avec-slash/ tsk-tsk.py
◮ 1 Super_Premier tépé ! *&* .py
◮ Très mal : Documents/tp-1.py
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Noms de variables (identificateurs)Plusieurs écoles/religions, pour chaque langage !
◮ Bien :◮ debut
◮ liste1
◮ avec_underscore
◮ PlutotAvecDesMajuscules
◮ indice_debut_segment_recherche (porte dusens)
◮ Mal (dont certains interdits) :◮ début
◮ l1
◮ avec-tiret
◮ 1mauvais_debut
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Sauvegardes et versioningOn vous l’aura dit au moins une fois...
◮ Sauvegardes :◮ régulières ;◮ (partiellement) automatisées ;◮ (de temps en temps) délocalisées.
◮ Gestion des versions :◮ à la grand-papa (cpold) ;◮ professionnelle : arch, git, cvs, svn, mercurial...
Exemple concret : votre (futur) TIPE...
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Logique globaleLe casting :
◮ Fichier Python (« script ») : toto.pyInstructions à exécuter successivement.
◮ Un interpréteur interactif (ou pas). Exécute lesinstructions d’un script, ou données à la volée.
◮ Une fenêtre d’exécution.
Plein de combinaisons possibles !
◮ Fichier exécuté « dans une fenêtre ».
◮ Pas de fichier ; des commandes dans l’interpréteurinteractif (on ne va pas loin !).
◮ Un fichier Python interprété, avec ensuite descommandes dans la fenêtre interactive.
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Un fichier Python
"""
des commentaires
de début de fichier
"""
n = 5 # encore un commentaire
# et encore ici
for i in range(n):
print("7 * "+str(i)+" = "+str(7*i))
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Un fichier Python exécuté
◮ Avec l’entête # -*- coding: utf-8 -*- Python2.7 ne pose plus de problème.
◮ Exercice : qu’est-ce qui cloche dans ce terminal ?Comment ai-je réalisé ce tour de magie ?
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
À la rude : avec Emacs
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Spyder
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
Idle
Après le hard, le soft
Stéphane Gonnord
Plan
Systèmed’exploitationSon rôle
Les OS au cours du temps
Contenu d’un disquedurQuoi, où ?
Structure arborescente
Différents types de fichiers
Droits sur les fichiers
Apprendre à travaillerDossiers et sous-dossiers
Le choix des noms
Sauvegardes et versioning
Utiliser un IDELogique globale
Python for nerds
Python for newbies
End gameMerci de votre attention !
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Premiers éléments de PythonVariables, affectations, fonctions.
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 27 septembre 2013Lycée du parc
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Plan1. Type des «objets» Python
◮ entiers, flottants, complexes ;◮ booléens ;◮ listes, chaînes ;◮ etc.
2. Notion de variable :◮ un boût de mémoire affectable ;◮ consultable ;◮ modifiable.
3. Fonctions, programmes :◮ paramètres, résultat ;◮ variables locales.
4. Pendant que j’y pense :◮ aide ;◮ affichage formaté.◮ PEPs ;
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Entiers
>>> 3 + 2
5
>>> 3 * 2
6
>>> 3 ** 2
9
>>> 17 // 5
3
Attention !
◮ Python 2
>>> 17 / 5
3
◮ Python 3
>>> 17 / 5
3.4
>>> 841 ** 42
69411562938724983467771066983228469706012755537
24742896758041881773820659662797651233792769905
75933677718153328990193476881L
>>> 841 ^ 42
867
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Flottants : quelques bizarreries
>>> 1.1 + 2.7
3.8000000000000003
>>> 1.1 * 2.7
2.9700000000000006
>>> 1.1 / 2.7
0.40740740740740744
>>> 1.1 ** 4.2
1.492276423671142
>>> complex(1,1) ** 2
2j
>>> (1. / 2) * 2
1.0
>>> (1. / 9) * 9
1.0
>>> (1. / 3**6) * 3**6
0.9999999999999999
>>> (1. / 10**11) * 10**11
0.9999999999999999
>>> (1. / 2**841) * 2**841
1.0
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Flottants : en mode calculatrice
>>> cos(pi)
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
cos(pi)
NameError: name ’cos’ is not defined
>>> import math
>>> math.cos(math.pi/2)
6.123031769111886e-17
>>> import math as mt
>>> mt.cos(mt.pi/2)
6.123031769111886e-17
>>> from math import cos, pi
>>> cos(pi/2)
6.123031769111886e-17
>>> from math import *
>>> cos(pi/2)
6.123031769111886e-17
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Divisions : Python 2 vs Python 3◮ Pour les divisions d’entiers : TOUJOURS //
◮ Pour les divisions de flottants : TOUJOURS /
Exercice
Quels sont les résultats de ces commandes sous Python 2et Python 3 ?
>>> 7 / 2
>>> 7. / 2
>>> float(7) / 2
>>> float(7 / 2)
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Un type étrange : les booléens
>>> 3 == 5
False
>>> 841 > 0
True
>>> 841 <= 900
True
>>> (841 < 0) and ( (841 > 900) or (841 < 900) )
False
Exercice
Quels sont les résultats de ces commandes ?
>>> (1+1==3) and ((1+1==2) or (3+3==6))
>>> ((1+1==3) and (1+1==2)) or (3+3==6)
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Listes (1/2)
>>> l = [5, 3, 42.42, 1, ’tagada’]
>>> l[1]
3
>>> len(l)
5
>>> l[5]
Traceback (most recent call last):
File "<pyshell#44>", line 1, in <module>
l[5]
IndexError: list index out of range
>>> l[-1]
’tagada’
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Listes (2/2)Rappel : l = [5, 3, 42.42, 1, ’tagada’]
>>> l[1:4]
[3, 42.42, 1]
>>> l[2:-2]
Vous avez suivi ?
[42.42]
>>> l[2] = 1515
>>> l
[5, 3, 1515, 1, ’tagada’]
Les listes sont mutables
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Chaînes de caractères
>>> c = ’plof’
>>> d = "plof"
>>> c == d
True
>>> len(c)
4
>>> c[2]
’o’
>>> c[1:3]
’lo’
>>> c[1] = ’a’
Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
c[1] = ’a’
TypeError: ’str’ object does not support item assignment
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Tuples
>>> t = 3, ’plof’, 5.3, 4
>>> t[2]
5.3
>>> t[2] = 3
Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module>
t[2] = 3
TypeError: ’tuple’ object does not support
item assignment
Les tuples sont non-mutables
>>> t = 1, 15
>>> a, b = t
>>> b
15
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Ensembles
>>> s = {3, 4.5, 3, ’toto’}
>>> len(s)
3
>>> s
set([4.5, 3, ’toto’])
>>> 3 in s, ’truc’ in s
(True, False)
Mais aussi : les ensembles sont itérables :
>>> for x in s: print(x)
4.5
3
toto
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Associer un nom à une valeur
>>> x
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
x
NameError: name ’x’ is not defined
>>> x = 10
>>> x
10
>>> y = 42
>>> x * y
420
>>> x, y
(10, 42)
>>> z = x * y
>>> x, y, z
(10, 42, 420)
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Égalité vs. alias ; opérations-affectations
>>> z = x
>>> x, y, z
(10, 42, 10)
>>> x = 12
>>> x, y, z
(12, 42, 10)
>>> x = x+3
>>> x
15
>>> x += 3
>>> x
18
>>> # Mais aussi : «x -= » «x //= » «x *= » ...
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Échange de valeurs (1/2)Exercice : échanger les valeurs de deux variables.
◮ Premier essai : « fastoche»
>>> a,b = 10,42
>>> b = a
>>> a = b
>>> a,b
(10, 10)
◮ Deuxième essai : en passant par un tiers
>>> a,b = 10,42
>>> c = a
>>> a = b
>>> b = c
>>> a,b
(42, 10)
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Échange de valeurs (2/2)◮ Troisième essai : affectation d’un couple
>>> a,b = 10,42
>>> a,b = b,a
>>> a,b
(42, 10)
◮ Dernier essai : sioux
>>> a,b = 10,42
>>> a = b-a
>>> b = b-a
>>> a = a+b
>>> a,b
(42, 10)
Solution très astucieuse...et pourrie (mais intéressante !)
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Fonctions vs. interfaces utilisateur« J’en ai marre de ces profs qui pensent qu’un programme
commence avec un input et termine avec un print »
(citation authentique, mais non revendiquée ni datée...)
◮ Une fonction :◮ est écrite une fois et exécutée autant de fois que l’on
veut ;◮ prend (en général) des
arguments/entrées/paramètres ;◮ exécute alors une suite d’instructions ;◮ n’affiche rien (a priori) ;◮ renvoie/retourne (éventuellement) un résultat.
◮ Une interface utilisateur :◮ raconte sa vie, demande des trucs à l’utilisateur ;◮ fait des calculs (appels de fonctions, en général)
associés à ces données ;◮ donne un résultat à l’utilisateur, par exemple en
l’affichant à l’écran.
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Return vs print (1/3)◮ Définitions :
def discriminant1(a, b, c):
b**2 - 4*a*c
def discriminant2(a, b, c):
print(b**2 - 4*a*c)
def discriminant3(a, b, c):
return b**2 - 4*a*c
◮ Appels :
>>> discriminant1(1, 5, 3)
>>> discriminant2(1, 5, 3)
13
>>> discriminant3(1, 5, 3)
13
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Return vs print (2/3)
>>> print(discriminant1(1, 5, 3))
None
>>> print(discriminant2(1, 5, 3))
13
None
>>> print(discriminant3(1, 5, 3))
13
Les adeptes du print constatent alors qu’ils ne fautsurtout plus utiliser print sur le résultat...Ça devient difficile à défendre !
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Return vs print (3/3 ; coup de grace)
>>> from math import sqrt
>>> sqrt(discriminant1(1,5,3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a float is required
>>> sqrt(discriminant2(1,5,3))
13
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a float is required
>>> sqrt(discriminant3(1,5,3))
3.605551275463989
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Fonction/interfaceUtilisation de la fonction discriminant dans unprogramme interagissant avec l’utilisateur.
def discriminant(a, b, c):
return b**2 - 4*a*c
print("Entrez successivement a, b et c séparés
par des virgules")
a,b,c = input()
delta = discriminant(a,b,c)
print("Le discriminant de aX^2+bX+c vaut "+str(delta))
À l’exécution :
>>> Entrez successivement a, b et c séparés par des virgules
1,5,3
Le discriminant de aX^2+bX+c vaut 13
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
À toi, à moi, aux autres (1/3)La variable locale n’est pas vue de l’extérieur.
◮ Script :
def f(y):
x = 2*y
return x
◮ On exécute, puis...
>>> f(10)
20
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ’x’ is not defined
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
À toi, à moi, aux autres (2/3)La variable locale n’écrase pas la globale.
◮ Script :
x = 42
def f(y):
x = 2*y
return x
◮ On exécute, puis...
>>> f(10)
20
>>> x
42
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
À toi, à moi, aux autres (3/3)Le paramètre est également un nom local.
◮ Script :
x = 42
def f(x):
y = 2*x
return y
◮ On exécute, puis...
>>> f(10)
20
>>> x
42
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
À l’aide !◮ Sur le web :
◮ http://docs.python.org/2.7/
◮ Taper l’erreur suspecte dans un browser !
◮ Sous interpréteur :◮ >>> help(for), >>> help(range)
◮ >>> help(int)
◮ >>> help(math)
◮ Avec l’IDE :◮ Complétion, coloration, brace balancing◮ Idle : F1 (aide ouverte dans le browser).◮ Spyder : explorateur de variable, inspecteur d’objets.
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Affichage formaté◮ Pfff...
>>> x = 21
>>> print("le double de ",x," vaut ",2*x)
P2 : (’le double de ’, 21, ’ vaut ’, 42)
P3 : le double de 21 vaut 42
◮ Rustique mais facile et efficace :
>>> print("le double de "+str(x)+" vaut "+str(2*x))
le double de 21 vaut 42
◮ À la C :
>>> print("le double de %i vaut %i"%(x,2*x))
le double de 21 vaut 42
◮ En vrai Python :
>>> print("le double de {0} vaut {1}".format(x,2*x))
le double de 21 vaut 42
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
Python Enhancement Proposals
Pour les perfectionnistes... mais pas uniquement !
◮ PEP 0 : Index of Python Enhancement Proposals◮ PEP 8 : Style Guide for Python Code
◮ Limit all lines to a maximum of 79 characters.◮ Never use the characters ’l’ (lowercase letter el), ’O’
(uppercase letter oh), or ’I’ (uppercase letter eye) assingle character variable names.
◮ Function names should be lowercase, with wordsseparated by underscores as necessary to improvereadability.
◮ ...
◮ PEP 42 : Feature Requests
◮ PEP 257 : Docstring Conventions
◮ ...
Premiers élémentsde Python
Stéphane Gonnord
Plan
Différents typesd’objetsEntiers, flottants
Booléens
Listes, chaînes de caractères
Etc.
VariablesUn boût de mémoire
Consultable, modifiable
Échange de valeurs
FonctionsUn malentendu classique
Return vs. print
Variables locales
Diverses chosesL’aide
Affichage formaté
Les PEPs
End gameMerci de votre attention !
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Notion d’algorithmeBoucles et tests avec et sans Python
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 4, 11 et 18 octobre 2013Lycée du parc
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Plan1. Formaliser des tâches répétitives :
◮ des exemples de la vraie vie ;◮ un peu de mathématiques
2. Des maths un peu élaborées :◮ L’addition ;◮ la multiplication ;◮ etc.
3. Boucles et tests en Python :◮ boucles ;◮ tests.
4. Des tas d’exemples et exercices :◮ primalité, indice de dépassement... ;◮ up side down.
5. Ce qui reste à faire :◮ prouver ;◮ évaluer la complexité.
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Un premier exemple gonflé (1/2)Exercice
Comment obtenir cet affichage ?
Allo ?
Allo ?
Allo ?
Non mais allo quoi !
◮ Algorithme :
pour i allant de 10 à 12 faireAfficher « Allo ? »
Afficher « Non mais allo quoi ! »
◮ Programme :
for i in range(10,13):
print("Allo ?")
print("Non mais allo quoi !")
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Un premier exemple gonflé (2/2)pour i allant de 10 à 12 faire
Afficher « Allo ? »Afficher « Non mais allo quoi ! »
pour i allant de 10 à 12 faireAfficher « Allo ? »Afficher « Non mais allo quoi ! »
for i in range(10,13):
print("Allo ?")
print("Non mais allo quoi !")
for i in range(10,13):
print("Allo ?")
print("Non mais allo quoi !")
Allo ?
Allo ?
Allo ?
Non mais allo quoi !
Allo ?
Non mais allo quoi !
Allo ?
Non mais allo quoi !
Allo ?
Non mais allo quoi !
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Compter et sommer des machinsExercice
Comment compter le nombre d’entiers ≤ 1000 qui sontpremiers ? Et leur somme ?
c← 0 # un compteurpour i allant de 1 à 1000 faire
si i est premier alorsc← c+1
Résultat : c
s← 0 # un «sommeur»pour i allant de 1 à 1000 faire
si i est premier alorss← s+ i
Résultat : s
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
IRL : corriger des copies◮ Un premier point de vue :
pour c décrivant l’ensemble C des copies faire
pour p décrivant l’ensemble P des parties du DS faireCorriger la partie p de la copie c ; noter cette partie
Noter c
◮ Un autre :pour p décrivant P faire
pour c décrivant C faireCorriger la partie p de la copie c ; noter cette partie
pour c décrivant C faireNoter c
◮ Il ne s’agit pas de boucles « sur des entiers »
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
ExponentiationExercice
Comment calculer 84142 avec seulement des multiplica-tions ?
◮ r ← 841 (r va être multiplié par 841... 41 fois)◮ r ← r ×841 (r vaut alors 8412)◮ r ← r ×841 (r vaut alors 8413)◮ ...◮ r ← r ×841 (r vaut alors 84142)
Algorithme
r ← 841pour i allant de 0 à 40 faire
r ← r ×841Résultat : r
◮ La deuxième instruction n’était pas r ← r × r
◮ Pour xn, il vaut mieux partir de r ← 1 ; pourquoi ?
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
FactorielleExercice
Comment calculer 841! avec seulement des multiplica-tions ?
◮ r ← 1 (r va être multiplié par 2, puis 3, ... puis 841)
◮ r ← r ×2 (r vaut alors 2)
◮ r ← r ×3 (r vaut alors 2×3)
◮ ...
◮ r ← r ×841 (r vaut alors 841!)
Algorithme
r ← 1pour i allant de 2 à 841 faire
r ← r × i
Résultat : r
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
IRL : Mr G. et la trigonométrie◮ Un algorithme pratiqué par tous :
Faire apprendre un formulaire basique de trigonométriePoser deux ou trois formules en DStant que ce n’est pas bien appris faire
grogner ;exiger que ce soit travaillé mieux que ça ;poser deux ou trois formules en DS
Passer à la suite◮ Problème de la terminaison...
Exercice
Formaliser l’algorithme, dans le cas (improbable) où la trigone serait jamais bien apprise.
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Encore une boucle « Tant que »Exercice
Déterminer le plus petit entier n tel que n!≥ 1010
◮ Premier algorithme :n← 1tant que n!< 1010 faire
n← n+1Résultat : n
◮ Et si on s’interdit la fonction factorielle ?n← 1f ← 1 # f vaudra n! à (presque) tout momenttant que f < 1010 faire
n← n+1f ← f ×n
Résultat : n
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Addition : à deux chiffres (1/3)Exercice
Calculer 62+15
◮ Première solution :
>>> 62 + 15
77
◮ Et sinon :
6 2+ 1 5
? ?
6 2+ 1 5
? 7
6 2+ 1 5
7 7
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Addition : à deux chiffres (2/3)Exercice
Calculer 68+15
6 8+ 1 5
? ?
6 8+ 1 5
? 3
1
6 8+ 1 5
8 3
1
Algorithme général ?
a b+ c de f g
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Addition : à deux chiffres (3/3)
a b+ c de f g
Entrées : a,b,c,d
s1← b+d
si s1 < 10 alorsg← s1 # pas de retenuer ← 0
sinong← s1−10 # retenue de 1r ← 1
s2← r +a+ c
si s2 < 10 alors
(e, f )← (0,s2)sinon
(e, f )← (1,s2−10)
Résultat : d ,e, f
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Addition : le cas généralExercice
Calculer 123987+456456
1 2 3 9 8 7+ 4 5 6 4 5 6? ? ? ? ? ? ?
1 2 3 9 8 7+ 4 5 6 4 5 6? ? ? ? ? ? 3
1
1 2 3 9 8 7+ 4 5 6 4 5 6? ? ? ? ? 4 3
11
1 2+ 4 5? ? ?
Algorithme général :
◮ nature des entrées...
◮ et du résultat ;
◮ propagation d’une retenue...
◮ qu’on peut oublier après utilisation.
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Mutiplication : n et 1 chiffresExercice
Calculer 841×7
8 4 1x 7
? ? ? ?
8 4 1x 7
? ? ? 7
0
8 4 1x 7
? ? 8 7
02
8 4 1x 7
? 8 8 7
025
◮ Entrées, résultat ;
◮ une boucle ;
◮ propagation d’une retenue.
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Mutiplication : n et p chiffresExercice
Calculer 841×57
8 4 1x 5 7? ? ?
8 4 1x 5 7
5 8 8 7
8 4 1x 5 7
5 8 8 70
8 4 1x 5 7
5 8 8 74 2 0 5 0
◮ Une boucle...
◮ ou deux ;
◮ choisir le niveau de découpage du problème.
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
SoustractionExercice
Calculer 857−41
8 5 7- 4 1? ? ?
8 5 7- 4 1? ? 6
8 5 7- 4 1? 1 6
8 5 7- 4 18 1 6
Exercice
Calculer 841−57
8 4 1- 5 7? ? ?
8 4 1- 5 7? ? 4
1
8 4 1- 5 7? 8 4
11
8 4 1- 5 77 8 4
11
Exercice
Formaliser un algorithme de soustraction
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
DivisionExercice
Réaliser la division euclidienne de 841 par 3 puis par 57.
>>> 841/3, 841%3
(280, 1)
>>> 841/57, 841%57
(14, 43)
Exercice (difficile)
Formaliser un algorithme de division euclidienne d’entiers.
On pourra utiliser une boîte noire prenant a et b avec 0≤ a≤ 99 et
1≤ b ≤ 9, renvoyant le plus grand entier q tel que bq ≤ a.
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Boucles énumératives : syntaxeL’indentation marque le bloc exécuté.
◮ Entiers décrivant un domaine régulier :
for i in range(10):
...
...
for i in range(5, 10):
for i in range(20, 30, 3):
◮ Énumération sur une liste ou un ensemble :
for x in [1, 20, 1, -5]:
...
for x in {-1, 15, 10}:
◮ Et même sur les lignes d’un fichier !
toto = open(’un_fichier.txt’,’r’)
for ch in toto:
...
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Boucles énumératives : exemples◮ Sur un range :
>>> for i in range(10, 1, -3):
print(i**2)
100
49
16
◮ Sur des listes/ensembles :
>>> for x in [1, 3, 1]:
print(x**2)
1
9
1
>>> for x in {1, 3, 1}:
print(x**2)
1
9
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Boucles conditionnelles« Tant qu’il reste des M&M’s, on en reprend »
◮ L’indentation marque le bloc ;
◮ Syntaxe :
while <condition> :
<instr 1>
...
<instr n>
<ensuite>
◮ Exemple moisi :
i = 10
while i < 20:
i = i+3
print(i)
print("Maintenant, i vaut "+str(i))
Exercice
Qu’est-ce qui va être affiché ? Pourquoi cet exemple est moisi ?
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Boucles conditionnelles◮ Encore un exemple moisi :
i, j = 10, 20
while j < 20:
i = i+3
print(i+j)
print("Maintenant, i vaut "+str(i))
Exercice
Qu’est-ce qui va être affiché ?
◮ Plus intéressant :
a, cpt = 2020, 0
while a % 2 == 0:
cpt = cpt+1
a = a/2
Exercice
Que vaut i à la sortie de boucle ? Et a ?
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Tests : syntaxe◮ L’indentation gnagnagna
◮ Syntaxe :
if <condition> :
<instr 1>
...
<instr n>
<ensuite>
◮ Possibilité (mais non obligation !) d’une alternative :
if <condition> :
<instr 1>
...
else:
<instr 1>
...
<ensuite>
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Tests : exemples◮ S’il pleut, alors je prends un parapluie.
◮ Si j’ai colle de physique demain alors je bosse mon cours dephysique ; sinon je bosse mon cours de maths.
◮ Si j’ai colle de physique demain alors je bosse mon cours dephysique ; sinon : si j’ai colle de maths demain, alors je bossemon cours de maths, et sinon je vais courir au parc.
◮ Si j’ai colle de physique demain alors je bosse mon cours dephysique, et si j’ai colle de maths demain, alors je bosse moncours de maths.
Exercice
Que se passe t-il dans les trois derniers exemples selon les collesqu’on a le lendemain ? (il y a donc 12 réponses attendues !).On fera l’hypothèse que les conditions suffisantes énoncées sont né-
cessaires...
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Nombre et somme de premiersExercice
Déterminer le nombre d’entiers inférieurs à 1000 qui sont premiers, ainsi que leursomme.
◮ Algorithme :
c← 0 ; s← 0 # le compteur et le sommeurpour i allant de 1 à 1000 faire
si i est premier alorsc← c+1s← s+ i
◮ Programme :
compteur, somme = 0, 0
for n in range(1000):
if est_premier(n):
compteur = compteur+1
somme = somme+n
◮ Résultat :
>>> compteur, somme
(168, 76127)
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Calcul de 84142
Exercice
Comment calculer 84142 avec seulement des multiplications ?
◮ Algorithme :r ← 1pour i allant de 0 à 41 faire
r ← r ×841
◮ Programme :
r = 1
for i in range(42):
r *= 841 # Rappel : c’est comme r = r*841
◮ Résultat :
>>> r - 841**42
0L
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Calcul de 841!Exercice
Comment calculer 841! avec seulement des multiplications ?
◮ Algorithme :r ← 1pour i allant de 1 à 841 faire
r ← r × i
◮ Programme :
r = 1
for i in range(1,842):
r *= i
◮ Résultat :
>>> r - math.factorial(841)
0L
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Un dépassementExercice
Déterminer le plus petit entier n tel que n!≥ 1010
◮ Algorithme :
n← 1 ; f ← 1 # f vaudra n! à (presque) tout momenttant que f < 1010 faire
n← n+1f ← f ×n
◮ Programme :
n, facto = 1, 1
while facto<10**10:
n += 1
facto *= n
◮ Résultat :
>>> n,facto
(14, 87178291200L)
>>> math.factorial(14)
87178291200L
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Addition de deux entiers
def addition(a,b):
""" calcul de c=a+b; représentation avec une liste de décimaux
On suppose que len(a) = len(b)"""
n = len(a)
c = [] # on va adjoindre successivement les décimales
r = 0
for i in range(n):
s = a[i]+b[i]+r
if s>9:
c.append(s-10)
r = 1
else:
c.append(s)
r = 0
if r == 1:
c.append(1)
return c
>>> addition([7,8,9,3,2,1],[6,5,4,6,5,4])
[3, 4, 4, 0, 8, 5]
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Recherche de diviseursExercice
Déterminer les diviseurs de 9991
◮ Algorithme :
pour d allant de 1 à 9991 faire
si d divise 9991 alorsAfficher d
◮ Programme :
for d in range(1,9992):
if 9991%d ==0:
print(d)
◮ Résultat :
1
97
103
9991
◮ Et pour les mettre dans une liste ?
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Primalité (1/2)Exercice
N = 10002200057 est-il premier ?
◮ Algorithme 1 :
pour d allant de 2 à N−1 faire
si d divise N alorsAfficher « Oulala, N n’est pas premier »
◮ Bof...
◮ Algorithme 2 :Premier <- True # jusqu’à preuve du contraire !pour d allant de 2 à N−1 faire
si d divise N alorsPremier <- False
◮ Améliorations :
◮ s’arrêter à√
N ;◮ s’arrêter si Premier est passé à False
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Primalité (2/2)◮ Algorithme 3 : s’arrêter à
√N
pour d allant de 2 à ⌊√
N⌋ faire...
◮ Algorithme 4 : s’arrêter si Premier est passé à False
d ← 2tant que d ≤
√N et Premier faire
si d divise N alorsPremier <- False
d ← d +1
◮ Programme :
n, premier, d = 10002200057, True, 2
while d<=sqrt(n) and premier:
if n % d == 0:
premier = False
d += 1
◮ Résultat :
>>> d
100004
>>> 1000003*1000019
1000022000057L
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Reverse engineering◮ Après l’exécution du programme suivant, que vaut s ?
s = 0
for i in range(101):
for j in range(101):
s = s+(i+j)**2
◮ Montrer que le programme suivant va terminer :
i, cpt = 5000, 0
while i>0:
i = i//2
cpt = cpt+1
Que valent i et cpt après exécution ?
◮ Que se passe-t-il à l’exécution de ce programme ?
n = 10
while n>1:
print(n)
if n%2 ==0:
n = n/2
else:
n = 3*n+1
Que se passe-t-il si n = 1000 au départ ? Et pour n quelconque ?
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Quelques exercices suplémentaires◮ Écrire un programme (une fonction) réalisant la soustraction de
deux entiers donnés par des listes de décimales (supposées demême taille).
◮ Même chose pour la multiplication de deux entiers :
◮ avec n et 1 décimales ;◮ avec n et p décimales.
◮ S’attaquer à la division !
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Prouver la correction (1/2)Exercice
Montrer que le code suivant fait ce qu’on attendait de lui :
compteur = 0
for n in range(1001):
if est_premier(n):
compteur = compteur+1
◮ Notion d’invariant de boucle.
◮ Trouver le bon (délicat !) ;
◮ et le prouver.
◮ Ici par exemple : « À la fin de l’exécution du corps de boucle,compteur vaut le nombre d’indices k ≤ n tels queest_premier(k) a renvoyé True »
◮ Il reste à conclure !
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Prouver la correction (2/2)Exercice
Montrer qu’après l’exécution du script suivant, r1 et r2 valent respectivement 84142 et841! :
r1, r2 = 1, 1
for i in range(42):
r1 = r1*841
for i in range(2,842):
r2 = r2*i
Fastoche !Exercice
Montrer qu’après l’exécution du script suivant, r vaut 84142
r, p, n = 1, 841, 42
while n > 0:
if n%2 == 1:
r *= p
p *= p
n //= 2
Peut-être un peu moins fastoche !
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Prouver la terminaison◮ On suppose que n a été affecté (et vaut un entier strictement
positif). Montrer que la boucle suivante va terminer :
while n>0:
n = n-10
◮ Même chose ici :
while n>0:
n = n // 2
◮ Et encore ici :
while n>1:
if n%2 ==0:
n = n/2
else:
n = 3*n+1
Attention, il y a un piège :-)
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Évaluer la complexité (1/2)◮ On suppose que n a été affecté (et vaut un entier strictement
positif). Combien d’opérations élémentaires le programmesuivant va-t-il exécuter ?
s = 0
for i in range(n):
s = s+i**2
◮ Même chose ici :
s = 0
for i in range(n):
for j in range(i,n):
s = s+j**2
◮ Et ici :
while n<10**10:
n = n * 2
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
Évaluer la complexité (2/2)◮ On suppose que n a été affecté (et vaut un entier strictement
positif). Combien d’opérations élémentaires le programmesuivant va-t-il exécuter ?
while n>0:
n = n // 2
◮ Et ici ?
while n>1:
if n%2 ==0:
n = n/2
else:
n = 3*n+1
Notion d’algorithme
Stéphane Gonnord
Plan
Formaliser destâches répétitivesDans la vraie vie
En mathématiques
Des maths trèsélaboréesAdditionner
Multiplier
Mais encore...
Boucles et tests enPythonSyntaxe des boucles
Syntaxe des tests
Exemples etexercicesReprise des algorithmesprécédents
Du rabe
À l’envers !
Exercices
Ce qui reste à faireCorrection et terminaison
Complexité
End gameMerci de votre attention !
XKCD 1247 : « The mother of all suspect files »
(Better change the URL to https before downloading.)
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Tableaux/listes en Python (1/2)Une première couche
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 8 et 15 novembre 2013Lycée du parc
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Plan1. Tableaux vs. listes
◮ Tableaux/vecteurs ;◮ listes ;◮ la chêvre et le choux.
2. En pratique◮ Création, indexation ;◮ slicing ;◮ listes en compréhension.
3. Seconde couche de théorie◮ append et extend ;◮ copie de liste ;◮ passage en argument.
4. Quelques manipulations effectives de listes◮ parcours basique ;◮ recherche d’un maximum ;◮ recherche d’un élément ;◮ etc.
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Tableaux (vecteurs) vs. listesDeux structures concurrentes
◮ Les tableaux :◮ Un bloc (intervalle) de mémoire.◮ Accès direct en temps constant.◮ Ne peut être « prolongé » à moindre coût.
◮ Les listes (chaînées) :◮ Accès au premier élément, ajout en tête : facile.◮ Ou le contraire !◮ Accès au k -ème : difficile, coûteux.
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Une implémentation très astucieuse◮ Les tableaux redimensionnables :
◮ pour ajouter/étendre à moindre coût, mais avecaccès rapide au k -ième ;
◮ tableau recopié au delà de certains seuils.
◮ Agrandissement d’un tableau jusqu’à 1025éléments :
◮ 1+2+3+ · · ·+1025◮ 1+2+4+8+ · · ·+2048
◮ Complexité : pire des cas, moyenne, amorti...
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Création, indexation◮ t = [ ..., ..., ...] ; t = [0] * 10
◮ len(t)
◮ t[0], t[1], ..., t[n-1], t[-1], ..., t[-n]
◮ >>> x = 5
>>> id(x)
161288320
>>> x = 12
>>> id(x)
161288236
>>> t = [12, 15, 42]
>>> id(t)
168387212
>>> t[1] = 841
>>> t
[12, 841, 42]
>>> id(t)
168387212
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Slicing◮ t[a: b] : une tranche de t
>>> t = [42, 12, 15, 19, 16, 3, 40]
>>> t[2 : 4]
[15, 19]
◮ Mais recopiée ailleurs !
>>> t1 = t[2 : 5]
>>> t1
[15, 19, 16]
>>> t1[1] = 6
>>> t, t1
([42, 12, 15, 19, 16, 3, 40], [15, 6, 16])
>>> id(t), id(t1)
152527500, 152529132
◮ Des variantes : t[a: ] ; t[ : b] ; t[ : ] ;t[2: -3] ; t[10: 2] ; t[a : b : s]
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Comprehension◮ Dans R :
{x ∈ R; |x | ≤ 1}= {cos t | t ∈ [0,10]}
◮ [x for x in s if condition(x)]
>>> [i for i in range(10) if i%3 == 0]
[0, 3, 6, 9]
◮ [phi(x) for x in s]
>>> [i**2 for i in range(4)]
[0, 1, 4, 9]
◮ [phi(x) for x in s if condition(x)]
>>> [i**2 for i in range(10) if i%3 == 0]
[0, 9, 36, 81]
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Maping◮ Pour appliquer une fonction à chaque élément d’une
liste
>>> def f(x): return 2*x
>>> map(f, [3, 10, 40])
[6, 20, 80]
>>> map(est_premier, [3, 24, 91, 101])
[True, False, False, True]
>>> map(len, [ [1,15] , [10] , [4,5,6,7] ])
[2, 1, 4]
◮ Attention : évaluation retardée en Python 3
>>> map(f, [1, 4, 10])
<map object at 0xa4ffb2c>
>>> list(map(f, [1, 4, 10]))
[2, 8, 20]
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Append et extend
>>> t = [1, 3]
>>> t + [17]
[1, 3, 17]
>>> t
[1, 3]
>>> id(t)
152528972
>>> t = t + [17]
>>> t, id(t)
([1, 3, 17], 152528428)
>>> t.append(1515)
>>> t, id(t)
([1, 3, 17, 1515], 152528428)
>>> t.extend([’pif’, 19, ’paf’])
>>> id(t), t
(152528428, [1, 3, 17, 1515, ’pif’, 19, ’paf’])
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Copie de liste◮ Une liste est une adresse :
>>> t1 = [4, 2, 15]
>>> t2 = t1[ : ]
>>> t3 = t1
>>> t1, t2, t3
[4, 2, 15], [4, 2, 15], [4, 2, 15]
>>> map(id, [t1, t2, t3])
[145335084, 145386956, 145335084]
>>> t2[1] = 1515
>>> t3[1] = 841
>>> t1, t2, t3
([4, 841, 15], [4, 1515, 15], [4, 841, 15])
◮ En première approximation : ma_copie = t[ : ]
◮ copy.copy vs copy.deepcopy
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Passage en argument◮ (Experts : passage par valeur car tableau=pointeur !)
◮ Consultation : oui !
def maximum(t):
...
◮ Écriture : possible, mais attention...
◮ C’est super !
def echange(t, i, j):
t[i], t[j] = t[j], t[i]
◮ C’est une catastrophe ! Si la fonction est mal écrite(ou volontairement néfaste), elle peut détruire ladonnée.
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Parcours de liste◮ Première version :
for i in range(len(t)):
... (travail sur t[i])
◮ Deuxième version (souvent meilleure) :
for x in t:
... (travail direct sur x)
◮ Exemples : trouver le maximum d’un tableau... oubien l’indice correspondant.
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Somme des éléments d’un tableau◮ Version 1 :
def somme1(t):
res = 0
for i in range(len(t)):
res = res + t[i]
return res
◮ Version 2 :
def somme2(t):
res = 0
for x in t:
res = res + x
return res
◮ Version 3 (votre préférée...) :
def somme3(t):
return sum(t)
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
Recherche du maximum◮ Version 1 :
def maxi(t):
assert( len(t)>0 )
maxi_provisoire = t[0]
for x in t:
if x>maxi_provisoire:
maxi_provisoire = x
return maxi_provisoire
◮ Version 2 (...) :
def maxi_feignasse(t):
return max(t)
Exercice : retourner la position du maximum.
Tableaux/listes enPython (1/2)
Stéphane Gonnord
Plan
Tableaux et listesTableaux vs listes
La chêvre et le choux
En pratiqueCréation, indexation
Slicing
Compréhension
Maping
Retour à la théorieAppend et extend
Copie de liste
Passage en argument
Travailler avec deslistesParcours
Somme des éléments d’untableau
Recherche du maximum
End gameMerci de votre attention !
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Recherches dans un tableauséquentielle et dichotomique
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 22 (et 29 ?) novembre 2013Lycée du parc
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Plan1. Recherche séquentielle
◮ Présence d’un élément ; positions.◮ Sortie prématurée... ou pas ?◮ Correction, complexité.
2. Recherche dichotomique◮ Principe.◮ Mise en œuvre.◮ Sortie prématurée... ou pas ?◮ Correction, complexité.
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Le problèmeEst-ce qu’un objet x appartient à un tableau t?
◮ Deux types de réponse :◮ True/False
◮ Tableau des positions (éventuelles)
◮ True/False :◮ Je parcours tous les éléments de t , et je note la
présence éventuelle de x .◮ Dès que je vois x , je hurle qu’il est présent et le
travail est fini.
◮ Positions :je parcours tous les indices, et je note les positionsoù je trouve x .
◮ Une première solution excellente/misérable :
def appartient1(x, t):
return x in t
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Positions où on trouve l’objet◮ Fastoche...
◮ À comprendre, et savoir refaire les yeux fermés...Mais merci d’avoir tout de même ce poly avec vousau prochain tp, au cazou.
◮ Et donc, voici le code :
def positions(x, t):
""" Calcule les positions de x dans t"""
pos = [] # où seront stockées les positions
for i in range(len(t)):
if t[i] == x:
pos.append(i)
return pos
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
True/False avec return interne◮ Dès qu’on voit x, on quitte le programme via return.
On ne retourne False qu’après avoir tout parcouru.
◮ Code :
def appartient2(x, t):
"""Appartenance à un tableau.
On sort dès que possible"""
for y in t:
if y == x:
return True # surtout pas de else !
return False # Attention à l’indentation
◮ Complexité : de 1 à n = |t| accès au tableau.
◮ Correction/validité ?
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
True/False avec return final◮ Dès qu’on voit x, « on le note »... dans un booléen.
◮ Code :
def appartient3(x, t):
"""Appartenance à un tableau.
On le parcourt complètement"""
vu = False
for y in t:
if y == x:
vu = True # toujours pas de else...
return vu
◮ Complexité : systématiquement n = |t| accès (moinsbien, donc).
◮ Correction/validité ?
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
True/False avec return final : mieux !◮ Dès qu’on voit x, « on le note »... dans un booléen...
et on quitte la boucle !◮ Mais comment donc ?◮ Code :def appartient4(x, t):
"""Appartenance à un tableau.
On sort de la boucle dès que possible"""
vu = False
indice = 0
while not(vu) and indice<len(t):
if t[indice] == x:
vu = True
indice = indice+1 # attention à l’indentation
return vu
◮ Complexité : de 1 à n = |t| accès.◮ Correction/validité ?
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Principe de la recherche dichotomique◮ S’applique à un tableau trié.◮ Vu de loin :
◮ appartient(Winehouse, [Abba,...,ZZtop])?◮ n vs lnn ; 109 vs. 30.
◮ D’un peu plus près :◮ On tient à jour un intervalle de recherche dans le
tableau.◮ Il (sa longueur) est divisé(e) par deux à chaque
étape.◮ Jusqu’à ce que...
◮ on trouve Amy !◮ ou on constate l’absence.
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Plus précisément◮ On tient à jour deux indices indiquant le début (d) et
la fin (f ) de la plage considérée.
◮ Initialisation : d, f = 0, len(t)-1
◮ Nombre d’éléments de la plage de travail ?
f −d +1
(piquets, intervalles...)
◮ Indice « central » ?
m =f +d +1
2
◮ Intervalle pour continuer ?
[d ,m−1] ou [m+1, f ]
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
L’algorithmeEntrées : b,T
d , f ← 0, |T |−1tant que f > d faire
si f −d est pair alors
m← d+f2
sinon
m← d+f+12
si T [m] = b alorsRésultat : True
si T [m]> b alorsf ←m−1 # continuer à gauche
sinond ←m+1 # continuer à droite
# Ici, f = d (il reste un élément) ou f = d−1 (il n’y a plus rien)si d = f et T [d ] = b alors
Résultat : TrueRésultat : False
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Implémentation directe
def recherche_dichotomique(b, t):
""" Recherche dichotomique dans un tableau trié"""
d, f = 0, len(t)-1
while f > d:
m = (d+f+1)//2
if t[m] == b:
return True
if t[m] > b:
f = m-1
else:
d = m+1
if d == f and t[d] == b:
return True
return False
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Pareil... sans return prématuré
def recherche_dichotomique_bis(b, t):
""" Recherche dichotomique dans un tableau trié"""
d, f = 0, len(t)-1
j_ai_trouve = False
while not(j_ai_trouve) and (f > d):
m = (d+f+1)//2
if t[m] == b:
j_ai_trouve = True
else:
if t[m] > b:
f = m-1
else:
d = m+1
if d == f and t[d] == b:
j_ai_trouve = True
return j_ai_trouve
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Et en récursif ?
def dicho_ter(but, t, debut, fin):
""" Recherche dichotomique récursive
dans une zone d’un tableau trié"""
if debut > fin:
# peut arriver du fait des appels récursifs
return False
if debut == fin:
return t[debut] == but
milieu = (debut+fin+1)//2
if t[milieu] == but:
return True
if t[milieu] < but:
return dicho_ter(but, t, milieu+1, fin)
return dicho_ter(but, t, debut, milieu-1)
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Cryptique !On peut faire encore mieux... (pire ?)
def dicho_grumf(but, t, debut, fin):
return (debut <= fin) and\
((debut == fin and t[debut] == but)
or
(debut < fin
and
((t[(debut+fin+1)//2]==but)
or (t[(debut+fin+1)//2]>but
and dicho_grumf(but,t,debut,(debut+fin-1)//2))
or (t[(debut+fin+1)//2]<but
and dicho_grumf(but, t,(debut+fin+3)//2,fin)))))
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Complexité◮ Au départ : n éléments à traiter.
◮ À chaque étape supplémentaire : la longueur estdivisée par deux.
◮ LA (une) bonne propriété :
« Après k passages dans la boucle, f −d +1≤ n2k »
◮ Preuve : par récurrence.
◮ Conséquence : une complexité « en lnn ».
◮ C’est vraiment mieux que n ?
Ben oui, vraiment !
Recherches dans untableau
Stéphane Gonnord
Plan
RechercheséquentielleLe problème
Positions
True/False
RecherchedichotomiquePrincipe
Différentes implémentations
Complexité, correction
Correction◮ Invariant :
« T [debut]≤ b ≤ T [fin] »◮ Conséquence : si b est présent dans t , on va le
trouver. Et sinon ?◮ Cet invariant est faux !◮ On peut alors modifier le code... ou l’invariant !
Merci de votre attention !
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Recherche d’un sous-motet un peu de crible
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 29 novembre 2013Lycée du parc
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Plan1. Retour sur la dichotomie
2. Recherche d’un sous-mot◮ Problème ; principe.◮ Mise en œuvre.◮ Complexité. Améliorations.
3. Le crible d’Érathosthène◮ Le problème ; une solution naïve.◮ Principe du crible.◮ Mise en place.
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Retour sur la dichotomie◮ Pour chercher une valeur dans un tableau trié : lnn
requètes.
◮ Pour approcher une solution de f (x) = 0 avec f
continue : dans quelques semaines !
y=x2 −2
a0 b0
a1 b1
a2 b2
a3 b3
a4 b4
a5 b5
1 21.51.25
1.375
1.43751.40625
√2
◮ Approximation de x0 à ε près en temps O(lnε).
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Le(s) problème(s)◮ Rechercher tag dans pouettagada...
◮ Ou truc dans pouettagada...
◮ Ou encore tag dans pouettagadatagaplof...
◮ Voire [1,3,2] dans [12,15,1,3,2,10,1,3,2,42].
◮ Mais quelle misère !
>>> ’tag’ in ’pouettagada’
True
>>> ’truc’ in ’pouettagada’
False
◮ Par contre :
>>> [1,3,2] in [12,15,1,3,2,10,1,3,2,42]
False
OUF !
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Slicing autorisé◮ Rappel :
>>> liste = [10,15,30,40]
>>> liste[1:3]
[15, 30]
>>> chaine = "tagadaplof"
>>> chaine[2:5]
’gad’
◮ Et donc :Entrées : m1,m2
lg1, lg2← |m1| , |m2| # les longueurspour d allant de 0 à lg2− lg1 faire
si m2[d : d + lg1] = m1 alorsRésultat : True
Résultat : False◮ Complexité : au pire |m2|... ou plutôt |m1|× |m2|.
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Sans slicing◮ Le problème : m2[p:p+lg1] == m1?
◮ Vérifier chaque lettre... Et quitter dès qu’il y a unéchec ! (comparer à l’algorithme « englobant »)Entrées : m1,m2,psi p+ |m1|> |m2| alors
Résultat : Falsepour i allant de 0 à |m1|−1 faire
si m2[p+ i] 6= m1[i] alorsRésultat : False
Résultat : True◮ Complexité : |m1| dans le pire des cas.
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Le problème... et une solution◮ On veut compter/déterminer les nombres premiers
majorés par N.
◮ Solution naïve : N√
N divisions euclidiennes.
◮ Avec le crible : N ln lnN... mais de l’ordre de N enespace... Qu’on peut réduire à
√N.
N 102 104 106 108
N√
N 103 106 109 1012
N ln(ln(N))≃ 1,5×102 2,2×104 2,6×106 2,9×108
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
La solution naïve◮ Test de primalité :def est_premier(n):
if n <= 1:
return False
if n <= 3:
return True
for k in range(2, 1+int(sqrt(n))):
if n%k == 0:
return False
return True
◮ Comptons :cpt = 0
for n in range(1001):
if est_premier(n):
cpt += 1
◮ Complexité : au plus N√
N divisions euclidiennes.
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Principe et complexité
0
10
20
30
40
50
60
70
80
90
1
11
21
31
41
51
61
71
81
91
2
12
22
32
42
52
62
72
82
92
3
13
23
33
43
53
63
73
83
93
4
14
24
34
44
54
64
74
84
94
5
15
25
35
45
55
65
75
85
95
6
16
26
36
46
56
66
76
86
96
7
17
27
37
47
57
67
77
87
97
8
18
28
38
48
58
68
78
88
98
9
19
29
39
49
59
69
79
89
99
0
10
20
30
40
50
60
1
11
21
31
41
51
61
2
12
22
32
42
52
62
3
13
23
33
43
53
63
4
14
24
34
44
54
64
5
15
25
35
45
55
65
6
16
26
36
46
56
66
7
17
27
37
47
57
67
8
18
28
38
48
58
68
9
19
29
39
49
59
69
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Algorithme du crible◮ Principe :
◮ Rayer les multiples (stricts) de 2 ;◮ puis les multiples de 3 ;◮ puis les multiples de 5 ;◮ ...◮ on s’arrête quand le carré du crible dépasse N.
◮ Plus formellement :Entrées : N
T ← [False,False]+ [True]∗ (N−1)pour k allant de 2 à ⌊
√N⌋ faire
si T[k] alors# k est premier : on va « rayer » ses multiplespour i allant de k à ⌊N/k⌋ faire
T [k ∗ i]←False
Résultat : T
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
Le code◮ Par exemple :
def crible(n):
t = [False, False]+([True] * (n-1))
for k in range(2, 1+int(sqrt(n))):
for i in range(k, 1+(n//k)):
t[k*i] = False
return t
◮ C’est tout ? Ben oui !
◮ Et ça marche ? Ben oui ! Chiche ? Chiche !
>>> crible(20)
[False, False, True, True, False, True, False,
True, False, False, False, True, False, True,
False, False, False, True, False, True, False]
Recherche d’unsous-mot
Stéphane Gonnord
Plan
Retour sur ladichotomie
Recherche d’unsous-motLe problème
Avec slicing
Sans slicing
Crible d’ÉratosthèneRecherche de tous lesnombres premiers
Le crible
C’est fini
Merci de votre attention !
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Complexité des algorithmes
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 13 et 20 décembre 2013Lycée du parc - PCSI 841
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Plan1. Ordres de grandeur
2. Un catalogue◮ Les calculs de tous les jours ;◮ des recherches ;◮ des tris ;◮ des calculs approchés.
3. Méthodes génériques◮ Une boucles...◮ puis deux.◮ mais aussi...
4. Dans le détail◮ Déjà vu dans les épisodes précédents.◮ Un tri.◮ L’algorithme d’Euclide.
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Ordres de grandeur
Rappel : 109 = 230 = une minute = une seconde !
N 102 104 106 108
√N 10 102 103 104
N√
N 103 106 109 1012
N ln(N)≃ 4,6×102 9,2×104 1,4×107 1,8×109
N2 104 108 1012 1016
N3 106 1012 1018 1024
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Les calculs de tous les jours◮ Addition sur p décimales/bits : O(p).◮ Multiplications :
◮ O(p2)...◮ ou O(pα) avec α = ln3
ln2 ≃ 1,6...◮ voire O(p lnp).
◮ Division euclidienne : idem.
◮ Calcul de xn : n−1 = n multiplications... ou lnn.
◮ calcul de pgcd, pour p décimales/bits : O(ln3 p)opérations élémentaires... et même O(ln2 p) enfinassant.
◮ Calcul matriciel : tout en n3 (pivot) !
◮ Primalité :√
n(lnn)2... puis (lnn)2 en versionprobabiliste... puis déterministe en (lnn)12 (2002 ;probablement (lnn)6).
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Diverses recherches◮ Recherche d’un maximum/minimum :
◮ n−1 = n comparaisons pour l’algorithe naïf...◮ Et combien pour un algorithme «Roland Garros» ?
n−1 aussi !◮ On peut faire mieux ? Ben non ! Mais ce n’est pas si
clair...
◮ Appartenance à...◮ un tableau de taille n : n ou lnn ;◮ d’autres structures de données (arbre, table de
hash...) : lnn si possible !
◮ Un mot m1 dans un mot m2 :◮ |m1|× |m2| en naïf...◮ mais |m1|+ |m2| en finassant (KMP).
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Algorithme de tri◮ Les basiques (sélection - dont bulles - ou insertion).
Exécution en temps n2
◮ Un peu mieux : tri fusion (dichotomique) et rapide
Exécution en temps n. ln(n) (moyenne)
donc utilisable pour n = 106. Mais pire des cas en n2
pour le tri rapide.
◮ Plus exotiques : tri par tas, tri shell, ...
Exécution en temps n. ln(n)... ou n.p sur p décimales
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Calculs approchés◮ Résolution numérique de f (x) = 0 :
◮ n décimales en O(n) évaluations (dichotomie) : bien !◮ n décimales en O(lnn) évaluations (Newton,
sécante) : encore mieux !
◮ Calcul approché d’une intégrale :◮ Avec n évaluations, approximation à K
navec des
rectangles...◮ mais K
n2 avec des trapèzes...◮ et même K
n4 avec des paraboles.
◮ Résolution approchée d’une équation différentielle :◮ Approximation en 1
navec n itérations (Euler)...
◮ ou 1n2 (Heun)...
◮ ou même 1n4 (RK4).
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
HS - juste pour frimer
σ0 =a σ1... σn−1 σn =b
y=f(x)
∫ b
a
f
Rn (rectangles)
σ0 =a σ1... σn−1 σn =b
y=f(x)
∫ b
a
f
Tn (trapèzes)
σ0 =a σ1... σn−1 σn =b
y=f(x)
∫ b
a
f
Pn (paraboles)
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Une boucle◮ Situation typique :
for i in <un range, ou un ensemble, une liste>:
<faire des
trucs...>
◮ Complexité : autant de trucs qu’il y en a à faire !◮ Exemples :
◮ for i in range(10):
print("Allo, non mais allo numéro "+str(i))
◮ u = 0
for _ in range(100):
u = cos(u)
◮ maxi = t[0]
for x in t:
if x > maxi:
maxi = t
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Cas des sorties prématurées◮ break (sortie de boucle ; alternative au return/while)def appartient(x, t):
est_present = False
for y in t:
print(y)
if y == x:
est_present = True
break
print("paf")
return est_present◮ Ce qui donne :
>>> appartient(42, [12, 42, 1515])
12
42
paf
True
◮ Pire des cas, meileur des cas, cas moyen...
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Deux boucles◮ Cas générique :
for x in foo:
for y in bar:
<faire_tel_truc>
◮ Si foo et bar sont constant : |foo|× |bar | exécutionsde tel_truc
◮ Cas typique ou bar dépend de foo :
for i in range(1, 1+n):
for j in range(i):
<whatever>
◮ Complexité : 1+2+ · · ·+n exécutions de whatever,
soit n(n+1)2 = n2
2 = n2 ! Terme non standard parfoisrencontré : « complexité triangulaire ».
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Exercice
Évaluer le nombre d’exécutions de pif, paf et pouf lorsde l’exécution des trois programmes suivants :
◮ for i in range(n):
pif
for j in range(n):
paf
for k in range(n):
pouf
◮ for i in range(n):
pif
for j in range(n):
paf
for k in range(n):
pouf
◮ for i in range(n):
pif
for j in range(n):
paf
for k in range(n):
pouf
Hum... bon exercice de DS, vous ne trouvez pas ?
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Les boucles while◮ Cas générique :
while <condition qui porte sur un truc>:
faire des machins
◮ Si les machins ne touchent pas aux trucs, c’est(probablement) la catastrophe... sauf en cas de sortievia un break
◮ Complexité et terminaison fortement liées.◮ Exemples de couples conditions/actions :
◮ while n>0 n = n-1
◮ while n>0 n = n//2
◮ while n<M n = n*2
◮ while g<d g++ ou d-- ou d-g est divisé par 2◮ while n>0 n = n//2 ou n = 3*n+1
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Algorithmes déjà rencontrés◮ Calcul de xn.
r ← x
pour i allant de 1 à n fairer ← r × x
Résultat : r
◮ Calcul de n! en n.r ← 1pour i allant de 2 à n faire
r ← r × i
Résultat : r
◮ Déterminer le plus petit entier n tel que n!≥ 1010
n← 1f ← 1 # f vaudra n! à (presque) tout momenttant que f < 1010 faire
n← n+1f ← f ×n
Résultat : n
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Algorithmes/programmes déjà rencontrés◮ Addition de deux entiers (tableaux de décimales)
def somme(t1, t2): # on les suppose de même longueur
resultat, retenue = [], 0
for i in range(len(t1)):
somme = t1[i] + t2[i] + retenue
resultat.append(somme % 10)
retenue = somme // 10
return resultat
« C’est linéaire »◮ Multiplication de deux entiers :
◮ faire le produit de t1 par chaque élément de t2 ;◮ additionner les listes obtenues (avec décalages, et
éventuellement à la volée).◮ Il y a |t1|× |t2| multiplications/additions.
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Algorithmes/programmes déjà rencontrés◮ Calcul de 2-valuation
cpt = 0
while n % 2 == 0:
cpt = cpt+1
n = n // 2
◮ Calcul de xn (exponentiation rapide itérative)
def expo_rapide(x, n0):
r, p, n = 1, x, n0
while n > 0:
if n%2 == 1:
r = r * p
p = p * p
n = n // 2
return r
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Algorithmes/programmes déjà rencontrés◮ Appartenance à un tableau
def appartient(x, t):
for y in t:
if y == x:
return True
return False
◮ Positionsdef positions(x, t):
pos = []
for i in range(len(t)):
if t[i] == x:
pos.append(i)
return pos
◮ Syracusewhile n>1:
if n%2 ==0:
n = n/2
else:
n = 3*n+1
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Algorithmes/programmes déjà rencontrés◮ Dichotomie
def recherche_dichotomique(b, t):
d, f = 0, len(t)-1
while f > d:
m = (d+f+1)//2
if t[m] == b:
return True
if t[m] >b:
f = m-1
else:
d = m+1
if d == f and t[d] == b:
return True
return False
◮ Cribledef crible(n):
t = [False, False]+([True] * (n-1))
for k in range(2, 1+int(sqrt(n))):
for i in range(k, 1+(n//k)):
t[k*i] = False
return t
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Un tri par sélection◮ Algorithme principal :
Entrées : T
pour j allant de n−1 à 1 faireTrouver un indice i0 tel que T[i0] soit maximal dansT[0:j+1] # donc jusqu’à j inclus...Échanger T[i0] et T[j]
Résultat : T
◮ Algorithme secondaire (trouver l’indice...)Entrées : T , j
p← 0 # la position du maximum provisoire pour i allant
de 1 à j faire
si T [i]> T [p] alorsp← i
Résultat : p
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Un tri par sélection◮ Code principal :
def trier(t): # Destructif : t est modifié
for j in range(len(t)-1, 0, -1):
i0 = pos_maxi_up_to(t, j)
t[j], t[i0] = t[i0], t[j]
◮ Code secondaire (trouver l’indice...)
def pos_maxi_up_to(t, j): # jusqu’à j inclus
pmp = 0
for i in range(1, 1+j):
if t[i] > t[pmp]:
pmp = i
return pmp
◮ Complexité ? Triangulaire !
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
L’algorithme d’Euclide◮ pgcd(a,b) = p
γ11 ...p
γk
k ...◮ Exemple :
pgcd(1386,840)= pgcd(2×32×7×11,23×3×5×7)
= 2×3×7 = 42
◮ Nécessite d’avoir la factorisation en nombrespremiers (hard)
◮ Algorithme d’Euclide :
a≥ b > 0 =⇒ pgcd(a,b) = pgcd(b,a % b)
◮ Exemple :
pgcd(1386,840) = pgcd(840,546) = pgcd(546,294)
= pgcd(294,252)= pgcd(252,42)= pgcd(42,0)= 42
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
L’algorithme d’Euclide◮ Algorithme :
Entrées : a0,b0
(a,b)← (max(a0,b0),min(a0,b0)) tant que b > 0 faire
(a,b)← (b,a%b)
Résultat : a
◮ Code :
def euclide(a0, b0):
a, b = max(a0,b0), min(a0,b0)
while b>0:
a, b = b, a%b
return a
◮ Complexité : si a,b ≤ 2n, alors il y aura :◮ au plus n divisions euclidiennes, donc O(n3)
opérations élémentaires.◮ au plus 2n opérations l← l−αr dans les divisions
euclidiennes, donc O(n2) opérations élémentaires !
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
C’est fini
Merci de votre attention !
Complexité desalgorithmes
Stéphane Gonnord
Plan
Ordres de grandeur
CatalogueCalculs de tous les jours
Recherches
Tris
Calculs approchés
MéthodesgénériquesUne boucle
Deux boucles
Plus compliqué...
Dans le détailPreviously
Un tri
Algorithme d’Euclide
Désolé, mais...
Impossible de passer à côté !
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Un peu de récursivitéÉcrire simplement des choses simples
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 10 janvier 2014 - lycée du parc
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Plan
1. Le cas de la fonction factorielle.
◮ Itératif
◮ Récursif
◮ Exécution !
2. Principe vaguement général
3. Des exemples plus ou moins standards :
◮ passe à ton voisin de gauche ;
◮ passe à un ou plusieurs voisins éloigné(s) ;
◮ plus compliqué.
4. Exercices
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Point de vue itératif
◮ 5! =
(1×2)︸ ︷︷ ︸
2
×3
︸ ︷︷ ︸
6
×4
︸ ︷︷ ︸
24
×5 = 120
◮ Algorithme :
Entrées : nres← 1
pour i de 2 à n faireres← res× i
Résultat : res◮ def facto_it(n):
res = 1
for i in range(2, 1+n):
res = res * i
return res
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Point de vue récursif
◮ 5! = 5×4! Je demande 4! à mon voisin et je
multiplie le résultat par 5 avant de le renvoyer.
◮ Algorithme :
Entrées : nsi n = 0 alors
Résultat : 1
sinon
Résultat : n×F(n−1)
◮ Programme :
def facto_rec(n):
if n == 0:
return 1
else:
return n * facto_rec(n-1)
◮ Complexité : inchangée.
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Trace de l’exécution
Itératif en maple (même programme) :
> facto_it(5);
{--> enter , facto_it, , args = , 5
res := 1
res := 2
res := 6
res := 24
res := 120
<-- exit , facto_it, (now at top level, ) = , 120, }
120
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Passe à ton voisinRécursif en maple (même programme) :
> facto_rec(5)
{--> enter , facto_rec, , args = , 5
{--> enter , facto_rec, , args = , 4
{--> enter , facto_rec, , args = , 3
{--> enter , facto_rec, , args = , 2
{--> enter , facto_rec, , args = , 1
{--> enter , facto_rec, , args = , 0
1
<-- exit , facto_rec, (now in , facto_rec, ) = , 1, }
1
<-- exit , facto_rec, (now in , facto_rec, ) = , 1, }
2
<-- exit , facto_rec, (now in , facto_rec, ) = , 2, }
6
<-- exit , facto_rec, (now in , facto_rec, ) = , 6, }
24
<-- exit , facto_rec, (now in , facto_rec, ) = , 24, }
120
<-- exit , facto_rec, (now at top level, ) = , 120, }
120
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Des relations de récurrence simples
u(n) =
{
b0 si n = 0
Φ(n,u(n−1)) si n > 0
◮ Factorielle : n! =
{
1 si n = 0
n× (n−1)! si n > 0
b0 = 1 Φ(a,b) = a×b
◮ Exponentiation : 42n =
{
1 si n = 0
42×42n−1si n > 0
b0 = 1 Φ(a,b) = 42×b
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Des relations plus complexes
F(x) =
{
ϕ0(x) si x ∈ B0
Φ(x ,F(x1), ...,F(xk)) sinon
Avec x1, ...,xk « strictement plus petits » que x (pas
forcément entiers).
◮ Exponentiation rapide pour calculer F(n) = yn :
F(n) =
{
1 si n = 0
Calculé à l’aide de yn//2sinon
◮ Tri fusion d’un tableau T :
F(T )=
{
T si |T | ≤ 1
Calculé à l’aide de F(T ′) et F(T ′′) sinon
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Le voisin de gauche
◮ n!, an, un+1 = cos(un)...
◮ Facile à écrire... mais à éviter si n dépasse quelques
centaines/milliers.
◮ Il faut savoir l’écrire aussi en itératif.
◮ Complexité linéaire en itératif ou récursif.
◮ Attention :
un+1 = (n−2)un +n2−1...
def u(n):
if n == 0:
return <whatever>
return (n-3)*u(n-1)+(n-1)^2-1
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Tours de Hanoï
◮ Le problème :
◮ Le code :
def hanoi(n, a, b):
c = 6-(a+b) # le piquet intermédiaire
if n > 0:
hanoi(n-1, a, c)
print("Déplacer une pièce de "+str(a)+" vers "\
+str(b))
hanoi(n-1, c, b)
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Tours de Hanoï : le résultat
>>> hanoi(4, 1, 3)
Déplacer une pièce de 1 vers 2
Déplacer une pièce de 1 vers 3
Déplacer une pièce de 2 vers 3
Déplacer une pièce de 1 vers 2
Déplacer une pièce de 3 vers 1
Déplacer une pièce de 3 vers 2
Déplacer une pièce de 1 vers 2
Déplacer une pièce de 1 vers 3
Déplacer une pièce de 2 vers 3
Déplacer une pièce de 2 vers 1
Déplacer une pièce de 3 vers 1
Déplacer une pièce de 2 vers 3
Déplacer une pièce de 1 vers 2
Déplacer une pièce de 1 vers 3
Déplacer une pièce de 2 vers 3
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Tours de Hanoï : le résultat en plus joli !
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Plus complexe : appel en n/2
◮ xn =
{
1 si n = 0
xn%2× (xn//2)2sinon
Complexité : lnn mutiplications ; facile à écrire.
◮ Tri fusion :
◮ Trier récursivement les deux moitiés du tableau.
◮ Fusionner ces deux moitiés triées.
Complexité : n lnn.
◮ Tri rapide :
◮ Préparer finement le tableau, en le cassant en deux
morceaux...
◮ et trier récursivement ces deux morceaux.
Complexité : n2 dans le pire des cas... et n lnn en
moyenne.
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Plus compliqué... ou moins pertinent
Dans les deux premiers exemples, le calcul récursif est en
fait à éviter !
◮ fn =
{
n si n ≤ 1
fn−1 + fn−2 sinon
◮
(nk
)=
{
1 si n = 0 ou k = 0 ou k = n(n−1
k−1
)+(n−1
k
)sinon
◮ Ack(n,m) =
m+1 si m = 0
Ack(n−1,1) si n > 0 et m = 0
Ack(n−1,Ack(n,m−1)) sinon
◮ Suite de Syracuse : terminaison non assurée !
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
Exercices
◮ Comment programmer récursivement le calcul de un,
avec u0 donné, et la relation un+1 =12(un +2/un) ?
◮ Comment calculer récursivement les coefficients de
Bezout de deux entiers naturels a et b (u et v tels
que au+bv = pgcd(a,b) ) ?
◮ Complexité du calcul de(
2nn
):
◮ en récursif bête...
◮ avec un calcul récursif des lignes.
◮ Concevoir un tri récursif, où l’on insère le dernier
élément du tableau dans ce qui précède... et qui a
été trié. Complexité ?
◮ Prouver la terminaison dans le calcul naïf de
Ack(n,m).
◮ Comment résoudre le problème du serpent-cube ?
Un peu de récursivité
Stéphane Gonnord
Plan
La fonction factorielle
Itératif
Récursif
Exécution
Principe général
Des exemples
Relations simples
Relations plus complexes
Encore plus compliqué
Exercices
C’est fini
Merci de votre attention !
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Représentation machine des entierset (de quelques) réels
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 24 et 31 janvier 2014 - Lycée du parc
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Plan1. Décomposition des entiers en base b :
◮ la base 10 ;◮ la base 2 ;◮ quelques exercices.
2. Petits et grands entiers en machine◮ 32 vs. 64 bits ;◮ et au delà.
3. Quelques rationnels◮ Décimaux, dyadiques.◮ Flottant = mantisse + exposant
4. Les « nombres à virgule » en machine◮ Des phénomènes un peu pénibles... et inévitables.◮ Principe de la représentation machine.◮ Autour de la norme IEEE754.
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
À 10 balles
Il existe 10 sortes de personnes :
◮ ceux qui comptent en binaire ;
◮ et les autres.
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
La base 10◮ Quel entier représente (le « mot ») 342 ?
342→ 3×100+4×10+2
◮ Et en base b ? (b > 4 ; par défaut, c’est 10)
342→ 3×b2 +4×b+2
◮ D’une manière générale :
bd−1...b1b0→ b0 +b1×10+ · · ·+bd−1×10d−1
◮ Est-ce que tout entier peut se décomposer ainsi ? defaçon unique ?
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Décomposition en base 10◮ Théorème : si on fixe une base b ≥ 2, alors tout
entier naturel n ∈ N se décompose sous la formeα0 +α1×b+ · · ·+αk ×bk , avec 0≤ αi < b pourtout i . De plus, si n > 0 et on impose αk > 0, alorscette écriture est unique.
◮ Preuves constructives :◮ par récurrence simple (décomposition de 1789 à
l’aide de celle de 1788) ;◮ par récurrence forte (décomposition de 1789 à l’aide
de celle de 178... ou 789).
◮ Calcul effectif d’une décomposition :◮ en trouvant la décimale de poids fort (1 pour 1789)
puis en continuant sur le reste (789) ;◮ en trouvant celle de poids faible (9 pour 1789) et en
continuant sur le reste (178).
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Calcul effectif de la décomposition◮ But : 2014→ [2;0;1;4]... ou 2014→ [4;1;0;2]
◮ Bottom-up : la décimale de poids faible est n % 10.◮ Python récursif
def decompose_base_10(n):
if n<10:
return [n]
res = decompose_base_10( n // 10 )
res.append( n%10 )
return res
◮ Python itératif
def decompose_base_10_it(n):
resultat, reste = [], n
while reste > 0:
resultat = [reste % 10]+resultat
# ou resultat.append(reste%10) ...
reste = reste // 10
return resultat
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
De la décomposition vers l’entier (1/2)But : passer de [4;1;0;2] (ou [2;0;1;4]) à 2014.
◮ Principe : [4;1;0;2] : la décimale de poids faible estconnue ; on continue avec le reste.
◮ Python récursif
def reconstituer(t):
if t == []:
return 0
return t[0] + 10*reconstituer(t[1:])
Coût « quadratique » (slicing)... Mais bon...
◮ Python itératif
def reconstituer_iter(t):
res = 0
for i in range(len(t)):
res = res + 10**i * t[i]
return res
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
De la décomposition vers l’entier (2/2)« À la Hörner »
◮ Principe : 2148 = P(10) avec
P(t) = 2t3+ t2+4t+8...= 8+ t×(4+ t×(1+ t×2))
◮ Algorithme :Entrées : T
res← 0 # le résultat qui va grandirpour d dans T faire
res← res×10+d
Résultat : p
◮ En Python :
def recompose(t):
res = 0
for d in t:
res = res*10 + d
return res
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Décomposition en base 2◮ Combien ai-je de doigts ?
10 = 8+2 = 1×23+0×22+1×21+0×20→ 1010
◮ Et si je compte les doigts de pied ? Directement enbase 2... Fastoche !
10100→ 24 +22 = 20
◮ Décomposition : « top-down vs. bottom-up »
43 = 32+11 43 = 1+2×21
43→ 101011
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Quelques exercices◮ Quel entier possède comme écriture binaire 11...111
(n « 1 » consécutifs) ?
◮ Quel entier possède comme écriture binaire10101010 ?
◮ Quel entier possède s’écrit 120120 en base 3 ?
◮ Décomposer 840 en base 2. Puis en base 4. Et enfinen base 16.
◮ Décomposer 42 en base 16.
◮ Quel entier s’écrit A1 en base 16 ?
◮ Écrire un programme calculant la décomposition enbase 2 d’un entier... sans regarder les pagesprécédentes ! Réciproquement...
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Représentations de taille fixée◮ Représentation de 10 sur 32 bits... 0|00...001010︸ ︷︷ ︸
31
◮ Et −10 : 1|00...001010︸ ︷︷ ︸31
?
◮ En fait non : s = 1, mais la « mantisse » vaut−10+231
◮ Entiers représentables : de 1|00...00 =−231 à0|11...11 = 231−1
◮ Et PAF l’Ariane.
◮ 106−101217 = 898783 = 898782+1...
◮ Exercice : quelle est effectivement la représentationbinaire de −10 ?
1|00...01010 ou 1|11...110101 ou 1|11...110110 ?
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Entiers «arbitrairement longs»Sur une architecture 64 bits :
◮ En première approximation... représentation de263 +261 +231 +22 +21 :
+ | 00...0010︸ ︷︷ ︸31
10...0001︸ ︷︷ ︸31
00...0110︸ ︷︷ ︸31
◮ Pourquoi 31 et pas 64 ?
Suspens...
◮ Comment faire une somme, une multiplication ?
◮ IRL... c’est un peu plus compliqué (comme toujours) !
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Pi◮ Que vaut
1
3?
1
3◮ Et à peu près ?
Disons1
3≃ 0,3333 =
3333
104
◮ Que vaut π ?
Pfiou...
◮ Et à peu près ?
Disons 3,14159465
◮ Un peu mieux SVP ?
3,1415938
◮ Plus précisément ?
|π−3,141593| ≤ 10−6
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Haitche-Pi◮ Comment écrire 9 3/4 en base 10 ?
9,75
◮ Comment écrire 9 3/4 en base 2 ?
1001,112
◮ Comment écrire 9 3/4 en base 4 ?
21,34
◮ Comment écrire 9 3/4 en base 16 ?
9,C16
◮ Comment dire 9 3/4 en anglais ?
Pfiou...
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Rationnels, décimaux et dyadiques◮ Rationnel = réel de la forme
p
q, p ∈ Z, q ∈ N∗.
2
3∈Q ;
√2 ∈ R\Q
◮ Décimal = rationnel de la formep
10d, p ∈ Z, d ∈ N.
3
5∈ D ;
2
3∈Q\D
◮ Dyadique = rationnel de la formep
2b, p ∈ Z, b ∈ N.
3
2∈D ;
3
5∈ D\D
◮ Inclusions strictes :
D (D(Q(R
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Un peu de maths
◮
1
3= lim
N→∞
N
∑n=1
3
10n=
+∞
∑n=1
3
10n= 0,33333...
◮ Il existe (dk)k∈N∗ suite d’éléments de {0, ...,9} telle
que π = 3++∞
∑n=1
dn
10n ·
◮ Si x ∈ R, alors on peut trouver des dn ∈ {0, ...,9} et
E ∈ Z tels que x = E ++∞
∑n=1
dn
10n ·
◮ 1 =+∞
∑n=1
(910
)n= 0,999... mais il y a unicité, pour peu
que...
◮ Ça marche pareil dans les autres bases.
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Exemples de troncatures◮
1
3−→ 0,333 =
333
103
◮ π−→ 3,14 =314
102
◮ π−→ 3,141592654 =3141592654
109
◮ NA −→ 6,0221×1023
◮ La mantisse contient « les chiffres significatifs » ;l’exposant est... l’exposant !
◮ En base 2 : 9,75→ 1001,11 = 1,00111×23
◮ x ∈ R approché par d ∈D tel que |x−d | ≤ ε ? Non,
plutôt
∣∣∣∣x−d
x
∣∣∣∣≤ 2−N .
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Le cas de la base 60 - récréation
>>> 1+24./60+51./60**2+10./60**3
1.414212962962963
>>> sqrt(2)
1.4142135623730951
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Quelques exercices◮ Donner l’écriture exacte en base 2 du dyadique
165
16·
◮ Quel dyadique possède pour écriture binaire11011,1101 ?
◮ Donner l’écriture en base 10 de1
kpour 2≤ k ≤ 7.
◮ Donner l’écriture en base 2 de1
3·
◮ Rejouer avec1
5!
◮ Pour quels N le décimalN
100est-il un dyadique ? Et
N
10k?
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Python...
>>> 1. / 3**6
0.0013717421124828531
>>> (1. / 3**6) * 3**6
0.9999999999999999
Alors que...
>>> for i in range(1000):
if (1./2**i) * 2**i <> 1. : print(i)
>>>
Python « travaille en base 2 ».
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
vs. mapleUn peu de maple...
> for i to 40 do if 2**i*(1./2**i) <> 1.
then print(i) fi od;
34
38
>
Alors que...
> for i to 1000 do if 10**i*(1./10**i) <> 1.
then print(i) fi od;
>
Conclusion ?
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
D’autres blagues◮ Non-associativité :
>>> x=1
>>> y=-1
>>> z=2**(-55)
>>> (x+y)+z
2.7755575615628914e-17
>>> x+(y+z)
0.0
◮ Grumf...
>>> 0.1+0.1
0.2
>>> 0.1+0.1 == 0.2
True
>>> print(0.1+0.1+0.1)
0.3
>>> 0.1+0.1+0.1 == 0.3
False
>>> 0.1+0.1+0.1
0.30000000000000004
Bref : méfions-nous de tout...et particulièrement del’égalité des flottants.
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Principe de la représentation en machine◮ On approche x ∈ R par un flottant x = N×2k , avec
N impair (pourquoi ?) majoré par 2T , et a≤ k ≤ b.
◮ T est la taille de la mantisse (23, 52...), et parexemple −126≤ k ≤ 127 ou encore−1023≤ k ≤ 1024.
◮ Les flottants sont plus ou moins denses selon leszones...
◮ Ne pas espérer une précision absolue |x− x | ≤ ε0 :penser à
x = 2K
(1+
1
2T
), (K ,T ) = (512,52)
◮ On peut espérer :
∣∣∣∣x− x
x
∣∣∣∣≤ 2−T .
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
La norme IEEE754 (sur 64 bits)◮ Un bit de signe, 52 de mantisse, et 11 d’exposant.
◮ m×2e : on code m ∈ [1,2[, et e+1023, ce quiautorise −1022≤ e ≤ 1023. Pfiou...
◮ Exemple :1
3= 0,0101010101010101...
>>> (1./3).hex()
’0x1.5555555555555p-2’
◮ Il y a les infinis, et « Not A Number »...
◮ Le bit de poids fort de la mantisse est implicite.
◮ La gestion des arrondis est normalisée.
◮ C’est abominablement technique !
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
Exercices◮ Prévoir ce qui va se passer :
s0, s1 = 0, 1
for i in range(16):
s0 += 2**(-55)
s1 += 2**(-55)
s0 += 1
>>> s0,s1
(1.0000000000000004, 1.0)
◮ (HARD) Expliquer :
>>> 0.1.hex()
’0x1.999999999999ap-4’
>>> 0.2.hex()
’0x1.999999999999ap-3’
>>> 0.3.hex()
’0x1.3333333333333p-2’
>>> (3*0.1).hex()
’0x1.3333333333334p-2’
Représentationmachine des entiers
et (de quelques)réels
Stéphane Gonnord
Plan
Décomposition enbase b
La base dix
La base 2
Quelques exercices
Petits et grandsentiers en machine32 vs. 64 bits
Et au delà
FlottantsDes nombres à virgules
Rationnels, décimaux etdyadiques
Quelques exercices
Représentationmachine des flottantsDes phénomènes inévitables
La norme IEE754
Quelques exercices
C’est fini
Merci de votre attention !
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Tableaux/listes en Python (2/2)Matrices, et sombres histoires de pointeurs
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 7 février 2014
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Plan1. Quelques rappels :
◮ Création, indexation◮ Slicing◮ Copie◮ Passage en paramètre◮ Parcours
2. Tableaux bidimensionnels :◮ Création basique, indexation◮ Création-bis : le drame◮ Recopie
3. Un peu de numpy◮ Les tableaux array◮ Matrices◮ Slicing multidimensionnel.
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Création, indexation◮ Basique :
>>> t = [10, 12, 15, 7]
>>> len(t)
4
>>> t[2]
15
>>> t[4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> t[-1]
7
◮ Mais aussi :>>> [0] * 5
[0, 0, 0, 0, 0]
>>> [1 for i in range(3)]
[1, 1, 1]
>>> [i**2 for i in range(3)]
[0, 1, 4]
>>> [2 for _ in range(3)]
[2, 2, 2]
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
SlicingPlein de découpages !
◮ De base :>>> t = [3, 5, 12, 15, 42]
>>> t[1: 3]
[5, 12]
◮ Depuis/jusqu’au bout>>> t[ : 3]
[3, 5, 12]
>>> t[2: ]
[12, 15, 42]
◮ Avec un pas (6= 1)>>> t[0: 4: 2]
[3, 12]
>>> t[4: 0: -2]
[42, 12]
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Recopie◮ Surtout pas :
>>> t = [3, 5, 12, 15]
>>> t1 = t
>>> t1[1] = -1000
>>> t, t1
([3, -1000, 12, 15], [3, -1000, 12, 15])
◮ Mais plutôt :>>> t2 = t[ : ]
>>> t2[2] = 19
>>> t [1] = 1
>>> t, t1, t2
([3, 1, 12, 15], [3, 1, 12, 15], [3, -1000, 19, 15])
◮ Ou encore :>>> t3 = [t[i] for i in range(len(t))]
>>> t4 = [ x for x in t]
>>> import copy
>>> t5 = copy.copy(t)
>>> t6 = copy.deepcopy(t)
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Passage en paramètre : « rappel »◮ Si on définit...
def foo(x):
y = x+10
return y+1
◮ Alors à l’exécution :>>> foo(1)
12
>>> x = 2
>>> foo(x)
13
>>> x
2
>>> y = 3
>>> foo(y)
14
>>> y
3
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Passage en paramètre : cas des tableaux◮ Si on définit...
def bar(t):
t.append(42)
return t
◮ Alors à l’exécution :>>> bar([1, 2, 3])
[1, 2, 3, 42]
>>> t = [1, 2, 3]
>>> bar(t)
[1, 2, 3, 42]
>>> t
[1, 2, 3, 42]
◮ C’est en fait l’adresse du tableau qui est donnée enparamètre...
◮ C’est dangereux... et utile !def echange(t, i, j):
t[i], t[j] = t[j], t[i]
>>> echange(t, 0, 2)
>>>
>>> t
[3, 2, 1, 42]
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Parcours◮ À l’ancienne :
def maxi1(t):
m = t[0]
for i in range(len(t)):
if t[i] > m:
m = t[i]
return m
◮ À la Python :def maxi2(t):
m = t[0]
for x in t:
if x > m:
m = x
return m
◮ Mais aussi :def pos_maxi(t):
imaxi = 0
for i, x in enumerate(t):
if x > t[imaxi]:
imaxi = i
return imaxi
>>> pos_maxi([10, 42, 84, 10])
2
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Création basique :
(
1 2 34 5 6
)
◮ Des tableaux de tableaux :>>> t1 = [[1, 2, 3], [4, 5, 6]]
>>> t1[1]
[4, 5, 6]
>>> t1[0][2]
3
>>> t1[0,2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple
◮ À la numpy :>>> from numpy import *
>>> t2 = array([[1, 2, 3], [4, 5, 6]])
>>> t2
array([[1, 2, 3],
[4, 5, 6]])
>>> t2[1]
array([4, 5, 6])
>>> t2[0][2]
3
>>> t2[0,2]
3
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Créer une matrice (n,p)◮ Premier essai
>>> t1 = [[0] * 3] * 2
>>> t1
[[0, 0, 0], [0, 0, 0]]
>>> t1[0][1] = 42
>>> t1
[[0, 42, 0], [0, 42, 0]]
◮ Saletés de pointeurs...◮ Deuxième essai
>>> t2 = [[0] * 3 for _ in range(2)]
>>> t2
[[0, 0, 0], [0, 0, 0]]
>>> t2[0][1] = 42
>>> t2
[[0, 42, 0], [0, 0, 0]]
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Recopie de tableaux bidimensionnels◮ Première blague :
>>> t2 = t1
◮ Deuxième blague (beaucoup plus subtile) :
>>> t3 = t1[ : ]
◮ Troisième essai (identique à ce qui précède) :
>>> from copy import *
>>> t4 = copy(t1)
◮ Et enfin :
>>> t5 = deepcopy(t1)
◮ Ou encore (pour deux niveaux) :
>>> t6 = [l[ : ] for l in t1]
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Arrays (1/2)
>>> from numpy import *
>>> t0 = array([10, 2, 30])
◮ Des tableaux spéciaux (array) homogènes (int32,float64... ; pas de mélange).
◮ Indexation et slicing : comme les listes.◮ Méthodes propres (sum, copy, resize...) ; pas deappend.
◮ Somme et multiplication par un scalaire :>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> 2 * [1, 2]
[1, 2, 1, 2]
>>> array([1, 2]) + array([3, 4])
array([4, 6])
>>> 2*array([1, 2])
array([2, 4])
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Arrays (2/2)◮ Pratique :
>>> arange(1, 2, 0.2)
array([ 1. , 1.2, 1.4, 1.6, 1.8])
>>> linspace(1, 2, 5)
array([ 1. , 1.25, 1.5 , 1.75, 2. ])
◮ Appliquer une fonction :>>> map(math.cos, [1, 2])
[0.5403023058681398, -0.4161468365471424]
>>> map(numpy.cos, [1, 2])
[0.54030230586813977, -0.41614683654714241]
>>> math.cos([1,2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a float is required
>>> numpy.cos(array([1,2]))
array([ 0.54030231, -0.41614684])
>>> numpy.cos([1,2])
array([ 0.54030231, -0.41614684])
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Matrices◮ Exemple :
>>> hilbert = array([[1/(i+j+1) for j in range(3)] for i in range(3)])
>>> hilbert
array([[ 1. , 0.5 , 0.33333333],
[ 0.5 , 0.33333333, 0.25 ],
[ 0.33333333, 0.25 , 0.2 ]])
◮ Attention, piège à c...>>> hilbert*hilbert
array([[ 1. , 0.25 , 0.11111111],
[ 0.25 , 0.11111111, 0.0625 ],
[ 0.11111111, 0.0625 , 0.04 ]])
>>> linalg.dot(hilbert,hilbert)
array([[ 1.36111111, 0.75 , 0.525 ],
[ 0.75 , 0.42361111, 0.3 ],
[ 0.525 , 0.3 , 0.21361111]])
◮ zeros, identity, solve...
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
Slicing multidimensionnel◮ Récupérer une ligne...
>>> hilbert[1]
array([ 0.5 , 0.33333333, 0.25 ])
◮ Ou une colonne
>>> hilbert[2, : ]
array([ 0.33333333, 0.25 , 0.2 ])
◮ Ou une sous-matrice :
>>> hilbert[:2 , 1:]
array([[ 0.5 , 0.33333333],
[ 0.33333333, 0.25 ]])
Tableaux/listes enPython (2/2)
Stéphane Gonnord
Plan
Tableaux et listes enPython
Tableauxbidimensionnels
Un peu denumpy.array
C’est finiMerci de votre attention !
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Autour du pivot de GaussRésolution de systèmes linéaires... et autres bricoles
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi (14,) 21 et 28 février 2014Lycée du parc
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Plan1. Résoudre un système :
◮ ne pas faire n’importe quoi ;◮ l’algorithme du pivot.
2. Mise en œuvre :◮ algorithme finalisé ;◮ code.
3. Analyse de l’algorithme :◮ complexité ;◮ correction ;◮ erreurs, précision.
4. Bonus :◮ inversion de matrice ;◮ déterminant, PJr Q...◮ autres résolutions de sytème.
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Nimp de chez nimp...◮ Soyons malins :
2x + 2y − 3z = 2−2x − y − 3z = −56x + 4y + 4z = 16
=⇒ y =−2x−3z +5
donc 2x +2(−2x−3z +5)−3z = 2; −9z = 2−10+2x
=⇒ z =−2x +8
9
6x +4
(−2x−3
−2x +8
9+5
)+4−2x +8
9= 16
donc (...)x = ...
Et donc (x ,y ,z) = (−14,21,4)...
◮ Au fait, quelle était la question ?
◮ Au fait que signifie le symbole «⇒ » ? Et le mot« donc » ?
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Qu’est-ce qui ne va pas ?
TOUT !
◮ Pas/mal formalisé (on prend quelle inconnue ? On faitquoi si «ça se passe mal» ?)
◮ Conclusions peu claires (CN ? CS ? CNS ?)
◮ Équivalences fausses...mais implicites...mais pasvraiment...mais enfin on va faire comme si... Et detoute façon, on sait bien que nécessaire = suffisant !
◮ Pénible à programmer.
◮ « Ben oui mais jusqu’au bac inclus, on avait le droit».Ben oui...
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Pivotons !◮ Un peu de méthode !
2x + 2y − 3z = 2−2x − y − 3z = −56x + 4y + 4z = 16
L2←L2+L1⇐⇒L3←L3−3L1
2x + 2y − 3z = 21y − 6z = −3
− 2y + 13z = 10
L3←L3+2L2⇐⇒
2x + 2y − 3z = 2y − 6z = −3
z = 4
L2←L2+6L3⇐⇒
2x + 2y − 3z = 2y = 21
z = 4
L1←L1−2L2+3L3⇐⇒
2x = −28y = 21z = 4
Ainsi, le système initial possède une unique solution :
S = {(−14,21,4)}.
◮ Équivalences préservées
◮ Conclusion claire
◮ Ça se passe dans une matrice
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Schéma global de résolution◮ Mettre sous forme triangulaire, par des transvections ;
◮ « remonter » via des transvections/substitutions ;
◮ conclure !
Exemples : Résoudre à la main les systèmes suivants :
{2x +3y = 55x−2y = −16
x − y + z = 8−x + 2y + z = −12x − 4y − z = 6
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Borderline◮ Système de Cramer ? Résoudre les systèmes
suivants :{
x +2y = 12x +4y = 1
{x +2y = 12x +4y = 2
La conservation des équivalences est cruciale.◮ Apparition/disparition de 0... Résoudre les systèmes
suivants, et anticiper le résultat de la résolutioninformatique :
x + 1/4y + z = 0x + 1/3y + 2z = 0
y + 12z = 1
x + (1015 +1)y + z = 1x + (1+10−15)y + 2z = 0
1015y − z = 0
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Algorithme du pivot (partiel)◮ Mise sous forme triangulaire :
pour j de 0 à n−2 faire
Trouver i entre j et n−1 tel que |ai,j | soit maximale.Échanger Li et Lj (coefficients de la matrice et membres de
droite).
pour k de j +1 à n−1 faire
Lk ← Lk −ak ,j
aj,jLj
◮ Remontée :pour i de n−1 à 0 faire
pour k de i +1 à n−1 faireyi ← yi −ai,k xk
xi ←yi
ai,i
En fait, on fera plus rapide !
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
WARNING : problèmes rencontrés◮ Pas (d’essai) de compréhension de l’algorithme ;
◮ lecture partielle, avec changements astucieux etpartiels d’indices ;
◮ toujours range(...) : le hasard fait mal les choses...
◮ (non-copie de A ;)
◮ recherche du pivot maximal : confusion entre positionet valeur ;
◮ travailler sur A ET y dans les opérations (et dans lebon ordre) ;
◮ choisir entre [a, b, c] et [[a], [b], [c]]...
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Pythonisation◮ Recherche du pivot :
def pivot_partiel(A, j0):
i = j0 # le vainqueur provisoire
for k in range(i+1, len(A)):
if abs(A[k][j0]) > abs(A[i][j0]):
i = k
return i
◮ Échange de lignes :def echange_ligne(A, i, j):
for k in range(len(A[i])):
A[i][k], A[j][k] = A[j][k], A[i][k]
◮ Transvection :def transvection(A, i, j, mu):
for k in range(len(A[i])):
A[i][k] += mu*A[j][k]
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Code global
def resolution_systeme(A, y):
B = copie(A)
n = len(A)
for i in range(n-1):
j = pivot_partiel(B, i)
echange_ligne(B, i, j)
y[i], y[j] = y[j], y[i]
for k in range(i+1, n):
mu = B[k][i]/float(B[i][i])
transvection(B, k, i, -mu)
y[k] -= y[i]*mu
# B est maintenant triangulaire
x = [0]*n
for i in range(n-1, -1, -1):
x[i] = (y[i]-sum(B[i][k]*x[k] for k in range(i+1,n)))
/float(B[i][i])
return x
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Analyse de la complexité◮ Mise sous forme triangulaire :
◮ (n−1)+(n−2)+ · · ·+1 transvections...◮ soit n2 transvections, soit n3 opérations flottantes
x ← λx +µ.◮ Et les recherches de maximum ? n2 tests |a|< |b|.
◮ Remontée : n2 additions, soustractions,multiplications ou quotients de flottants.
◮ Bilan :
Le pivot a une complexité de l’ordre de n3
opérations sur les flottants.
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Validité de l’algorithme◮ Invariant global :
À chaque étape de la triangularisation, le systèmeAX = Y est équivalent au système initial A0X = Y .
◮ Invariant local :
Après k étapes du pivot, alors pour tout j < k ,aj,j 6= 0, et ai,j = 0 pour tout i > j .
◮ Et donc, si le système initial est de Cramer, on arriveà un système triangulaire, et le système initialpossède une unique solution... qui est bien celleretournée.
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Des erreurs... et leur propagationRésolution de AX = Y ...
◮ approximations sur A ;
◮ mais aussi sur Y ;
◮ et parfois dans la méthode de résolution ;
◮ et très certainement dans les calculs sur flottants...
Quelle misère !
◮ Pour résoudre A1X1 = X0 puis A2X2 = X1 puis... puisANXN = XN−1, accumulation d’approximations.
A1X1 = X0→ A2X2 = X1→ ·· ·
◮ Est-ce que XN ressemble à XN ?
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Propagation des erreurs◮ Oula !
>>> hilbert5 = array([[1./(i+j+1) for j in range(5)] for i in range(5)])
>>> y1=array([-7.7,-6,-2.1,-.5,0])
>>> y2=array([-7.7,-6,-2.1,-.4,0])
>>> solve(hilbert5, y1)
array([ 102.5, -240. , -2583. , 6860. , -4221. ])
>>> solve(hilbert5, y2)
array([ -37.5 , 2448. , -14342.99999999, 24779.99999999,
-13040.99999999])
◮ AX = Y et A(X +δX) = Y +δY : contrôle de δX àl’aide de δY .
◮
‖δX‖
‖X‖≤ κ(A)
‖δY‖
‖Y‖·
◮ Pour hilbert5 : κ≃ 3×105...
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Mieux que n3 ?◮ Comment faire si n = 105 ?
Acheter un plus gros ordinateur !
◮ Et si n = 107 et/ou il faut aller vite ? changer deméthode.
◮ Systèmes particuliers (Virginie...) : n3→ n2.
◮ Méthodes itératives : n2 voire n pour uneapproximation des solutions.
◮ Théoriquement, inverser/résoudre a la mêmecomplexité que multiplier les matrices... On descenddessous n3 !
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Inversion de matrice◮ On va de A à In par opérations sur les lignes :
A0 = A→ A1→ ·· · → AN = In.
◮ On fait les mêmes opérations sur In :
B0 = In→ B1→ ·· · → BN .
◮ Magique : BN = A−1 !
◮ En fait, Ak+1 = Pk Ak et Bk+1 = Pk Bk ... donc
AN = PN−1PN−2...P0A
etBN = PN−1PN−2...P0I
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
Déterminant, LU, PJrQ...◮ Calcul de déterminant : facile pour une triangulaire.
A0 = A→ A1→ ·· · → AN ∈ T+
n (K)
Les opérations multiplient le déterminant par λk ...donc λ1...λk detA = detAN .
◮ « En général », si A est inversible, alors il existeL ∈ T −n (K) et U ∈ T +
n (K) telles que A = LU : on lestrouve par pivot.
◮ Il existe P et Q inversibles telles que PAQ = Jr :encore du pivot !
Autour du pivot deGauss
Stéphane Gonnord
Plan
Résolution d’unsystèmeNimpe
Pivotons
Mise en œuvreAlgorithme précis
Code
Analyse del’algorithmeComplexité
Validité
Questions de précision
Bonus
C’est fini
Merci de votre attention !
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Résolution numérique d’équations
différentiellesMéthode d’Euler... et un peu mieux
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 21 et 28 mars 2014
Lycée du parc
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Plan
Résoudre une équation différentielle
Différents niveaux de résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Résoudre une équation différentielle...
◮ fastoche
y ′ = 2y
y ′ =−3y + sin t
y ′′−4y ′+3y = t2 cos te3t
◮ Plus difficile :
y ′ =−3y +et2
Calcul d’une intégrale :
∫ t
αe3ses2
ds
◮ Ça se gâte :
y ′(t)+a(t)y(t) = b(t)
Calcul/évaluation de deux intégrales
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Résoudre une équation différentielle...
◮ Encore plus difficile :
y ′′−4y ′+3y =et
1+ t2
Deux intégrales, mais encore des « formules
exactes ».
◮ Pire :
y ′(t) = cos(t + y(t))y ′′ =−sin(y)
◮ Et même...
∂u
∂t+(u ·∇)u =−
1
ρ∇p+ γ∇2
u+1
ρF
Les FORMULES, c’est fini
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
So what ?
◮ Problèmes de Cauchy
{
y ′ = f (t,y(t))y(a) = α
y ′′ = f (t,y(t),y ′(t))y(a) = αy ′(a) = β
◮ Maths : Il existe une unique solution.
◮ Vraie vie : OK... mais à quoi ressemble y(b) ?
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Schémas d’approximation
◮ Principe général : a = t0 < t1 < · · ·< tn = b ;
approximation des y(tk).
◮ Pas constant h =b−a
n: tk = a+ k ×h.
◮ Cas d’Euler :
y(tk+1)− y(tk)
tk+1 − tk≃ y ′(tk) = f (tk ,y(tk))
yk+1 = yk +h× f (tk ,yk)
◮ Autre point de vue :
y(tk+1)− y(tk) =∫ tk+1
tk
y ′(t)dt ≃ (tk+1 − tk)f (tk ,yk)
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Schéma d’Euler
tk tk+1
hF(tk ,y(tk ))y(tk )
y(tk+1)
y(tk ) +hF(tk ,y(tk ))
0.0 0.2 0.4 0.6 0.8 1.0t
0.5
1.0
1.5
2.0
2.5
3.0
y
La vraie solution : y=exp(t)
Méthode d'Euler, h=1/3
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Schémas d’approximation
◮ Heun :
yk+1 = yk +h
2(f (tk ,yk)+ f (tk+1,yk +hf (tk ,yk)))
◮ RK4 :
αk = yk +h
2f (tk ,yk ), βk = yk +
h
2f (tk +h/2,αk ), γk = yk +hf (tk +h/2,βk )
yk+1 = yk +h
6(f (tk ,yk )+2f (tk +h/2,αk )+2f (tk +h/2,βk )+ f (tk+1,γk )) .
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Différentes mesures de la qualité
◮ Schéma stable, consistant...
◮ Schéma convergeant : quand le pas tend vers 0, la
solution calculée tend (uniformément) vers la solution
mathématique.
◮ Schéma d’ordre p lorsque (grosso-modo) : la somme
des petites erreurs cumulées est en O(hp)
10-6 10-5 10-4 10-3 10-2 10-1
h
10-1410-1310-1210-1110-1010-910-810-710-610-510-410-310-210-1
e(h)
EulerHeunRK4
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Mise en œuvre d’Euler : fastoche
◮ Entrées (paramètres) ? sortie (résultat) ?
◮ Variables locales ?
◮ Code :
def euler(F, a, y0, b, n):
les_yk = [y0] # la liste des valeurs calculées
t = a # le temps du dernier calcul
h = float(b-a) / n # le pas
dernier = y0 # la dernière valeur calculée
for i in range(n):
suivant = dernier + h*F(t, dernier) # nouveau terme
les_yk.append(suivant) # on le place à la fin
t = t+h # le nouveau temps
dernier = suivant # mise à jour du dernier terme
return les_yk # c’est fini
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Et ça marche, ça ?
◮ Passer de l’équation concrète à la formalisation
générique :
y ′(t) = 2y(t)+ t −→ f (t,z) = 2z + t
◮ Mettre les arguments dans le bon ordre !
◮ Exemple : y ′ = y , avec y(0) = 1
>>> def f0(t, z):
return z
>>> euler(f0, 0, 1, 1, 3)
[1, 1.3333333333333333, 1.7777777777777777, 2.3703703703703702]
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Choix du pas
◮
{
y ′ = −3y
y(0) = 1
◮ Vraie solution : y(t) = e−3t .
◮ Différents pas :
0 2 4 6 8 10t
2.0
1.5
1.0
0.5
0.0
0.5
1.0
1.5
2.0
y(t)
h=0.68
h=0.6
h=0.1
exp(−3t)
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Choix du pas
◮
{
y ′ = y2
y(1) = 1
◮ Vraie solution : y(t) =1
2− t◮ Différents pas :
1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8t
1.0
1.5
2.0
2.5
3.0
3.5
4.0
4.5
5.0
y(t)
h=0.1
h=0.01
h=0.001
h=0.0001
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Deux scalaires : un vecteur
◮ Proies/prédateurs :{
x ′ = (A−By)xy ′ = (Cx −D)y
Avec F : (α,β) 7→ ((A−Bβ)α,(Cα−D)β) et
X = (x ,y) : X ′(t) = F(X(t)).
◮ Cas général : X ′(t) = F(t,X(t))
◮ Même schéma : Xk+1 = Xk +h×F(tk ,Xk)... mais
dans R2.
◮ Modification du code : remplacer y0 par (x0, y0),
dernier par (dernierx, derniery), etc.
◮ Version numpy : rien à changer dans le code d’Euler !
numpy.array([x0, y0])
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Ordre deux : égal ordre un !
◮ Pendule simple non amorti : θ′′ =−sinθ.
◮ X = (θ,θ′) ; X ′(t) = ? Exhiber F telle que
X ′(t) = F(X(t)).
◮ Cas général : idem !
◮ Ça vaut le coup !
0 2 4 6 8 1010
8
6
4
2
0
2
4Pendule non amorti : n=20
EulerHeunRK4
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Représentation des solutions◮ Liste des abscisses :
>>> np.linspace(0, 1, 5)
array([ 0. , 0.25, 0.5 , 0.75, 1. ])
>>> np.arange(0, 1.25, 0.25)
array([ 0. , 0.25, 0.5 , 0.75, 1. ])
◮ Exemple :
t = np.linspace(0, 1, 5)
yeuler = euler(f1, 0, 1, 1, 4)
np.plot(t, yeuler)
...
0.0 0.2 0.4 0.6 0.8 1.01.0
1.2
1.4
1.6
1.8
2.0
2.2
2.4
2.6
2.8Comparaison (avec un pas de 1/4) des methodes pour y′=y
EulerHeunRK4odeint
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Vectoriel et ordre 2◮ Choix de ce qu’on représente.
◮ Extraction des données : compréhension ou slicing.
>>> t = [ [1, 2], [3, 4], [5, 6] ]
>>> list( t[k][0] for k in range(len(t)))
[1, 3, 5]
>>> t = np.array([ [1, 2], [3, 4], [5, 6] ])
>>> t[ : , 0]
array([1, 3, 5])
◮ Proies-prédateurs :
0.0 0.5 1.0 1.5 2.0 2.5 3.00.0
0.5
1.0
1.5
2.0
2.5
3.0
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Ordre deux (pendule amorti)◮ Choix de ce qu’on représente : θ en fonction de t ...
0 2 4 6 8 10 12t
0
π
2π
3π
θ(t)
θ′(0)=1
θ′(0)=2
θ′(0)=5
θ′(0)=8
◮ Ou portrait de phase (θ(t),θ′(t))
0 π 2π 3πθ(t)
1
0
1
2
3
4
5
6
7
8
θ′ (t)
θ′(0)=1
θ′(0)=2
θ′(0)=5
θ′(0)=8
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
Euler vs. Heun et RK4
◮ Test : y ′ = y avec y(0) = 1 ; évaluation de |y(1)−e|
◮ Euler :
n 103 104 105 106 107
Temps 6.7×10−4 6.9×10−3 6.8×10−2 6.7×10−1 6.7
Erreur 1.36×10−3 1.36×10−4 1.36×10−5 1.36×10−6 1.36×10−7
◮ Heun :n 103 104 105 106
Temps 1.4×10−3 1.3×10−2 1.3×10−1 1.4
Erreur 4.5×10−7 4.5×10−9 4.5×10−11 4.1×10−13
◮ RK4 :n 102 103 104
Temps 5.9×10−5 3.9×10−4 3.4×10−3
Erreur 2.1×10−6 2.2×10−10 2.0×10−14
◮ Commenter !
Résolution
numérique
d’équations
différentielles
Stéphane Gonnord
Plan
Résoudre une
équation
différentielle
Différents niveaux de
résolution
Schémas numériques
Qualité de l’approximation
Méthode d’Euler
Mise en place
Vectorialisation
Représentation des solutions
C’est fini
Ça ne vous parle pas ? Alors n’essayez pas de savoir...
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Résolution d’équations sur les réelsAlgorithme dichotomique et méthode de Newton
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 4 avril 2014Lycée du parc
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Plan
Recherche dichotomiquePrincipeMise en placeAnalyse de l’algorithme
Méthode de NewtonPrincipeMise en placeProblèmes pratiques
BonusAvec numpyAutour de Newton
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Position du problème
En maths, on résout des équations... genre, encore plus
compliqué que ax2 +bx + c = 0.
...Ben non. Enfin oui, mais non !
◮ ax = b ; AX = B...
◮ ax2 +bx + c = 0 ; P(x) = 0.
◮ sin t = cos t , sin3 t +3cos5 t = 1/840...
◮ La solution ? Une solution ? Les solutions ?
◮ Précision ? Nombre de bits/décimales ?
◮ Temps de calcul ?
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Dichotomie : principe◮ Si f (a)< 0 < f (b) avec f continue, alors...
◮ Ou encore : si f (b)< 0 < f (a)... ou encoref (a)f (b)≤ 0... voire f (a)f (b)≤ 0 !
◮ Principe : localiser la (une) racine vis à vis dea+b
2·
◮ Exemple : f (x) = x2 −2, a = 1, b = 2.
f (1) =−1 < 0 < 2 = f (2).f (3/2) = 1/4 > 0 > f (1)
f (5/4) =−7/16 < 0 < f (3/2)
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Un exemple standardÀ chaque étape, f (ak)≤ 0 ≤ f (bk).
y=x2 −2
a0 b0
a1 b1
a2 b2
a3 b3
a4 b4
a5 b5
1 21.51.25
1.375
1.43751.40625
√2
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Dichotomie : code◮ On maintient l’invariant f (g)× f (d)≤ 0 ;
◮ On casse [g,d ] en deux à chaque étape...jusqu’àavoir g−d ≤ 2ε.
◮ Et ça donne :
def dichotomie(f, a, b, epsilon):
g, d = a, b
fg, fd = f(g), f(d)
while d - g > 2*epsilon:
m = (g + d) / 2.
fm = f(m)
if fg * fm <= 0:
d, fd = m, fm
else:
g, fg = m, fm
return (g+d)/2
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Dichotomie : résultatsDistance à la racine, en fonction du nombre d’itérations :
0 10 20 30 40 50n
10-16
10-14
10-12
10-10
10-8
10-6
10-4
10-2
100
|x 0−r
|
MilieuMeilleur bord
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Terminaison, validité, complexité◮ Invariant : f (g)× f (d)≤ 0 (par récurrence) ; permet
de prouver la validité.
◮ Variant : d −g =b−a
2kaprès k passages dans la
boucle ; preuve de la terminaison.◮ Complexité ?
◮ d −g ≤ 2ε dès que...
◮ Après k itérations, |r − x0| ≤b−a
2k
◮ |r − x0| ≤1
10daprès combien d’itérations ?
◮ Exercice : après k itérations, combien de décimalesjustes ?
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Newton : f (x) = x2−2
y=x2 −2
u0 =2u1 =1.5
u2 ≃1.417√2 ≃1.414
Exercice : établir un+1 =1
2
(
un +2
un
)
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Convergence vers√
2◮ Classique :
◮ Les un sont ≥√
2 ;
◮ un+1 −√
2 ≤ (un −√
2)2
2;
◮ 0 ≤ un −√
2 ≤ 2−2n
...
◮ C’est ÉNÔÔÔÔÔRME !
◮ Exercice : Combien d’itérations sont suffisantes pouravoir 1000 décimales ?
◮ On obtient d décimales en temps O(lnd).
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Cas général
y=f(x)
unun+1un−un+1
f(un )
Exercice : établir un+1 = un −f (un)
f ′(un)
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
De la suite vers un algorithme◮ Quand s’arrêter ? |un+1 −un| ≤ ε est raisonnable...
◮ Fastoche !
def Newton(f, fp, x0, epsilon):
u = x0
v = u - f(u)/fp(u)
while abs(v-u) > epsilon:
u, v = v, v - f(v)/fp(v)
return v
◮ Problèmes :◮ il faut connaître f ′ ;◮ la convergence n’est pas assurée ;◮ problème si f ′(v) (ou son évaluation numérique) est
nulle.
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
RésultatsPour x2 = 2 puis sinx = 0 sur [3,4] :
0 1 2 3 4 5 6 7n
10-16
10-14
10-12
10-10
10-8
10-6
10-4
10-2
100|x n
−l|
Newton sur x x2 −2
Newton sur x sinx
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Deux problèmes
◮ f ′(x0)≃f (x0 +h)− f (x0)
h≃ f (x0 +h)− f (x0 −h)
2h·
10-8 10-7 10-6 10-5 10-4 10-3 10-2 10-1 100
h
10-12
10-11
10-10
10-9
10-8
10-7
10-6
10-5
10-4
10-3
10-2
10-1
100
|∆0(h)−
f′(0)|
Formule basiqueFormule symétrique
◮ Test d’arrêt :◮ |un+1 −un| ≤ ε n’implique pas |un+1 − x0| ≤ ε
◮ |f (un)| ≤ ε est-il mieux ? Pas si f ′(x0) = 0 !
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Utilisation de numpy/scipyPlusieurs fonctions dédiées :
◮ Racines d’un polynôme (ici X 3 +2X 2 −X −2) :
>>> from numpy import *
>>> roots([1, 2, -1, -2])
array([ 1., -2., -1.])
◮ Dichotomie (« slow but sure ») :
>>> bisect(sin, 3, 4)
3.141592653589214
◮ Newton (ou sécante sans dérivée) :
>>> newton(sin, 3, cos)
3.1415926535897931
◮ Etc : brentq, fsolve...
Résolutiond’équations sur les
réels
Stéphane Gonnord
Plan
RecherchedichotomiquePrincipe
Mise en place
Analyse de l’algorithme
Méthode de NewtonPrincipe
Mise en place
Problèmes pratiques
BonusAvec numpy
Autour de Newton
Autour de Newton◮ Newton existe aussi...
◮ sur les complexes : f (z) = z2 −Z0 ; f (z) = z3 −1 ; ...
◮ chez les matrices : Mn+1 =1
2
(
Mn +AM−1n
)
; ...
◮ dans Rn ;
◮ en version cubique si on connaît f ′ et f ′′ : Halley
◮ Méthode de la sécante :◮ Partir de deux points. Couper le graphe : nouveau
point qui remplace l’avant dernier.◮ Couper le graphe avec es deux derniers points ; etc.◮ Un dessin ?◮ Convergence, complexité : assez semblable à
Newton.
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Bases de données (1/4)Introduction
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 11 et 18 avril 2014
Lycée du parc
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Plan
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL : WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Les villes, départements et régions
◮ Ville(Lyon, Rhône, 484344) ; Département(Rhône,
69, Rhône-Alpes) ; Région(Rhône-Alpes).
◮ Comment relier tout cela ? Et si un département
change de nom ?
◮ Quelques questions :
◮ Quelles sont les villes de plus de 100000 habitants ?
◮ Combien y a-t-il de communes en France ?
◮ Quelle est la population vivant dans les villes
française ?
◮ Quelles sont les villes de la Loire ?
◮ Combien de départements/villes/habitants en région
Poitou-Charentes ?
◮ ...
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Base de notes de colles
◮ Colleurs et collés : nom, prénom, identifiant.
◮ Comment relier tout cela ; qu’est-ce qu’une colle ?
◮ Quelques questions :
◮ Quelles sont les notes de l’élève Ducobu ? Et la
moyenne ?
◮ Quelles ont été les colles avec une note ≤ 5 ?
◮ Quels colleurs ont donné des notes ≥ 17 ?
◮ Problèmes supplémentaires :
◮ Doit pouvoir être consultée par différentes
personnes.
◮ Doit pouvoir être modifiée par différentes personnes ;
pas les mêmes !
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Un annuaire
◮ « Ensemble » de personnes... nom, prénom,
téléphone, numéro sécu.
◮ Comment stocker ces données (en mémoire et sur le
disque dur) ?
◮ Quelques valeurs/lignes/enregistrements :
Gonnord Stéphane 068655**** 1711179****
Moynot Olivier 06******** 1*****
Garcia Antonio 06******** 1*****
...
◮ Quelques questions :
◮ Quelles sont les personnes ayant comme prénom
“Olivier” ?
◮ Quel est le nom des personnes nées en 1971 ?
◮ Qui a un nom commençant par un ’G’ ?
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Cahier des charges
◮ Ne pas tripatouiller soi-même des fichiers.
◮ Ne pas s’occuper de la façon dont sont stockées les
informations... ni où.
◮ Pouvoir collecter/fournir des informations sans
programmer. Avoir un langage de description de
requêtes.
◮ Avoir une bonne puissance d’expressivité, gérer des
entités et des relations entre elles.
◮ Autoriser des accès de différents clients.
◮ Garantir une certaine pérennité des données.
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Systèmes de Gestion de Base de
Données
◮ Un utilisateur ; des données. Et entre les deux ?
◮ Quelques scénarios :
◮ Alice va cherche un livre dans sa bibliothèque.
◮ Alice demande à Bob d’aller chercher un livre dans
sa bibliothèque.
◮ Au téléphone !
◮ Alice va chercher sur google les pages contenant
«Bob» et «coléoptère».
◮ Alice fait une requête SQLite depuis sqliteman
◮ Alice fait une requête SQL depuis Python + sqlite3
◮ Le SGBD est toujours entre l’utilisateur et les
données !
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Architecture « client-serveur »
◮ Accès direct utilisateur/base de donnée.
◮ Architecture légère.
client
serveur de basede données
client
client
crée une relation
modifie des valeurs
effectue une recherche
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Architecture « trois tiers »
◮ Tiers applicatif : intermédiaire.
◮ Rôle de gendarme/filtre/traducteur.
serveur de basede données
serveur applicatif
client
client
client
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Via sqliteman
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Via la librairie sqlite3
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Une base de données taupinale
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Villes, départements et régions◮ Schéma relationnel :
communes(id integer, dep integer, nom text,
pop integer)
◮ Nom des villes de plus de 100000 habitants ?
SELECT nom FROM communes WHERE pop>=100000;
41, dont deux « Saint-Denis »
SELECT DISTINCT nom FROM communes WHERE pop>=100000;
◮ Population vivant dans des villes française ?
SELECT COUNT(pop) FROM communes;
36705... pas bézef ! !
SELECT SUM(pop) FROM communes;
64612967 : mieux !
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Premières jointures◮ Autres tables :
departements(id integer, reg integer, nom text)
regions(id integer, nom text)
◮ Quels sont les noms des villes de la Loire ?
SELECT communes.nom FROM
communes JOIN departements
ON communes.dep = departements.id
WHERE departements.nom = ’Loire’;
◮ Combien de départements/villes/habitants en région Poitou-Charentes ?
SELECT COUNT(*) FROM
regions JOIN departements
ON regions.id = departements.reg
WHERE regions.nom = ’Poitou-Charentes’;
SELECT COUNT(*) FROM
regions JOIN departements JOIN communes
ON regions.id = departements.reg AND communes.dep = departements.id
WHERE regions.nom = ’Poitou-Charentes’;
SELECT SUM(pop) FROM
regions JOIN departements JOIN communes
ON regions.id = departements.reg AND communes.dep = departements.id
WHERE regions.nom = ’Poitou-Charentes’;
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Colleurs et collés◮ Schéma relationnel :
colleurs(idc integer, nom tet, prenom text)
eleve(idc integer, nom tet, prenom text)
colle(idc integer, ide integer, date text, note integer)
◮ Quelles sont les notes de l’élève Ducobu ? Et la moyenne ?
SELECT note FROM
colles JOIN eleves
ON colles.ide = eleves.ide
WHERE nom=’Ducobu’;
SELECT AVG(note) from ...
◮ Quels colleurs ont donné des notes ≥ 17 ?
SELECT DISTINCT colleurs.nom from
colles JOIN colleurs
ON colles.idc = colleurs.idc
WHERE colles.note>=18;
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Annuaire basique◮ Schéma relationnel :
personnes(nom text, prenom text, tel text, num_secu text)
◮ Quelles sont les personnes ayant comme prénom “Olivier” ?
SELECT * FROM personnes
WHERE prenom = ’Olivier’
◮ Quel est le nom des personnes nées en 1971 ? Plus dur,
n’est-ce pas ?
nom_secu = list(curseur.execute(
"""SELECT nom, secu FROM personnes"""))
res = [nom for (nom, secu) in nom_secu if secu[1:3]=’71’]
◮ Qui a un nom commençant par un ’G’ ? Idem
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Algèbre relationnelle
◮ Cadre mathématique pour être (faire ?) plus
sérieux/rigoureux.
◮ Un vocabulaire spécifique de description de données
(tuples).
◮ Une série d’opérateurs permettant de décrire
formellement les requêtes.
À moins que ce ne soit l’inverse :-)
◮ Attendu du programme : faire le lien entre :
◮ une requête en langage courant ;
◮ sa traduction en algèbre relationnelle ;
◮ sa traduction en langage SQL.
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Des maths fumeuses
◮ Un schéma relationnel :
S=((nom,texte),(prenom,texte),(classe,entier))
◮ Trois attributs, avec leur domaine (type).
◮ Une valeur (ligne/ un enregistrement) :
(nom:’Gonnord’, prenom:’Stéphane’, classe:841)
◮ Une relation (table) : ensemble de valeurs
R(S) =
{
(nom:’Gonnord’, prenom:’Stéphane’, classe:842)
(nom:’Garcia’, prenom:’Antonio’, classe:841)
(nom:’Moynot’, prenom:’Olivier’, classe:842)
(nom:’Gonnord’, prenom:’Stéphane’, classe:841)
}
(conception mauvaise ; pourquoi ?)
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
Opérateurs de l’algèbre relationnelle
◮ Quel est le nom des département dont l’identifiant est10 ou 11 ?
◮ Sélection σCond selon une condition (valeur d’un
champ, non, et, ou).
◮ Union, intersection de deux tables. Inutile ?
◮ Projection πX d’une table selon un (des) attribut(s) X .
πNom (σId=10 ou Id=11 (departements))
◮ Soit, en SQL :
SELECT nom FROM departements WHERE id in (10, 11)
Ou encore :
SELECT nom FROM departements WHERE id=10 OR id=11
Bases de données
(1/4)
Stéphane Gonnord
Problématique
Des exemples
Un cahier des charges
SGBDR, SQL :
WTF ?
Architecture
Ça ressemble à quoi ?
Le langage SQL
Modèle relationnel
Des maths un peu fumeuses
Algèbre relationnelle
C’est fini
Merci de votre attention !
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Bases de données (2/4)SQL avant la théorie
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 16 et 23 mai 2014Lycée du parc
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
PlanContexte global
Requêtes SQLFormat généralSélection, projectionOpérations ensemblistes
Joindre deux tablesProduit cartésien : non !JointureUtilité des clés
Calculs d’agrégatsPrincipeFormellementExercices
Finalement...
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Rappels◮ Base de donnée : ensemble de tables/relations.
◮ Communes◮ Départements◮ Régions
◮ Table/relation : ensemble de n-uplets/lignes/tuplesayant tous la même structure/le même schéma.
... ... ... ...1198 1 Joyeux 223
... ... ... ...69123 69 Lyon 484344
... ... ... ...◮ Schéma relationnel : décrit la structure des tables
d’une basecommune(id:entier, dep:texte, nom:texte, pop:entier)
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Autres exemples◮ Prénoms
◮ Schéma relationnel :(prenom:texte, nombre:entier, sexe:texte, annee:entier)
◮ Exemples de ligne :
(’Antonio’, 5, ’M’, 2012)(’Stéphane’, 6, ’M’, 2013)
◮ Communes/départements/régions◮ Schéma relationnel :
communes(id:entier,dep:texte,nom:texte,pop:entier)
departements(id:texte, reg:entier, nom:texte)
regions(id:entier, nom:texte)
◮ Exemples de lignes/tuples :
(’2A041’, ’2A’, ’Bonifacio’, 2955)(’2A’, 94, ’Corse-du-Sud’)
(94, ’Corse’)
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Communes, régions et départements
commune
id dep nom pop
. . . . . . . . . . . .69023 69 Lyon 484344
. . . . . . . . . . . .2BO50 2B Calvi 5394
. . . . . . . . . . . .
departement
id reg nom
. . . . . . . . .69 82 Rhône. . . . . . . . .2B 94 Haute-Corse. . . . . . . . .
region
id nom
. . . . . .82 Rhône-Alpes. . . . . .94 Corse. . . . . .
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Élèves, colleurs et colles
eleves
id nom prenom
0 Lyons Jacques-Louis1 Laurent Jean
. . . . . . . . .
profs
id nom prenom
0 Théron Pierre1 Brun Jules
. . . . . . . . .
colles
prof eleve semaine note
2 8 1 161 0 6 19
. . . . . . . . . . . .
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
SQL, DDL, DML : WTF ?◮ SQL : Structured Query Language (the name of the
game ; « sequel »).
◮ DDL : Data Definition Language. CREATE, DROP. Pour
créer/supprimer une table dans une BD, selon un
schéma relationnel.
◮ DML : Data Manipulation Language. INSERT,UPDATE, DELETE. Pour alimenter les tables d’une
BD : nouvelle ligne, suppression, modification.
◮ Interrogation des données : SELECT. Pour faire une
requête.
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Format général
SELECT <expressions>
FROM <tables>
WHERE <conditions>
GROUP BY <attributs>
HAVING <conditions>
ORDER BY <attributs>
Dans telles tables, tu prends les lignes vérifiant tellesconditions ; tu les groupes selon tels critères. Dans lesgroupes, tu va juste prendre ceux dont telle moyenne (parexemple) sur tel attribut vérifie telle condition.Ah et puis tu vas me donner le résultat sous forme triéeselon tels attributs !
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Un exemple musclé
Wow !SELECT eleve, eleves.nom, COUNT(*) AS plantages
FROM eleves JOIN colles
ON eleve = ide
WHERE note<8
GROUP BY eleve
HAVING plantages>=5
ORDER BY plantages
Alors, que vient-on de demander ?
Don’t panic... on va commencer par des choses plus
simples !
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Sélection, projection◮ Requête de base :
SELECT <tels attributs>
FROM <telle table>
WHERE <telle(s) condition(s)>
◮ Exemples :◮ SELECT *
FROM communes
◮ SELECT nom,pop
FROM communes
◮ SELECT nom,pop
FROM communes
WHERE pop > 100000
◮ SELECT *
FROM triangles
WHERE ab = bc AND bc = ac
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Opérations ensemblistes◮ Union, intersection, différence : Bof...
◮ Rarement utile...◮ Souvent déconnant (torchons, serviettes...)
◮ SQL :◮ SELECT ... FROM ... UNION SELECT ... FROM ...◮ SELECT ... FROM ... INTERSECT SELECT ... FROM ...◮ SELECT ... FROM ... EXCEPT SELECT ... FROM ...
◮ Et si les attributs sont différents ? Je ne veux même
pas savoir ce qui se passe !
◮ Produit cartésien :◮ Définition : comme en maths :
A×B = {(a,b) |a ∈ A et b ∈ B}
◮ SQL : pas comme en maths !SELECT * from table1 , table2
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
De l’inutilité du produit cartésien◮ Deux tables :
commune
nom dep
Lyon 69Calvi 2BCorte 2B
departement
id nom
69 Rhône2B Haute-Corse
◮ Et leur produit :commune×departement
nom dep id nom
Lyon 69 69 RhôneLyon 69 2B Haute-CorseCalve 2B 69 RhôneCalvi 2B 2B Haute-CorseCorte 2B 69 RhôneCorte 2B 2B Haute-Corse
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Jointure◮ Deux tables :
commune
nom dep
Lyon 69Calvi 2BCorte 2B
departement
id nom
69 Rhône2B Haute-Corse
◮ Et leur jointure naturelle :commune⋊⋉departement
nom dep id nom
Lyon 69 69 RhôneCalvi 2B 2B Haute-CorseCorte 2B 2B Haute-Corse
◮ Une base de données est pensée dès le départautour des jointures de tables.
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Jointure◮ Formellement : R1 ⋊⋉
a=bR2 ⊂ R1 ×R2...
◮ Et si R1 et R2 ont deux attributs de même nom ?
◮ En SQL : deux syntaxes équivalentes :
◮ SELECT ...
FROM table1 JOIN table2
ON condition
WHERE...
◮ SELECT ...
FROM table1 , table2
WHERE condition AND ...
◮ SQL, encore :
◮ WHERE table1.foo = table2.bar
◮ SELECT ...
FROM table1 JOIN table2 JOIN table3
ON condition1 AND condition2
WHERE...
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Exemples, utilité des clés◮ Clé : ensemble d’attributs caractérisant les éléments
d’une table.
◮ Clé primaire : UN attribut caractérisant les élémentsd’une table.
◮ Bien avoir le schéma relationnel devant les yeux.◮ Exemples :
◮ FROM communes JOIN departements
ON communes.dep = departements.id
◮ FROM eleves JOIN colles
ON ide = eleve
◮ FROM eleves JOIN colles JOIN profs
WHERE ide = eleve AND prof = idp
◮ FROM clubs c1 JOIN matchs JOIN clubs c2
ON c1.idc = eq1 AND c2.idc=eq2
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Agrégats◮ Principe :
◮ On regroupe (en général) les lignes suivant desattributs ;
◮ on applique une fonction d’agrégation à chacun deces groupes.
◮ Fonctions : MIN, MAX, COUNT(...), AVG, SUM(...)
◮ SQL :
SELECT reg,departements.nom,count(*)
FROM departements JOIN regions
ON reg = regions.id
GROUP BY reg
reg nom count(*)
1 Guadeloupe 111 Seine-et-Marne 8. . . . . . . . .
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Agrégats◮ Condition en amont (WHERE) et/ou aval (HAVING)
SELECT reg,departements.nom,count(*)
FROM departements JOIN regions
ON reg = regions.id
GROUP BY reg
HAVING count(*)>=5
reg nom count(*)
11 Seine-et-Marne 824 Cher 6. . . . . . . . .
◮ À retenir :
On projette les attributs selon lesquels on a groupé
les lignes.
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
ExercicesAvec les tables aux schémas relationnels déjà vus,déterminer...
◮ la note maximale parmi toutes les colles ;
◮ la note maximale parmi toutes les colles deJaques-Louis Lions ;
◮ la liste des moyennes des élèves ;
◮ la liste des départements avec leur nombre decommunes ;
◮ le département qui a le plus de communes ;
◮ le département qui est le plus peuplé.
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
Un algorithme de conception de requêtesPlusieurs passages sont possibles...
1. SELECT : quels attributs (et/ou agrégats) nousintéressent ?
2. FROM : issus de quelles tables ?
3. JOIN ... ON : si on joint n tables, il y a a priori n−1conditions de jointures.
4. WHERE : quelles conditions/restrictions en amont ?
5. GROUP BY : comment veut-on regrouper les tuples ?ajouter au SELECT.
6. HAVING : restrictions en aval, portant sur lesagrégats.
7. Sous-requètes éventuelles, paramétrées ou non.
Bases de données(2/4)
Stéphane Gonnord
Contexte global
Requêtes SQLFormat général
Sélection, projection
Opérations ensemblistes
Joindre deux tablesProduit cartésien : non !
Jointure
Utilité des clés
Calculs d’agrégatsPrincipe
Formellement
Exercices
Finalement...
C’est fini
Merci de votre attention
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Bases de données (3/π)Algèbre relationnelle
Stéphane Gonnord
www.mp933.fr
Lycée du parc - Lyon
Vendredi 30 mai 2014
Lycée du parc
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Plan
L’objet du délit
Projections et sélections
Jointures
Agrégation
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Vous comprenez ça ?
γMAX(c)
(
depγCOMPTAGE:c
(
departements ⋊⋉JCD
(
σpop≥104communes)))
SELECT max(c)
FROM
(SELECT dep, COUNT(*) AS c
FROM departements JOIN communes
ON departements.id=communes.dep
WHERE pop>=10000
GROUP BY dep)
Quel est le nombre maximal de communes de plus de
10000 habitants par département ?
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
L’objet de l’algèbre relationnelle
◮ Manipuler des relations (ensembles de tuples typés).
◮ Des opérateurs pour construire des relations à partir
d’autres relations.
◮ Binaires : union, intersection, ... produit, jointure (et
division).
◮ Unaires : projections, sélections.
◮ Des opérateurs d’agrégation.
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Exemples
Trois relations différentes
communes
id dep nom pop
. . . . . . . . . . . .
69023 69 Lyon 484344
. . . . . . . . . . . .
2B050 2B Calvi 5394
. . . . . . . . . . . .
departements
id reg nom
. . . . . . . . .
69 82 Rhône
. . . . . . . . .
2B 94 Haute-Corse
. . . . . . . . .
regions
id nom
. . . . . .
82 Rhône-Alpes
. . . . . .
94 Corse
. . . . . .
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Exemples
Et trois de plus
eleves
ide nom prenom
0 Lions Jacques-Louis
1 Laurent Jean
. . . . . . . . .
profs
idp nom prenom
0 Théron Pierre
1 Brun Jules
. . . . . . . . .
colles
prof eleve semaine note
2 8 1 16
1 0 6 19
. . . . . . . . . . . .
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Projections
◮ Permet de choisir des colonnes
◮ Analogue de SELECT, attention !
◮ πA1,...,AkR ou πA1,...,Ak
(R) : on ne prend que les
attributs A1, ...,Ak
◮ Exemple :
◮ En français : «Donner les élèves (identifiants) et les
notes pour toutes les colles.»
◮ En SQL : SELECT eleve,note FROM colles.
◮ En algèbre relationnelle : πeleve,notecolles.
colles
prof eleve semaine note
2 8 1 16
1 0 6 19
. . . . . . . . . . . .
→
πeleve,notecolles
eleve note
8 16
0 19
. . . . . .
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Sélections/restrictions
◮ Permet de choisir des lignes
◮ Conditions de type WHERE ...
◮ σCR ou σC(R), avec C la condition (formule logique
portant sur les attributs)
◮ Exemple :
◮ En français : «Quelles sont les villes de plus de
10000 habitants ?»
◮ En SQL : SELECT * FROM communes WHERE
pop>=10000
◮ En algèbre relationnelle : σpop≥10000communes.
communes
id dep nom pop
69023 69 Lyon 484344
2B050 2B Calvi 5394
. . . . . . . . . . . .
σpop≥10000(communes)id dep nom pop
69023 69 Lyon 484344
79049 79 Bressuire 18615
. . . . . . . . . . . .
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
On peut composer !
◮ Exemple : nom des villes de plus de 100000
habitants : traduire en SQL et algèbre relationnelle.
◮ SELECT nom FROM communes WHERE
pop>=100000
◮ πnomσpop≥105communes.
Exercice
Est-ce que ça commute ?
πnomσpop≥105communes =?σpop≥105πnomcommunes
πeleve,noteσnote≥19colles =?σnote≥19πeleve,notecolles
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Produit : beurk◮ Deux tables :
communes
nom dep
Lyon 69
Calvi 2B
Corte 2B
departements
id nom
69 Rhône
2B Haute-Corse
◮ Et leur produit :
communes×departements
nom dep id nom
Lyon 69 69 Rhône
Lyon 69 2B Haute-Corse
Calve 2B 69 Rhône
Calvi 2B 2B Haute-Corse
Corte 2B 69 Rhône
Corte 2B 2B Haute-Corse
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Jointure : produit avec sélection
◮ Formellement :
R1⋊⋉C
R2 = σC(R1 ×R2)
◮ t1 JOIN t2 ON (C) et t1,t2 WHERE (C) sont
proches... mais différentes !
◮ Par exemple : C = (dep = id)
communes ⋊⋉
Cdepartements
nom dep id nom
Lyon 69 69 Rhône
Calvi 2B 2B Haute-Corse
Corte 2B 2B Haute-Corse
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Fonctions d’agrégation
◮ But : regrouper des lignes, et évaluer une fonction sur
ces regroupements.
◮ Syntaxe strange :
A1,...,Akγf1(B1),...,fi(Bi)table
◮ « Regroupe selon les attributs Ai , et calcule les
valeurs fi sur les attributs Bi »
◮ SQL :
SELECT A1,..,Ak,f1(B1),...,fi(Bi)
FROM table
GROUP BY A1,...,Ak
◮ Attention, les autres champs sont perdus ! En
particulier lors du calcul du maximum !
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
Exemples
◮ Population des différents départements :
depγSOMME(pop)(communes)
◮ Avec le nom du département ?
σn
(
dep,departements.nom:nγSOMME(pop)(R))
,
où R = communes ⋊⋉ departements
◮ Moyenne des différents élèves ? (sans les noms)
eleve,mγMOYENNE(note):mcolles
◮ Et enfin :
γMAX(c)
(
depγCOMPTAGE:c
(
departements ⋊⋉JCD
(
σpop≥104 communes)))
Bases de données
(3/π)
Stéphane Gonnord
L’objet du délit
Projections et
sélections
Jointures
Agrégation
C’est fini
Merci de votre attention