This commit is contained in:
2022-07-21 15:38:24 +02:00
parent 6a7b093870
commit d5d02f32ec
25 changed files with 423 additions and 3 deletions

BIN
Progression.xlsx Normal file

Binary file not shown.

View File

@@ -1,6 +1,6 @@
> En informatique, on retrouve fréquemment des problèmes d'optimisation comme par exemple le problème du **rendu de monnaie**. Les algorithmes gloutons sont utilisés pour résoudre ce type de problème.
### Le Programme
## Le Programme

Binary file not shown.

BIN
architecture/M999.zip Normal file

Binary file not shown.

BIN
architecture/M999/README.pdf Executable file

Binary file not shown.

View File

@@ -0,0 +1,39 @@
---
title: M999 - jeu d'instructions 2
author: Philippe BODDAERT
---
# 1. Contexte
Le processeur M999 est doté d'un jeu d'instructions.
Une instruction est un mot de 3 chiffres, appelé _opcode_, correspondant à une opération à effectuer par le processeur.
Le premier chiffre de l'opcode détermine le type de l'opération (copie, opération arithmétique, saut d'instruction ...).
Les deux derniers chiffres indiquent, selon le type de l'opération, une adresse mémoire, un registre, un sous-type d'opération...
# 2. Jeu d'instructions
| op0 | op1 op2 | instruction à réaliser |
| ----- | --------- | ------------------------------------------------------------ |
| 0 | _addr_ | copie le mot mémoire dadresse _addr_ dans le registre A |
| 1 | _addr_ | copie le mot mémoire dadresse _addr_ dans le registre B |
| 2 | _addr_ | copie le contenu du registre R dans le mot mémoire d'adresse _addr_ |
| 3 | 0 0 | ajoute les valeurs des registres A et B, produit le résultat dans R |
| 3 | 0 1 | soustrait la valeur du registre B à celle du registre A, produit le résultat dans R |
| 3 | 0 2 | divise la valeur du registre A par 2, le quotient est placé dans R, le reste dans B |
| 3 | 0 3 | multiplie la valeur du registre A par 2, le résultat est placé dans R |
| 3 | 9 9 | ne fait rien |
| 4 | _rs_ _rd_ | copie la valeur du registre source _rs_ dans le registre destination _rd_ |
| 5 | _addr_ | branche en _addr_ (PC reçoit la valeur _addr_) |
| 6 | _addr_ | branche en _addr_ si la valeur du registre R est strictement positive |
Les registres (_rs_, _rd_) sont désignés par les valeurs suivantes :
valeur | registre
:------: | :--------:
0 | A
1 | B
2 | R

View File

@@ -0,0 +1,36 @@
---
title: M999 - jeu d'instructions
author: Philippe BODDAERT
---
# 1. Contexte
Le processeur M999 est doté d'un jeu d'instructions.
Une instruction est un mot de 3 chiffres, appelé _opcode_, correspondant à une opération à effectuer par le processeur.
Le premier chiffre de l'opcode détermine le type de l'opération (copie, opération arithmétique, saut d'instruction ...).
Les deux derniers chiffres indiquent, selon le type de l'opération, une adresse mémoire, un registre, un sous-type d'opération...
# 2. Jeu d'instructions
| op0 | op1 op2 | instruction à réaliser |
| ----- | --------- | ------------------------------------------------------------ |
| 0 | _addr_ | copie le mot mémoire dadresse _addr_ dans le registre A |
| 1 | _addr_ | copie le mot mémoire dadresse _addr_ dans le registre B |
| 2 | _addr_ | copie le contenu du registre R dans le mot mémoire d'adresse _addr_ |
| 3 | 0 0 | ajoute les valeurs des registres A et B, produit le résultat dans R |
| 3 | 0 1 | soustrait la valeur du registre B à celle du registre A, produit le résultat dans R |
| 3 | 9 9 | ne fait rien |
| 4 | _rs_ _rd_ | copie la valeur du registre source _rs_ dans le registre destination _rd_ |
| 5 | _addr_ | branche en _addr_ (PC reçoit la valeur _addr_) |
| 6 | _addr_ | branche en _addr_ si la valeur du registre R est strictement positive |
Les registres (_rs_, _rd_) sont désignés par les valeurs suivantes :
valeur | registre
:------: | :--------:
0 | A
1 | B
2 | R

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
architecture/M999/assets/m999.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View File

@@ -0,0 +1,194 @@
## Le processeur **papier** : **M99**
Pour étudier le fonctionnement d'une machine de Von Neumann, nous allons travailler sur du papier !
Cette machine est issue des travaux de Philippe Marquet et Martin Quinson github.com/InfoSansOrdi/M999, enseignants chercheurs en informatique.
![M99](../assets/m99.png)
Le M99 est une machine dotée de 100 cases mémoire (la grille en haut de la feuille), et d'un processeur (en bas de la feuille).
On peut diviser ce processeur en trois (3) parties distinctes :
- La mémoire
- Composée de 100 cases "***mots mémoire"*** de 3 chiffres (valeur de 000 à 999).
- Ces espaces sont accessibles par des adresses codées sur 2 chiffres. Cette mémoire va contenir données et instructions.
Le processeur dispose de deux registres généraux nommés A et B, et d'un registre accumulateur/résultat nommé R. Ces registres sont de 3 chiffres, mais au contraire de la mémoire, ils ont un signe. Ils peuvent donc contenir des valeurs comprises entre -999 et 999.
Le processeur dispose aussi d'un quatrième registre nommé PC (Program Counter). C'est le pointeur d'instruction, contenant l'adresse mémoire de la prochaine instruction à exécuter. Lorsqu'on utilise le M99, on peut noter le numéro de l'instruction à exécuter dans la case prévue à cette effet, mais en pratique, il est plus simple de le matérialiser avec un "pion" situé sur une des cases de la grille mémoire, ou même de suivre avec son doigt.
## Unité arithmétique et logique
L'unité arithmétique et logique UAL est en charge d'effectuer les calculs. Les opérandes et résultats sont dans les registres, A et B pour les opérandes, R pour le résultat.
## Unité de commande
L'unité de commande pilote l'ordinateur. Son cycle de fonctionnement comporte 3 étapes :
1. charger l'instruction depuis la case mémoire pointée par PC vers la zone dédiée dans l'UAL (la case sous le registre PC). Incrémenter ensuite le PC.
2. décoder l'instruction : à partir des 3 chiffres codant l'instruction, identifier quelle est lopération à réaliser en utilisant le pense-bête à droite de l'UAL.
3. exécuter l'instruction.
## Jeu d'instruction
| code | mnémonique | instruction à réaliser |
| ----- | --------------------------------------- | ------------------------------------------------------------ |
| 0 x y | `STR xy` | copie le contenu du registre R dans le mot mémoire d'adresse *xy* |
| 1 x y | `LDA xy` | copie le mot mémoire dadresse *xy* dans le registre A |
| 2 x y | `LDB xy` | copie le mot mémoire dadresse *xy* dans le registre B |
| 3 x y | `MOV x y` | copie registre Rx dans Ry (R0: R; R1: A; R2: B) |
| 4 - - | **opérations arithmétique et logiques** | |
| 4 0 0 | `ADD` | ajoute les valeurs des registres A et B, produit le résultat dans R |
| 4 0 1 | `SUB` | soustrait la valeur du registre B à celle du registre A, produit le résultat dans R |
| . . . | etc | … |
| 5 x y | `JMP x y` | branche en *xy* (PC reçoit la valeur *xy*) |
| 6 x y | `JPP x y` | branche en *xy* si la valeur du registre R est positive |
| 7 x y | `JEQ x y` | saute une case (PC += 2) si la valeur du registre R est égale à *xy* |
| 8 x y | `JNE x y` | saute une case (PC += 2) si la valeur du registre R est différent de *xy* |
Notez que pour JEQ et JNE, on a `PC += 2` si la condition est respectée car l'opération saute une case (PC++) après l'étape de chargement par l'unité de commande (PC++).
### Boot et arrêt
La machine démarre avec la valeur nulle comme pointeur d'instruction (PC=0) et elle s'arrête si le pointeur d'instruction vaut 99.
On peut donc utiliser le mnémonique `HLT` comme synonyme de `JMP 99`.
### Entrées/sorties
Les entrées/sortries sont "mappées" en mémoire: Écrire le mot mémoire 99 écrit sur le terminal, tandis que les valeurs saisies sur le terminal seront lues dans le mot mémoire 99.
# Exercice 1
Objectifs:
- prise en main du M99
- comprendre l'encodage des opcode dans la mémoire
- comprendre le cycle fetch/decode/execute
## Q1: Que fait le programme chargé à l'adresse 0 ?
Pour répondre, il faut appliquer le cycle fetch/decode/exec aux données qui sont dans les premières adresses de la mémoire. Traduire les valeurs numériques en mémoire est nécessaire.
```
00: LDA 10 // Charge le contenu de la case 10 dans le registre A
01: LDB 11 // Charge le contenu de la case 11 dans le registre B
02: SUB // R := A - B
03: JPP 7 // Si R > 0 alors PC := 7
04: MOV B R // B := A
05: STR 99 // Copie R en 99, c'est-à-dire, affiche R à l'écran
06: JMP 99 // Arrête le programme
07: MOV A R // A := B
08: STR 99 // Copie R en 99, donc affiche R à l'écran
09: JMP 99 // Arrête le programme
10: 123 // Utilisé seulement comme une donnée, sans signification
11: 42 // Utilisé seulement comme une donnée, sans signification
```
Donc au final, ce programme affiche 123, car 123 > 42.
## Q2: Que fait le programme débutant à l'adresse 13?
```
13: LDA 99 // Charge une entrée utilisateur dans A
14: MOV A R // R := A
15: STR 10 // Copie l'entrée utilisateur en 10
16: LDA 99 // Charge une entrée utilisateur dans A
17: MOV A R // R := A
18: STR 11 // Copie l'entrée utilisateur en 11
19: JMP 0 // Branche l'exécution sur 0
```
Donc au final, ce programme demande deux entrées à l'utilisateur avant d'exécuter le programme précédent (qui affichera le plus grand d'entre eux).
## Q3: Écrire un programme affichant le minimum de deux entrées clavier
On peut l'écrire à partir de l'adresse 20 en mémoire, et on n'a pas besoin d'écrire ce qu'on lit en mémoire puisqu'on l'utilise immédiatement.
```
20: 199; LDA 99 // input A
21: 299; LDB 99 // input B
22: 401; SUB
23: 610; JPP 27 // JMP 27 si R>0, ie si A>B
24: 320; MOV A R // Copie A dans R
25: 099; STR 99 // Affiche A
26: 599; JMP 99 // Halt
27: 320; MOV B R // Copie B dans R
28: 099: STR 99 // Affichage B
29: 599: JMP 99 // Halt
```
# Exercice 2
Objectifs:
- Modifier un programme en assembleur
- Voir l'intérêt d'un compilateur, et d'un langage de haut niveau
## Q1: Que fait le programme débutant à l'adresse 40 (pour les entrées 5 et 2)?
Il calcule le produit des deux entrées et affiche le résultat
## Q2: Peut-on raccourcir ce programme ?
On peut passer à 21 cases en stockant x et y dans les cases 40 et 41 car on n'a plus besoin de ce code une fois qu'on l'a exécuté.
Il faut ensuite déplacer les cases 61 et 62 (qui sont respectivement la valeur 1 et le résultat) dans les cases 59 et 60. Cette opération est plus simple en *nommant les variables*, c'est à dire en écrivant par exemple "LDB un" à la place de "LDB 61" dans la case 51.
On peut même tomber à 19 cases en utilisant une ruse: au lieu d'énumérer les trois opérations nécessaires pour afficher le contenu de A avant de s'arrêter, on branche vers l'endroit du programme 1 qui fait cela (JMP 04).
Notez que réutiliser les bouts d'un autre programme en sautant au milieu de son code est considéré comme "très sale" par la plupart des programmeurs. En pratique on ne veut absolument jamais faire quelque chose d'aussi dangereux avec de vrais programmes car cela les rend difficile à lire et à comprendre. On ne fait pas des programmes que pour la machine, mais aussi (surtout) pour que d'autres humains les comprennent.
```
56: 310: MOV A R -> 56: 504: JMP 04
57: 099: STR 99
58: 599: HLT
```
## Q3: Corrigez ce programme quand la seconde entrée vaut 0
En effet, notre programme calcule par exemple 5*0 = 5 car il ajoute x au résultat dans tous les cas. Pour corriger, il faut d'abord vérifier s'il y a besoin d'ajouter x et ensuite seulement le faire.
La première solution est d'ajouter un JMP juste avant la boucle pour entrer au bon endroit de la boucle (sur le décrément de y). Mais cela fait un code spagetti assez désagréable.
La seconde solution est de réécrire le corps de boucle pour faire le décrément du compteur avant l'addition au résultat, au prix de légères contortions pour sortir de la boucle au bon moment
```
46: 162: LDA res -> 46: 162: LDA y
47: 259: LDB x 47: 261: LDB un
48: 400: ADD 48: 401: SUB
49: 062: STR res 49: 899: JNE 99 // on suppose que -1 overflow en 99
50: 160: LDA y 50: 556: JMP fin // Sort de la boucle
51: 261: LDB un 51: 162: LDA res
52: 401: SUB 52: 259: LDB x
53: 060: STR y 53: 400: ADD
54: 646: JPP 46 54: 062: STR res
55: 546: JMP 46 // Retour début boucle
56: 162: LDA res
57: 504: JMP 04 // Utilise la fin du prog 1
```
L'instruction de la ligne 49 est assez discutable. Son objectif est de tester si R==-1, mais on n'a pas de nombres négatifs dans la mémoire. On suppose donc ici qu'un nombre négatif en registre sera traduit en son complément à 100 à l'usage. C'est assez réaliste de ce que font les vrais ordinateurs.
Au final, les deux solutions sont assez diffiles à relire: soit on commence la première boucle en sautant au milieu, soit on sort de la dernière boucle en sautant depuis le milieu. C'est quand même plus simple d'utiliser un langage de haut niveau et un compilateur :)
# Lien à l'informatique
Le M99 est un ordinateur en papier, assez simple à utiliser avec seulement un crayon, mais il a été pensé pour être relativement réaliste des vrais ordinateurs.
- La mémoire d'un vrai ordinateur est également découpée en mots mémoires, chacun étant doté d'une adresse unique. En général, les vrais ordinateurs utilisent des mots de 1 octet (8 bits). Les ordinateurs 32bits peuvent avoir jusqu'à 2³² mots (soit un peu plus de 4Go de mémoire) tandis que les ordinateurs 64bits peuvent en avoir jusqu'à 2⁶⁴ en théorie (18 Exaoctets, 18.10¹⁸ octets).
- Les vrais processeurs ont également des registres afin de gérer au mieux le problème de la barrière mémoire. Ils ont également des caches pour optimiser les échanges entre la mémoire et le CPU. Là où lire en mémoire peut demander une centaine de cycles CPU, lire en cache prend entre 10 et 30 cycles. Le M99 n'a pas de caches pour simplifier.
- Les vrais programmes sont également écrits sous forme d'opcodes en mémoire des vrais ordinateurs, avec le préfixe indiquant l'opération tandis que le sufixe indique les opérandes. Le jeu d'opérations élémentaires disponibles varie beaucoup d'un processeur à l'autre.
Pour le M99, nous avons choisi d'utiliser des mots mémoires de trois positions décimales, ce qui contraint fortement le nombre d'instructions disponibles. Ces contraintes sont parfaitement réalistes de celles que doivent résoudre les fabriquants de CPU. Ajouter des instructions simplifie l'écriture de programmes efficaces, mais complique grandement le processeur, qui devient plus cher et plus énergivore.
Les processeurs de la famille RISC (reduced instruction set CPU) visent la simplicité et n'offrent que peu d'instructions tandis que ceux de la famille CISC (complex instruction set CPU) offrent des opérations optimisées plus rares, comme des opérations vectorielles.
Il serait faux de dire que l'une des familles est vraiment préférable à l'autre. Il s'agit plutôt de deux compromis différents entre complexité du processeur et complexité des programmes. Les processeurs des téléphones portables sont souvent des RISC (par exemple du constructeur ARM) tandis que ceux des ordinateurs sont souvent des CISC (par exemple des constructeurs Intel ou AMD).
- Gérer les entrées/sorties au travers d'adresses particulières de l'espace d'adressage du bus mémoire est parfaitement réaliste. En revanche, il est rare d'avoir plusieurs périphériques à la même adresse et on aurait pu séparer les lectures du clavier et les écritures à l'écran dans des zones mémoire différentes. De plus, nous avons ignoré toute la synchronisation qu'un vrai processeur doit faire pour échanger avec les périphériques, souvent bien plus lent.
#

View File

@@ -51,4 +51,17 @@ Le temps d'accès est le même, peu importe la cellule : on parle alors de ***RA
![mémoire](../assets/memoire.png)
![mémoire](../assets/memoire.png)
----------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -0,0 +1,57 @@
## Machine de Turing
Cette machine est constituée :
- D' un **ruban infini** divisé en cases consécutives. Chaque case contient un symbole d'un *alphabet*. L'alphabet contient un symbole spécial appelé « symbole blanc », et un ou plusieurs autres symboles. Le ruban est supposé être de longueur infinie vers la gauche ou vers la droite, en d'autres termes la machine doit toujours avoir assez de longueur de ruban pour son exécution. On considère que les cases du ruban contiennent par défaut le « symbole blanc » .
- Une **tête de lecture/écriture** (ci-dessous le **`V`**) qui peut lire et écrire les symboles sur le ruban, et se déplacer vers la gauche ou vers la droite du ruban
- Un **registre d'état** qui mémorise l'état courant de la machine de Turing. Le nombre d'états possibles est toujours fini, et il existe un état spécial appelé « état de départ » qui est l'état initial de la machine avant son exécution.
- Une **table d'actions** qui indique à la machine quel symbole écrire sur le ruban, comment déplacer la tête de lecture (vers la droite ou la gauche), et quel est le nouvel état, en fonction du symbole lu sur le ruban et de l'état courant de la machine. Si aucune action n'existe pour une combinaison donnée d'un symbole lu et d'un état courant, la machine s'arrête.
**Exemple : voici l'algorithme permettant d'ajouter 1 à un nombre binaire.**
Choisissez un nombre binaire et écrivez le à droite de la tête de lecture (par exemple 101).
| | | | | | | | | | | V | | | | | | | | | |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| | | | | | | | | | | | 1 | 0 | 1 | | | | | | |
Réalisez pas à pas l'algorithme ci-dessous :
- la machine lit chaque case de gauche à droite jusqu'à tomber sur une case vide. Il y a alors deux cas possibles:
- Si la dernière case mémorisée dans le registre d'état est un 0 alors la machine se décale d'une case à gauche et écrit 1 puis retourne dans sa position initiale. .
- Si la dernière case est un 1, la machine se décale d'une case à gauche et :
- si cette case vaut 1, elle écrit 0 puis se décale à gauche et recommence le point précédent.
- si cette case vaut 0 ou est vide, elle écrit 1 puis retourne à sa position initiale.
*Etape 1* : la machine va à droite jusqu'à la première case vide.
| | | | | | | | | | | | | | | V | | | | | |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| | | | | | | | | | | | 1 | 0 | 1 | | | | | | |
*Etape 2* : la dernière case lue est ... donc ...
| | | | | | | | | | | | | | V | | | | | | |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| | | | | | | | | | | | 1 | 0 | 0 | | | | | | |
*Etape 4* : ...
| | | | | | | | | | | | | V | | | | | | | |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| | | | | | | | | | | | 1 | 1 | 0 | | | | | | |
*Etape 5* : ...
| | | | | | | | | | | V | | | | | | | | | |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| | | | | | | | | | | | 1 | 1 | 0 | | | | | | |
Vous trouverez [sur ce site](http://zanotti.univ-tln.fr/turing/turing.php) un simulateur d'une machin de de Turing si vous souhaitez aller plus loin.
ll faut garder à l'esprit que la machine de Turing est un modèle universel de calcul et qu'elle peut calculer tout ce que n'importe quel ordinateur physique peut calculer (aussi puissant soit-il). In­ver­sement, ce qu'elle ne peut pas calculer ne peut l'être non plus par un ordinateur. Elle résume donc de manière saisissante le concept d'*ordinateur* et constitue un support idéal pour raisonner autour de la notion d'*algorithme* de *calcul* ou de *démonstration*. En terminale, nous étudierons plus en détail le concept de calculabilité.

9
assets/CC-BY-SA.svg Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd' [<!ENTITY st0 "fill:#AAB2AB;"><!ENTITY st1 "fill:#FFF;">]>
<svg xmlns="http://www.w3.org/2000/svg" height="31px" width="88px" version="1.1" y="0px" x="0px" viewBox="0 0 88 31">
<title>Creative Commons “Attribution-Share Alike” license icon</title>
<path d="m2.499 0.352l83.127 0.148c1.161 0 2.198-0.173 2.198 2.333l-0.102 27.552h-87.321v-27.655c0-1.235 0.119-2.378 2.098-2.378z" fill="#AAB2AB"/>
<path d="m25.316 14.449c0.003 5.557-4.471 10.065-9.993 10.069-5.522 0.003-10.001-4.5-10.005-10.057v-0.012c-0.003-5.558 4.471-10.066 9.994-10.069 5.522-0.004 10.001 4.5 10.005 10.057-0.001 0.003-0.001 0.007-0.001 0.012zm21.148-11.143c4.349 0 7.875 3.548 7.875 7.925s-3.526 7.926-7.875 7.926c-4.35 0-7.875-3.548-7.875-7.926-0.001-4.377 3.525-7.925 7.875-7.925zm28.632 7.751c0.003 4.314-3.47 7.814-7.757 7.818-4.286 0.003-7.765-3.492-7.769-7.806v-0.012c-0.002-4.314 3.471-7.814 7.758-7.817s7.765 3.492 7.768 7.806v0.011z" fill="#FFF"/>
<path d="m23.446 6.252c2.217 2.232 3.326 4.964 3.326 8.197s-1.089 5.936-3.269 8.11c-2.313 2.289-5.046 3.434-8.2 3.434-3.116 0-5.802-1.135-8.057-3.405-2.256-2.271-3.383-4.982-3.383-8.138s1.127-5.889 3.383-8.198c2.198-2.232 4.884-3.348 8.057-3.348 3.212 0 5.926 1.116 8.143 3.348zm-14.707 1.501c-1.875 1.905-2.812 4.138-2.812 6.698 0 2.561 0.928 4.773 2.783 6.64s4.064 2.801 6.627 2.801 4.791-0.942 6.684-2.829c1.797-1.752 2.697-3.955 2.697-6.611 0-2.636-0.914-4.874-2.74-6.712s-4.04-2.757-6.641-2.757-4.801 0.923-6.598 2.77zm4.933 5.572c-0.287-0.628-0.715-0.942-1.287-0.942-1.011 0-1.516 0.685-1.516 2.054 0 1.37 0.505 2.055 1.516 2.055 0.667 0 1.145-0.333 1.431-1.002l1.401 0.751c-0.668 1.194-1.67 1.792-3.006 1.792-1.03 0-1.856-0.317-2.476-0.954-0.621-0.636-0.931-1.512-0.931-2.629 0-1.099 0.32-1.97 0.959-2.616s1.436-0.968 2.39-0.968c1.413 0 2.424 0.56 3.035 1.679l-1.516 0.78zm6.593 0c-0.287-0.628-0.707-0.942-1.261-0.942-1.031 0-1.547 0.685-1.547 2.054 0 1.37 0.516 2.055 1.547 2.055 0.669 0 1.137-0.333 1.404-1.002l1.433 0.751c-0.667 1.194-1.667 1.792-3.001 1.792-1.029 0-1.853-0.317-2.473-0.954-0.619-0.636-0.928-1.512-0.928-2.629 0-1.099 0.314-1.97 0.943-2.616 0.628-0.646 1.428-0.968 2.4-0.968 1.41 0 2.42 0.56 3.029 1.679l-1.546 0.78zm66.088-13.325h-84.706c-0.908 0-1.647 0.744-1.647 1.658v28.967c0 0.207 0.167 0.375 0.372 0.375h87.256c0.205 0 0.372-0.168 0.372-0.375v-28.967c0-0.914-0.739-1.658-1.647-1.658zm-84.706 0.749h84.705c0.498 0 0.903 0.408 0.903 0.909v20.109h-60.541c-2.219 4.038-6.494 6.779-11.401 6.779-4.908 0-9.183-2.738-11.4-6.779h-3.169v-20.109c0-0.501 0.405-0.909 0.903-0.909zm65.63 1.751c-2.355 0-4.349 0.827-5.98 2.481-1.675 1.712-2.512 3.737-2.512 6.077s0.837 4.351 2.512 6.034c1.674 1.683 3.668 2.524 5.98 2.524 2.342 0 4.371-0.849 6.089-2.546 1.616-1.611 2.427-3.616 2.427-6.012s-0.824-4.422-2.471-6.077c-1.645-1.654-3.66-2.481-6.045-2.481zm0.022 1.54c1.93 0 3.569 0.685 4.918 2.054 1.361 1.355 2.043 3.01 2.043 4.964 0 1.968-0.666 3.602-2.001 4.9-1.405 1.397-3.058 2.096-4.96 2.096-1.901 0-3.541-0.691-4.917-2.074-1.376-1.384-2.064-3.024-2.064-4.921s0.695-3.552 2.086-4.964c1.332-1.371 2.965-2.055 4.895-2.055zm-3.791 5.809c0.34-2.153 1.846-3.304 3.733-3.304 2.716 0 4.369 1.982 4.369 4.626 0 2.58-1.76 4.584-4.411 4.584-1.824 0-3.457-1.13-3.755-3.347h2.143c0.063 1.151 0.806 1.556 1.866 1.556 1.209 0 1.994-1.13 1.994-2.857 0-1.812-0.679-2.771-1.951-2.771-0.934 0-1.739 0.341-1.909 1.513l0.623-0.003-1.687 1.697-1.686-1.697 0.671 0.003zm-14.765-0.911c0-0.306-0.246-0.553-0.55-0.553h-3.478c-0.303 0-0.55 0.247-0.55 0.553v3.5h0.971v4.145h2.636v-4.145h0.971v-3.5zm-2.288-3.408c0.656 0 1.189 0.536 1.189 1.197s-0.533 1.197-1.189 1.197c-0.657 0-1.189-0.536-1.189-1.197s0.532-1.197 1.189-1.197zm-0.012-3.03c-2.355 0-4.349 0.827-5.981 2.481-1.675 1.711-2.512 3.737-2.512 6.076s0.837 4.351 2.512 6.034c1.674 1.683 3.668 2.524 5.981 2.524 2.342 0 4.371-0.849 6.088-2.547 1.619-1.611 2.428-3.615 2.428-6.012s-0.823-4.421-2.47-6.076c-1.645-1.654-3.661-2.48-6.046-2.48zm0.022 1.539c1.93 0 3.569 0.685 4.917 2.054 1.363 1.355 2.044 3.01 2.044 4.963 0 1.968-0.666 3.602-2.001 4.9-1.405 1.398-3.058 2.096-4.96 2.096-1.901 0-3.541-0.691-4.917-2.075-1.377-1.383-2.065-3.023-2.065-4.921 0-1.896 0.695-3.551 2.086-4.963 1.334-1.369 2.966-2.054 4.896-2.054z"/>
<path d="m69.277 24.171l1.816 4.888h-1.109l-0.367-1.089h-1.816l-0.381 1.089h-1.074l1.836-4.888h1.095zm0.062 2.997l-0.612-1.793h-0.014l-0.633 1.793h1.259zm-6.079 0.682c0.059 0.115 0.137 0.207 0.234 0.277 0.098 0.071 0.211 0.124 0.342 0.158 0.133 0.034 0.268 0.051 0.408 0.051 0.095 0 0.197-0.008 0.306-0.023s0.21-0.047 0.306-0.093c0.094-0.046 0.174-0.108 0.236-0.188 0.064-0.08 0.096-0.181 0.096-0.305 0-0.132-0.042-0.238-0.126-0.321-0.083-0.083-0.194-0.15-0.329-0.206-0.136-0.055-0.29-0.102-0.461-0.143-0.173-0.042-0.348-0.088-0.523-0.138-0.182-0.046-0.358-0.102-0.531-0.167-0.171-0.066-0.325-0.152-0.461-0.258-0.137-0.104-0.246-0.235-0.33-0.393-0.083-0.158-0.125-0.349-0.125-0.572 0-0.252 0.053-0.469 0.16-0.654 0.105-0.184 0.246-0.338 0.418-0.462 0.172-0.123 0.366-0.214 0.584-0.274 0.217-0.059 0.436-0.088 0.652-0.088 0.254 0 0.497 0.028 0.73 0.086 0.232 0.057 0.44 0.149 0.621 0.277 0.182 0.127 0.326 0.291 0.432 0.49 0.107 0.198 0.16 0.439 0.16 0.723h-1.036c-0.009-0.146-0.04-0.268-0.091-0.363-0.053-0.096-0.121-0.172-0.207-0.227s-0.184-0.094-0.295-0.115c-0.11-0.023-0.23-0.035-0.361-0.035-0.086 0-0.172 0.01-0.258 0.027-0.086 0.019-0.163 0.051-0.232 0.096-0.07 0.047-0.129 0.104-0.174 0.172s-0.067 0.155-0.067 0.26c0 0.096 0.019 0.174 0.054 0.232 0.037 0.061 0.109 0.115 0.215 0.165s0.254 0.101 0.441 0.151c0.188 0.049 0.434 0.113 0.736 0.191 0.092 0.018 0.217 0.051 0.377 0.1 0.161 0.047 0.32 0.123 0.479 0.229 0.159 0.105 0.296 0.246 0.412 0.422 0.115 0.176 0.173 0.4 0.173 0.674 0 0.225-0.044 0.432-0.13 0.623-0.086 0.192-0.214 0.357-0.384 0.496-0.171 0.141-0.381 0.248-0.632 0.326-0.252 0.078-0.544 0.116-0.874 0.116-0.268 0-0.527-0.033-0.779-0.1-0.251-0.065-0.474-0.171-0.667-0.312-0.192-0.143-0.346-0.323-0.459-0.543-0.113-0.219-0.168-0.479-0.163-0.78h1.036c-0.001 0.165 0.028 0.304 0.087 0.418zm-17.287-3.679h1.198l1.138 1.931 1.13-1.931h1.19l-1.803 3.012v1.876h-1.07v-1.903l-1.783-2.985zm-1.975 0c0.231 0 0.442 0.021 0.633 0.062s0.354 0.108 0.491 0.201c0.136 0.094 0.241 0.219 0.316 0.373 0.075 0.155 0.112 0.348 0.112 0.575 0 0.247-0.055 0.451-0.167 0.616-0.11 0.164-0.276 0.298-0.493 0.402 0.3 0.088 0.523 0.239 0.672 0.456 0.148 0.218 0.223 0.479 0.223 0.784 0 0.246-0.049 0.46-0.144 0.641-0.095 0.18-0.224 0.327-0.386 0.441-0.161 0.114-0.346 0.199-0.552 0.254-0.207 0.055-0.419 0.082-0.638 0.082h-2.358v-4.888h2.291v0.001zm-0.137 1.976c0.191 0 0.347-0.046 0.47-0.136 0.123-0.092 0.185-0.239 0.185-0.444 0-0.114-0.021-0.208-0.062-0.28s-0.095-0.129-0.164-0.17-0.146-0.07-0.235-0.086c-0.089-0.016-0.181-0.023-0.276-0.023h-1v1.14h1.082zm0.062 2.075c0.105 0 0.205-0.01 0.3-0.03 0.095-0.021 0.18-0.055 0.252-0.104 0.073-0.047 0.13-0.112 0.174-0.194s0.065-0.187 0.065-0.315c0-0.25-0.071-0.43-0.212-0.536-0.141-0.107-0.328-0.161-0.559-0.161h-1.166v1.341h1.146z" fill="#FFF"/>
</svg>

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
basthon-desktop-full Normal file

Binary file not shown.

View File

@@ -187,4 +187,13 @@ Ainsi que celle- ci :
----------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -225,3 +225,12 @@ Ainsi que celle- ci :
------------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -51,3 +51,13 @@ def fusion(table_1, table_2, cle_1, cle_2=None):
return table_finale
```
--------------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -128,3 +128,11 @@ Quel est le résultat affiché ?
---------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -160,3 +160,15 @@ def vers_csv(nom, ordre):
return None
```
----------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

View File

@@ -47,3 +47,27 @@ Il devrait donc se trouver dans zone. On peut alors trouver ses cinq ou six plus
### Formulation de l'algorithme
--------------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

Binary file not shown.

BIN
~$Progression.xlsx Normal file

Binary file not shown.