Travail 1 : Calcul de la racine d'un nombre, stupide et brutale
L'ordinateur est stupide mais très rapide. On va calculer la racine avec une méthode très lente et stupide ce qui est parfait pour un ordinateur.
méthode 1, chiffre par chiffre, par en dessous
Un exemple sur la racine carrée de 8:
unité :
- 0 : 0 * 0 = 0
- 1 : 1 * 1 = 1
- 2 : 2 * 2 = 4
- 3 : 3 * 3 = 9
Comme 8 est entre 4 et 9, on sait que la racine de 8 est entre 2 et 3: 2,...
On valide 2 comme chiffe des unités.
première décimale
- 2,0 * 2,0 = 4
- 2,12 = 4,41
- 2,22 = 4,84
- 2,32 = 5,29
- 2,42 = 5,76
- 2,52 = 6,25
- 2,62 = 6,76
- 2,72 = 7,29
- 2,82 = 7,84
- 2,92 = 8,41
La racine de 8 ressemble à 2,8.... 8 sera le chiffre des dixième.
2ème décimale
- 2,802 = 7,84
- 2,812 = 7,8961
- 2,822 = 7,9524
- 2,832 = 8,0089
Racine de 8 est de la forme 2,82...
méthode 2 : dichotomie (couper en 2)
On commence avec racine carrée de 8 doit être entre 0 et 8, on va essayer de resserrer cet interval jusqu'à trouver la racine
- [0 .. 8] le milieu est : 4 * 4 = 16
- on doit décider si la racine de 8 est dans [0 .. 4] ou [4 .. 8], comme 16 est au dessus de 8, la racine de 8 doit être entre 0 et 4
- [0 .. 4] le milieu est 2 : 2 * 2 = 4
- Comme 4 est en dessous de 8, le résultat est dans la moitié haute [2 .. 4]
- [2 .. 4] 32 = 9 donc [2 .. 3]
- [2 .. 3] 2,52 = 6,25 donc [2,5 .. 3]
- [2,5 .. 3] 2,752 = 7,5625 donc [2,75 .. 3]
- [2,75 .. 3] 2,8752 = 8.265625 donc [2,75 .. 2,875]
- etc.
Calcul de la racine carrée
En utilisant le principe de ton choix, tu dois produire un script appelé racineCarreeNomDeFamille.py dans lequel on trouvera une fonction
def racineCarre(nombre: float) -> float:
#ton code ici
return racine
Vous devrez aussi montrer les appels de cette méthode sur les nombre 0 0,1 0,2 0,9 8 9 81 123 et -3.
- 1 point le fichier existe, son nom respecte la consigne, il contient la fonction demandée et n'a pas d'erreur de syntaxe
- 2 points les racines carrées affichées pour 0 0,1 0,2 0,9 8 9 81 123 sont bonnes à 0,001 près.
- 1 point l'appel pour le nombre négatif lance une exception
Comparaison de performance
FAIRE FAIRE UN TRUC POUR COMPARER LES TEMPS EXECUTION VERSUS sqrt DE LIB STD
- générer un tableau de 10000 nombres tirés au pseudo hasard entre 10 et 1000, tu devrais choisir une graine pour t'assurer que ta solution est reproductible (tu peux prendre ton matricule)
- calculer le temps nécessaire pour calculer les racines carrées de ces nombres avec votre méthode
- calculer le temps nécessaire pour calculer les racines carrées avec la méthode fournie dans python
- afficher les 2 durées avec un print en millisecondes et le temps moyen en millisecondes pour les 2 méthodes
Généralisation à la racine nième de x
Encore une fois, tu peux utiliser copilot pour t'aider à produire ton code.
def racineCarre(base: int, nombre: float) -> float:
#ton code ici
return racine
Pour un n entier positif, faire une fonction qui permet de calculer la racine
Les 10 derniers pourcents
Dans chaque TP, nous allons avoir les 10% de la fin pour une partie plus difficile.
Ici nous allons tenter de faire le calcul du logarithme d'un nombre dans une base non entière.
Si on y pense on peut appliquer la même recette:
- si on part avec le log2(64) on trouve 6, car 2^6 = 64
- si on prend le log2( 2^x) cela donne toujours 1
- on peut donc chercher le nombre tel que
- ensuite il faut qu'on trouve une technique
https://www.quora.com/What-does-it-mean-to-raise-a-number-to-a-non-integer-power
Possibilité de chercher l'inverse de
def funkyFonction(x):
return x**x