Math et Prog

Parallèles entre cours de Math et cours de Prog à la HEIG

Rejoindre le serveur Discord de Arthur Bourquin, essentiellement dédié à la HEIG.

Promotions de type C++

Merci à Fouad Hanna, Bastien Chaudet, Guo Yu Wu, pour l'aide et les vérifications.

Les promotions de types en C++ garantissent qu'il n'y aura aucune perte de précision lors de la conversion du type d'une variable. Cette conversion — qu'on pourrait appeler "lossless" — n'est pas seulement vraie pour les promotions mais aussi pour les conversions suivantes.

Ci-dessous un diagramme de Hasse présentant deux relations entre les types C++. La relation C est la conversions garanties sans pertes entre deux types. La relation P est la promotion de type définie par C++. La relation P est incluse dans la relation C.

\[ \blue{P} \subset \green{C} \]

C comme P sont réflexives car pour chaque confrontation d'un type avec lui-même ce type ressort.

C comme P sont antisymétriques car si un type l'emporte sur l'autre, alors l'autre ne l'emportera jamais sur le premier.

C comme P sont transitives car si a l'emporte sur b et b l'emporte sur c alors a l'emporte sur c.

C comme P sont donc des relations d'ordre et peuvent être représentées sous la forme d'un diagramme de Hasse.

C comm P sont des relationd d'ordre partiel car dans les deux cas il existe des éléments non comparables.
Exemples :
- (c, uc) ou n'importe quel type signé et son pendant non signé.
- (int, float)

La relation C peut être décrite ainsi :

