Aller au contenu principal

TP1 đŸ„• Calcul de racines

Explications

Une vidéo expliquant en détail le TP et fournissant quelques conseils est disponible en bas de page.

🧠 Contexte

Un ordinateur, c’est trĂšs rapide, mais pas trĂšs intelligent. On va en profiter pour lui faire calculer la racine carrĂ©e
 de façon trĂšs bĂȘte.

Vous devez implĂ©menter deux mĂ©thodes de calcul « brutales » d’une racine carrĂ©e :

  1. une méthode par dichotomie (réduction d'un intervalle)
  2. une méthode chiffre par chiffre (par essais successifs)

Puis vous devrez :

  1. comparer ces méthodes à la fonction standard math.sqrt() en termes de performance
  2. étendre le calcul à une racine n-iÚme
🎯 Objectifs pĂ©dagogiques

À la fin de ce travail, vous serez capable de :

  • Utiliser des variables, types de base, opĂ©rateurs et fonctions
  • Utiliser des structures conditionnelles et expressions logiques
  • Utiliser des structures rĂ©pĂ©titives
  • DĂ©composer un algorithme en fonctions rĂ©utilisables
  • Évaluer la performance d’un algorithme avec des mesures de temps
  • Appliquer la logique pour rĂ©soudre un problĂšme numĂ©rique complexe sans bibliothĂšque
  • Valider le fonctionnement de vos algorithmes Ă  l'aide de jeux d'essais
Créer le projet

Pour faire ce TP, vous devez créer un nouveau projet PyCharm et utiliser un répertoire GitHub dÚs le début.

  • Si votre enseignant utilise GitHub Classroom, utilisez le rĂ©pertoire créé par votre enseignant.
  • Si votre enseignant n'utilise pas GitHub Classroom, crĂ©ez votre propre rĂ©pertoire et partagez-lui l'accĂšs en lecture.
Plagiat

â—đŸ€– 👀 đŸš«

Si votre travail est suspecté de plagiat (code copié d'un.e autre étudiant.e, code généré par IA, notions non abordées en classe, etc.), deux choses peuvent se produire :

  • Le plagiat est prouvĂ© par nos outils : note de 0, automatiquement.
  • Le plagiat est plutĂŽt Ă©vident, mais une validation est requise : vous serez convoquĂ©(e) au bureau de votre enseignant(e). Vous devrez rĂ©pondre Ă  certaines questions pour prouver que vous comprenez et maĂźtrisez le code qui a Ă©tĂ© utilisĂ©. Si vous ne rĂ©ussissez pas Ă  rĂ©pondre Ă  certaines questions, vous aurez la note de 0 (si vous ne comprenez pas votre propre code, c'est que vous avez plagiĂ©, d'une maniĂšre ou d'une autre).
1 point RĂ©pertoire Git 🐈‍⬛ et documentation des fonctions
  • Au moins 5 commits de tailles comparables (il n'y a pas un commit avec tout dedans et les autres vides)
  • Les commits dĂ©crivent l'avancement du projet dans un français sans faute (voir instructions)
  • Chaque fonction doit ĂȘtre documentĂ©e Ă  l'aide d'un docstring dans un français sans faute : description de la fonction, paramĂštres, valeur retournĂ©e, exceptions possibles, etc.
  • Votre projet doit contenir exactement ces 3 scripts Python et rien d'autre (l'ordre des scripts n'a pas d'importance) :
tp1/
├── racine.py # doit contenir vos 2 fonctions pour les 2 mĂ©thodes diffĂ©rentes du calcul de la racine carrĂ©e
├── performance.py # doit contenir vos tests de performance des fonctions du module "racine.py"
└── autocorrection.py # ce fichier vous est fourni et sert à l'autocorrection de votre travail

Téléchargez le fichier autocorrection.py et placez-le dans votre projet.

6 points 🔧 Calculer la racine carrĂ©e « Ă  la main »

Dans le script racine.py, vous devez créer 2 fonctions, soit une pour chacune des 2 méthodes du calcul de la racine carrée d'un nombre.

➀ MĂ©thode 1 : Dichotomie (avec arrĂȘt basĂ© sur l’arrondi)

On cherche la racine dans un intervalle [bas,haut][\text{bas}, \text{haut}] qui se réduit de moitié à chaque étape.

On commence par déterminer l'intervalle initial :

Si{n≄1:intervalle initial=[0,n],0<n<1:intervalle initial=[n,1],n=0:racine=0,n<0:non deˊfini dans R:on leˋve une exception.\text{Si} \begin{cases} n \ge 1 : & \text{intervalle initial} = [0, n],\\[1em] 0 < n < 1 : & \text{intervalle initial} = [n, 1],\\[1em] n = 0 : & \text{racine} = 0,\\[1em] n < 0 : & \begin{aligned} & \text{non dĂ©fini dans } \mathbb{R} : \\[-0.5em] & \text{on lĂšve une exception}. \end{aligned} \end{cases}

Par la suite, on va réduire l'intervalle de moitié de la maniÚre suivante :

  1. On calcule le milieu :
milieu=bas+haut2\text{milieu} = \frac{\text{bas} + \text{haut}}{2}
  1. Puis :
Si{milieu2<n:on deˊplace bas=milieu,milieu2≄n:on deˊplace haut=milieu.\text{Si} \begin{cases} \text{milieu}^2 < n : & \text{on dĂ©place } \text{bas} = \text{milieu},\\ \text{milieu}^2 \ge n : & \text{on dĂ©place } \text{haut} = \text{milieu}. \end{cases}

On rĂ©pĂšte l'opĂ©ration de rĂ©duction de l'intervalle jusqu'Ă  ce que le critĂšre d’arrĂȘt soit atteint (voir ci-dessous).


🔎 CritĂšre d’arrĂȘt​

On arrĂȘte lorsque les deux bornes donnent le mĂȘme rĂ©sultat, une fois arrondi Ă  la prĂ©cision demandĂ©e.

Par exemple, si on veut kk dĂ©cimales, on arrĂȘte lorsque :

round(bas,k)=round(haut,k)\text{round}(\text{bas}, k) = \text{round}(\text{haut}, k)

et ce résultat arrondi est la racine approximée.


Exemple (racine de 88, avec 55 dĂ©cimales)​

On poursuit les itérations jusqu'à ce que :

round(bas,5)=round(haut,5)\text{round}(\text{bas}, 5) = \text{round}(\text{haut}, 5)

Supposons qu’on obtienne :

  • bas = 2.8284225463867188
  • haut= 2.82843017578125

Alors :

  • round(2.828422..., 5) = 2.82842
  • round(2.828430..., 5) = 2.82843

→ On continue.

Plus tard :

  • bas = 2.8284263610839844
  • haut= 2.82843017578125

Alors :

  • round(2.8284263..., 5) = 2.82843
  • round(2.8284301..., 5) = 2.82843

→ On peut donc arrĂȘter.

Résultat retourné : 2.828432.82843.

➀ MĂ©thode 2 : Chiffre par chiffre

On construit le résultat décimale par décimale, en partant de la gauche vers la droite.

Supposons que nous cherchons la racine carrée de 88.


🌕 Partie entiùre​

On commence par déterminer la partie entiÚre (à gauche de la virgule) de la racine carrée.

On fait des essais successifs pour trouver le plus grand entier dont le carré est inférieur ou égal à 88 :

  • 02=00^2 = 0
  • 12=11^2 = 1
  • 22=42^2 = 4
  • 32=93^2 = 9

Puisque 32>83^2 > 8, on retient 22.

👉 À cette Ă©tape, on sait que la racine est dans l’intervalle :

2≀8<32 \quad \le \quad \sqrt{8} \quad < \quad 3

Donc, la racine de 88 ressemble Ă  22 point quelque chose (ex : 2.0...,2.1...,...,2.9...2.0..., 2.1..., ..., 2.9...).


🔱 DĂ©cimales​

On va maintenant ajouter les décimales une à la fois.

PremiĂšre dĂ©cimale​

On teste les valeurs possibles :

  • 2.02=42.0^2 = 4
  • 2.12=4.412.1^2 = 4.41
  • 2.22=4.842.2^2 = 4.84
  • 2.32=5.292.3^2 = 5.29
  • 2.42=5.762.4^2 = 5.76
  • 2.52=6.252.5^2 = 6.25
  • 2.62=6.762.6^2 = 6.76
  • 2.72=7.292.7^2 = 7.29
  • 2.82=7.842.8^2 = 7.84
  • 2.92=8.412.9^2 = 8.41

Puisque 2.92>82.9^2 > 8, on retient 2.82.8.

👉 On a maintenant :

2.8≀8<2.92.8 \quad \le \quad \sqrt{8} \quad < \quad 2.9

DeuxiĂšme dĂ©cimale​

MĂȘme principe :

  • 2.802=7.842.80^2 = 7.84
  • 2.812=7.89612.81^2 = 7.8961
  • 2.822=7.95242.82^2 = 7.9524
  • 2.832=8.00892.83^2 = 8.0089

Puisque 2.832>82.83^2 > 8, on retient 2.822.82.

👉 On a maintenant :

2.82≀8<2.832.82 \quad \le \quad \sqrt{8} \quad < \quad 2.83

On rĂ©pĂšte ce processus pour chaque dĂ©cimale jusqu’à atteindre la prĂ©cision souhaitĂ©e.


⚙ Traduction en algorithme​

À chaque position dĂ©cimale :

  1. On fixe les chiffres déjà trouvés
  2. On teste les chiffres de 0 Ă  9
  3. On garde le plus grand chiffre tel que :
(approximation)2≀n(\text{approximation})^2 \le n

👉 Cela correspond directement à :

  • une boucle sur les positions
  • une boucle imbriquĂ©e sur les chiffres de 0 Ă  9

≅ Arrondi ou pas ?​

Avec cette mĂ©thode, on n’arrondit pas la rĂ©ponse.

On retourne simplement la borne infĂ©rieure, c’est-Ă -dire le plus grand nombre construit tel que :

(approximation)2≀n(\text{approximation})^2 \le n

👉 On obtient donc une troncature Ă  la prĂ©cision demandĂ©e.

Par exemple, si la vraie valeur est :

8≈2.828427...\sqrt{8} \approx 2.828427...

Avec une précision de 5 décimales, on retourne :

2.828422.82842

(et non 2.828432.82843).

LES PARAMÈTRES
Ces deux fonctions doivent recevoir les deux paramĂštres suivants :

  1. Le nombre dont on souhaite calculer la racine
    • Vous devez valider que ce nombre est supĂ©rieur ou Ă©gal Ă  zĂ©ro.
  2. La précision souhaitée (ex. : 4 pour obtenir un maximum de 4 décimales) :
    • Ce paramĂštre doit ĂȘtre facultatif (en configurant une valeur par dĂ©faut).
    • Vous devez valider que la prĂ©cision est comprise entre 4 et 10 dĂ©cimales.

VALEUR RETOURNÉE
Concernant les valeurs retournées par ces 2 fonctions :

  • Elles doivent retourner simplement le rĂ©sultat en format numĂ©rique, comme le fait math.sqrt().
  • Les fonctions ne doivent pas appeler la fonction print.
  • Certaines racines n'ont pas de dĂ©cimales ou en possĂšdent peu :
    • Exemple : La racine carrĂ©e de 9 est 3.0, peu importe la valeur de votre prĂ©cision souhaitĂ©e.
    • Ne rajoutez pas de zĂ©ros inutiles Ă  votre rĂ©ponse.
GARDER LE MODULE RACINE PROPRE

Votre module racine doit contenir uniquement ces 2 fonctions et aucune instruction dans ce module ne doit ĂȘtre laissĂ©e Ă  l'extĂ©rieur de ces 2 fonctions.

✅ Autocorrection

Vous devez exécuter fréquemment le script autocorrection.py. Il détecte automatiquement votre progression, ce que vous avez fait ou non, et exécute des tests en conséquence. Votre enseignant va se servir de ce script pour valider le bon fonctionnement de vos 2 fonctions.

⚠ Pour que le script fonctionne correctement, il faut absolument que le mot dichotomie soit prĂ©sent dans la docstring de la fonction correspondant Ă  la mĂ©thode par dichotomie.

Le script nécessite au préalable l'installation du package requests (voir la procédure d'installation d'un package). Cette bibliothÚque permet de télécharger des fichiers en ligne par programmation ; elle est utilisée ici pour vérifier si une nouvelle version du script est disponible et pour la télécharger automatiquement.

Limitations du script
Le script possÚde certaines limites et ne vérifie pas les points suivants :

  • La cohĂ©rence de vos docstrings ainsi que la qualitĂ© du français.
  • La prĂ©sence de code inutile ou redondant Ă  l'intĂ©rieur de vos fonctions.
  • Le respect de la consigne exigeant au moins cinq commits dans votre dĂ©pĂŽt GitHub.
  • Le bon fonctionnement du script performance.py.
2 points 📈 Comparaison des performances

Dans le script performance.py, vous allez comparer vos 2 fonctions du module racine avec la fonction math.sqrt() pour comparer leurs performances.

Pour chacune des 3 méthodes (fonction 1, fonction 2, math.sqrt()) vous devez :

  • À l'aide d'une boucle, appeler la fonction 100 000 fois avec un nombre flottant alĂ©atoire
    • Utilisez un nombre flottant alĂ©atoire diffĂ©rent Ă  chaque appel
    • Les nombres flottants gĂ©nĂ©rĂ©s doivent ĂȘtre compris entre 10 et 10 000
  • Calculer le temps total nĂ©cessaire pour rĂ©aliser les 100 000 appels (en ms)
  • Afficher :
    • Le temps de calcul total pour les 100 000 appels (en millisecondes)
    • Le temps moyen par appel de la fonction

Exemple d'affichage attendu (les valeurs sont fictives) :

Résultats des performances :
Méthode 1 (dichotomie) : Temps total = 50 ms, Temps moyen = 0.0005 ms
Méthode 2 (chiffre par chiffre) : Temps total = 150 ms, Temps moyen = 0.0015 ms
Méthode 3 (math.sqrt) : Temps total = 10 ms, Temps moyen = 0.0001 ms

Votre format d'affichage devrait ĂȘtre identique.
Le script doit s'éxécuter en moins de 60 secondes.

1 point đŸŒ± GĂ©nĂ©raliser Ă  une racine n-iĂšme

Vous devez transformer vos deux fonctions du module racine afin qu'elles puissent calculer la racine n-iĂšme d'un nombre.

Ajout d'un nouveau paramĂštre

  • Ajoutez un paramĂštre base Ă  vos deux fonctions (ex. : 2 pour racine carrĂ©e, 3 pour racine cubique, etc.).
  • Ce paramĂštre doit ĂȘtre optionnel et avoir la valeur 2 par dĂ©faut.
  • L'ordre des paramĂštres doit ĂȘtre exactement le suivant (sans quoi l'autocorrection ne fonctionnera pas) :
    • le nombre
    • la base
    • la prĂ©cision

RĂšgles de validation et logique

  • Nombres nĂ©gatifs
    • Le calcul de la racine d'un nombre nĂ©gatif doit ĂȘtre possible uniquement si la base est impaire (ex. : la racine cubique de -27 est -3).
    • Dans tous les autres cas, une exception doit ĂȘtre levĂ©e.
  • Validation de la base
    • La valeur du paramĂštre base ne doit pas ĂȘtre infĂ©rieure Ă  2.
    • Vous devez valider la valeur passĂ©e en paramĂštre.

Vérification du bon fonctionnement

  • Le script autocorrection.py ajustera les tests en consĂ©quence dĂšs qu'il dĂ©tectera le paramĂštre supplĂ©mentaire dans vos fonctions.
Fonctionnement global 2 points négatifs

Le projet fonctionne sans plantage et correctement, et le code est clair et facile à lire. Ce pointage fonctionne en négatif. Si le projet fonctionne correctement en tout temps, vous conservez votre note. Dans le cas contraire, vous perdez des points avec un maximum de 2.

  • Plantage (un script qui plante lorsqu'on l'exĂ©cute) -1 point
  • Code illisible (ex : noms de variables incomprĂ©hensibles, difficultĂ© Ă  comprendre le code) -1 point
  • Information affichĂ©e incohĂ©rente -1 point
  • Autre cas...

Explications dĂ©taillĂ©es​