\[ \begin{aligned} & T_n = T_{\mathbb{N}} \cup T_{\mathbb{R}} \\[1em] & \green{C} \subseteq T^2 \\[1em] & T_n = \text{type nombre,} ~~ T_{\mathbb{N}} = \text{type entier,} ~~ T_{\mathbb{R}} = \text{type réel} \end{aligned} \]
\[ a \green{C} b ~~ \Leftrightarrow ~~ \] \[ \begin{aligned} \left\{ \begin{array}{ll} \\[5em] \\ \end{array} \right. \end{aligned} \] \[ a_{max} \le b_{max} \\et\\ a_{min} \ge b_{min} \] \[ \begin{aligned} \left\{ \begin{array}{ll} \\[2em] \\ \end{array} \right. \end{aligned} \] \[ \text{si} \quad (a, \; b) \; \in \; T_{\mathbb{N}}^2 \]
\[ \text{si} \quad (a, \; b) \; \in \; T_{\mathbb{R}}^2 \]
\[ a_{bits} \le b_{mant} + 1 \] \[ \text{si} \quad (a, \; b) \; \in \; T_{\mathbb{N}} \times T_{\mathbb{R}} \]

Exemples

\[ \begin{aligned} (short) ~~ & R ~~ (float) & 16 & \lt 23 + 1 \\ (int) ~~ & \cancel{R} ~~ (float) & 32 & \gt 23 + 1 \\ (int) ~~ & R ~~ (double) & 32 & \lt 53 + 1 \\ (long ~~ long ~~ int) ~~ & \cancel{R} ~~ (double) & 64 & \gt 23 + 1 \\ \end{aligned} \]

Explications avec GPT

Le type long int est hors du diagramme car il est identique à int ou long long int selon les systèmes. Il en va de même pour unsigned long int.
Le type long double aussi est différent selon les systèmes.

b uc c us s ui i ull ll f d
b 1 1 1 1 1 1 1 1 1 1 1
uc 1 1 1 1 1 1 1 1 1
c 1 1 1 1 1 1 1 1
us 1 1 1 1 1 1 1
s 1 1 1 1 1 1
ui 1 1 1 1
i 1 1 1
ull 1
ll 1
f 1 1
d 1

Modulo(s)

Mathématiques
→ Floored modulo

 5 mod  2 =  1
-5 mod  2 =  1
 5 mod -2 = -1
-5 mod -2 = -1

Le modulus donne le signe
\[ \begin{aligned} & (a) \; mod \; (2) \quad \gray{a - \left\lfloor \frac{a}{2} \right\rfloor \cdot 2} \end{aligned} \]
\[ \begin{aligned} & (a) \; mod \; (-2) \quad \gray{a - \left\lfloor \frac{a}{-2} \right\rfloor \cdot (-2)} \end{aligned} \]
Programmation
→ Truncated modulo

 5 mod  2 =  1
-5 mod  2 = -1
 5 mod -2 =  1
-5 mod -2 = -1

Le modulé donne le signe
a % 2 = a % -2

Modulo en math dans Z

\[ \begin{aligned} a = k \cdot b + r \quad;\quad a, b, k \in \mathbb{Z} \;,\; r \in \mathbb{N} \end{aligned} \]

Reste euclidien dans R

\[ \begin{aligned} r = a - \left\lfloor \frac{a}{b} \right\rfloor \cdot b \quad;\quad a, b \in \mathbb{R}^*_+ \end{aligned} \]

Modulo en prog

a % b = ((a/b) - trunk(a/b)) * b

Logarithme

"log ≠ log"

Implicitement, en mathématiques, un logarithme est en base 10, alors qu'en programmation, il est en base e.

Mathématiques
\[ \begin{aligned} & log(a) & = \quad & log_{10}(a) \\[1em] & ln(a) & = \quad & log_e(a) \\ \end{aligned} \]
Programmation

log(a) = logarithme naturel de a
log10(a) = logarithme en base 10 de a
log2(a) = logarithme en base 2 de a

Du moins dans la plupart des languages dont C++, JavaScript et Python.

Propositions d'exercices

Attention, certains exercices sont satyriques.

Rotation 2D

Math : trigo

Faire tourner une image.

1. En faisant une opération sur les coordonnées de l'image, la faire tourner d'un angle arbitraire.

2. Ajouter un point pour le centre autour duquel l'image tourne.

\[ \begin{aligned} & \text{Formules à trouver :} \\[1em] & \text{Point en coordonnées cartésiennes : } \\ & C(x, ~ y) \\ & \text{Point en coordonnées polaires : } \\ & P(\theta, ~ r) \\ \\ & \text{Conversion cart. à pol. :} \\ & \theta = (at2(x, ~ y)) \\ & r = \sqrt{x^2 + y^2} \\ \\ & \text{Conversion pol. à cart. :} \\ & x = cos(\theta) \cdot r \\ & y = sin(\theta) \cdot r \\ \\ & \text{Ajout de l'angle arbitraire (paramètre) :} \\ & x = cos(\theta \orange{+ \alpha}) \cdot r \\ & y = sin(\theta \orange{+ \alpha}) \cdot r \\ \\ & \text{Nouvelle coordonnée (cartésienne) :} \\ & C_2(x_2, ~ y_2) \\ & x_2 = cos(\theta + \alpha) \cdot r \\ & y_2 = sin(\theta + \alpha) \cdot r \\ \\ & \text{Formule intermédiaire :} \\ & x_2 = cos((at2(x, ~ y)) + \alpha) \cdot \sqrt{x^2 + y^2} \\ & y_2 = sin((at2(x, ~ y)) + \alpha) \cdot \sqrt{x^2 + y^2} \\ \\ & at2() = {...} \\ \\ & \text{Substitution / simplification :} \\ \\ & x_2 = cos(\theta + \alpha) \cdot r \\ & y_2 = sin(\theta + \alpha) \cdot r \\ \\ & \green{sin(\alpha + \beta) = cos(\alpha)sin(\beta) + sin(\alpha)cos(\beta)} \\ & \green{cos(\alpha + \beta) = cos(\alpha)cos(\beta) - sin(\alpha)sin(\beta)} \\ \\ & x_2 = (cos(\theta)cos(\alpha) - sin(\theta)sin(\alpha)) \cdot r \\ & y_2 = (cos(\theta)sin(\alpha) + sin(\theta)cos(\alpha)) \cdot r \\ \\ & x_2 = r \cdot cos(\theta) \cdot cos(\alpha) ~~ - ~~ r \cdot sin(\theta) \cdot sin(\alpha) \\ & y_2 = r \cdot cos(\theta) \cdot sin(\alpha) ~~ + ~~ r \cdot sin(\theta) \cdot cos(\alpha) \\ \\ & \text{Formule finale :} \\ & x_2 = x \cdot cos(\alpha) - y \cdot sin(\alpha) \\ & y_2 = x \cdot sin(\alpha) + y \cdot cos(\alpha) \\ \\ & \text{Formule avec l'origine :} \\ & O(x_o, ~ y_o) \\ & x_2 = (x - x_o) \cdot cos(\alpha) - (y - y_o) \cdot sin(\alpha) + x_o \\ & y_2 = (x - x_o) \cdot sin(\alpha) + (y - y_o) \cdot cos(\alpha) + y_o \\ \\ \end{aligned} \]

La bouteille

Math D : séries

La HEIG-VD doit remplir une bouteille d'un litre avec 1,1 litre d'eau.

Elle fait appel à un expert rémunéré 1'000 CHF/jour. Cet expert ne parvient pas à trouver de solution, si bien qu'un nouvel expert est engagé pour le lendemain (jour ouvré), rémunéré 15% plus que le premier.

Chaque jour, un nouvel expert est ajouté au projet avec un salaire de 15% suppérieur au précédent.

Quel sera le coût total pour la HEIG-VD au bout d'une année (240 jours ouvrés) ?

Sommes

Prog : fonction récursive ?

Math D : Séries


Implémenter un script qui teste les égalités suivantes sur 1000 itérations avec des nombres aléatoires. \[ \sum_{k \in K} (a_k + b_k) ~~ = ~~ \sum_{k \in K} (a_k) ~ + ~ \sum_{k \in K} (b_k) \] et \[ \sum_{a = b}^c \sum_{x = y}^z (a_{ij}) ~~ = ~~ \sum_{x = y}^z \sum_{a = b}^c (a_{ij}) \]

Labo 02 - Temps de trajet

Prog : Bases

Math : Dérivées, optimisation

Implémenter une fonction qui optimise le temps de parcours d'un robot devant aller récupérer un objet sur un terrain tout en pouvant emprunter une route sur une distance arbitraire.

La route est droite et le robot est dessus au début.

1. Trouver et implémenter la fonction retournant le temps de trajet du robot à l'objet :

\[ \begin{aligned} &&& \text{Paramètres :} \\ \\ && D_x : ~~ & \text{Distance du robot au point de la route le plus proche de l'objet} \\ && D_y : ~~ & \text{Distance minimale de l'objet à la route} \\ && v_r : ~~ & \text{Vitesse du robot sur la route} \\ && v_t : ~~ & \text{Vitesse du robot sur le terrain} \\ && d_r : ~~ & \text{Distance parcourue sur la route} \\ && d_t : ~~ & \text{Distance parcourue sur le terrain} \\ \\ &&& \text{Inconnues :} \\ \\ && d_r : ~~ & \text{Distance parcourue sur la route} \\ && d_t : ~~ & \text{Distance parcourue sur le terrain} \\ \\ && d_x (=d_t) : ~~ & \text{distance à laquelle le robot quitte la route pour emprunter le terrain} \\ \\ &&& \text{Formules :} \\ \\ &&& \text{Temps de parcours :}~~ f(d_x) = \frac{d_x}{v_r} + \frac{d_t}{v_t} \\\\ &&& \text{Distance parcourue sur le terrain :}~~ d_t = \sqrt{(D_x - d_x)^2 + D_y^2} \\\\ &&& \text{Temps de parcours :}~~ f(d_x) = \frac{d_x}{v_r} + \frac{\sqrt{(D_x - d_x)^2 + D_y^2}}{v_t} \\ \end{aligned} \]

2. Trouver et implémenter la fonction d'optimisation, soit la fonction qui retourne la distance optimale à laquelle le robot doit quitter la route :

\[ \text{Dérivée (pour extrémum) :} \\[2em] f'(d_x) = \frac{1}{v_r} - \frac{D_x - d_x}{v_t \sqrt{(D_x - d_x)^2 + D_y^2}} \\[4em] d_x ~ \text{tel que la dérivée } f'(x) = 0 ~~ \text{(minimum)} \\[2em] d_x = D_x - \sqrt{\frac{D_y^2}{(\frac{v_r}{v_t})^2 - 1} } \]