{"id":1745,"date":"2026-03-14T08:35:01","date_gmt":"2026-03-14T04:35:01","guid":{"rendered":"https:\/\/iremi.univ-reunion.fr\/?p=1745"},"modified":"2026-04-10T10:56:46","modified_gmt":"2026-04-10T06:56:46","slug":"poo-et-egalites","status":"publish","type":"post","link":"https:\/\/iremi.univ-reunion.fr\/?p=1745","title":{"rendered":"Programmation Orient\u00e9e Objet et \u00e9galit\u00e9s"},"content":{"rendered":"\n<p>Le th\u00e8me de la semaine des math\u00e9matiques 2026 est <em>\u00e9galit\u00e9s<\/em>. Ce concept, tr\u00e8s pr\u00e9sent en math\u00e9matiques, l&rsquo;est aussi dans la programmation objet, et plus g\u00e9n\u00e9ralement en informatique o\u00f9 il existe plusieurs d\u00e9finitions de l&rsquo;\u00e9galit\u00e9.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Les diff\u00e9rents sens de l&rsquo;\u00e9galit\u00e9 en maths<\/h2>\n\n\n\n<p>Le premier math\u00e9maticien \u00e0 parler d&rsquo;\u00e9galit\u00e9 est Euclide. Il \u00e9voque des propri\u00e9t\u00e9s de l&rsquo;\u00e9galit\u00e9 qui en font une relation d&rsquo;\u00e9quivalence :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a=a<\/li>\n\n\n\n<li>si a=b alors b=a<\/li>\n\n\n\n<li>si a=c et b=c alors a=b<\/li>\n<\/ul>\n\n\n\n<p>Mais l&rsquo;\u00e9galit\u00e9 n&rsquo;est pas une relation d&rsquo;\u00e9quivalence comme les autres, en plus de <strong>a = a<\/strong> il faut aussi <strong>a \u2260 n&rsquo;importe quoi d&rsquo;autre que a.<\/strong> Par exemple une droite est toujours parall\u00e8le \u00e0 elle-m\u00eame mais n&rsquo;est pas pour autant \u00e9gale \u00e0 toutes les droites qui lui sont parall\u00e8les. L&rsquo;id\u00e9e sous-jacente est de consid\u00e9rer comme \u00e9gaux des objets math\u00e9matiques indistinguables l&rsquo;un de l&rsquo;autre.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00c9galit\u00e9 comme r\u00e9sultat d&rsquo;un calcul<\/h3>\n\n\n\n<p>Lorsque j&rsquo;\u00e9cris 2+2=4, je ne dis pas seulement que le nombre 2+2 est le m\u00eame nombre que 4, je sous-entends que si on effectue le calcul 2+2, le r\u00e9sultat est 4. D&rsquo;ailleurs sur certaines calculatrices 4 op\u00e9rations, le bouton permettant d&rsquo;obtenir le r\u00e9sultat de l&rsquo;\u00e9valuation d&rsquo;une expression porte le signe <strong>=<\/strong>. Cela perturbe des \u00e9l\u00e8ves \u00e0 partir du cycle 2, car ils finissent par se fixer sur cette interpr\u00e9tation de l&rsquo;\u00e9galit\u00e9, et ne comprennent pas qu&rsquo;on puisse \u00e9crire 4=2+2 ou 2+2=3+1.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cas d&rsquo;\u00e9galit\u00e9 des triangles<\/h3>\n\n\n\n<p>Chez Euclide, lorsqu&rsquo;on dit que les triangles ABC et DEF sont \u00e9gaux, on sous-entend qu&rsquo;ils sont isom\u00e9triques, et si par exemple AB = DE, on compare des distances et pas des points : que AB = DE ne signifie ni que A=D ni que B=E mais seulement que la distance entre A et B est la m\u00eame que la distance entre D et E.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00c9galit\u00e9 approch\u00e9e<\/h3>\n\n\n\n<p>En cycle 3, beaucoup d&rsquo;\u00e9l\u00e8ves apprennent que \u03c0=3,14 et ont beaucoup de mal par la suite \u00e0 se d\u00e9faire de cette id\u00e9e, qui donne \u00e0 la fois une fausse image de \u03c0, et une fausse image de l&rsquo;\u00e9galit\u00e9.<\/p>\n\n\n\n<p>Un probl\u00e8me similaire appara\u00eet insidieusement lorsqu&rsquo;on enseigne les fractions, notamment lorsqu&rsquo;on dit que si on partage \u00e9quitablement le contenu d&rsquo;une bouteille en trois parties (\u00e9gales !), chaque verre contient le tiers du contenu de la bouteille : en fait on ne peut pas forc\u00e9ment partager \u00e9quitablement une quantit\u00e9 (par exemple si le nombre de mol\u00e9cules d&rsquo;eau n&rsquo;est pas divisible par 3, on sait gr\u00e2ce \u00e0 la division euclidienne -encore Euclide- que le partage \u00e9quitable est impossible) m\u00eame si cette quantit\u00e9 est continue, du moins dans la pratique : les fractions obtenues en coupant des pizzas ou des segments ne peuvent \u00eatre qu&rsquo;approch\u00e9es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00c9quations<\/h3>\n\n\n\n<p>L&rsquo;\u00e9nonc\u00e9 d&rsquo;une \u00e9quation s&rsquo;\u00e9crit avec le signe \u00e9gal. Par exemple lorsqu&rsquo;on \u00e9crit que x+1=4, on pose implicitement la question de savoir non pas <em>si<\/em> x+1=4 mais <em>quand<\/em> x+1=4 : quelles sont les valeurs de x pour lesquelles x+1=4 ? Une \u00e9quation est donc un probl\u00e8me, et r\u00e9soudre ce probl\u00e8me c&rsquo;est donner l&rsquo;ensemble des x pour lesquels l&rsquo;\u00e9galit\u00e9 est v\u00e9rifi\u00e9e.<\/p>\n\n\n\n<p>Un probl\u00e8me nouveau appara\u00eet lorsqu&rsquo;on parle d&rsquo;\u00e9quation d&rsquo;une courbe alg\u00e9brique : on ne peut pas lister toutes les solutions d&rsquo;une \u00e9quation de droite comme 2x+5y=3 parce qu&rsquo;en caract\u00e9ristique nulle il y a une infinit\u00e9 de solutions de l&rsquo;\u00e9quation. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fonctions<\/h3>\n\n\n\n<p>Dans l&rsquo;\u00e9criture d&rsquo;une relation, en particulier d&rsquo;une fonction, on utilise aussi le signe d&rsquo;\u00e9galit\u00e9 comme dans y = sin(x). Cela sous-entend que pour toute valeur de la variable x, la valeur correspondante de y est le sinus de la valeur correspondante de x. Une notion math\u00e9matique qui pr\u00e9c\u00e8de celle de fonction est celle de variable. Lorsque je dis que x=3, je ne dis pas que la variable x est \u00e9gale \u00e0 3 (sinon ce ne serait pas une variable) mais que <em>sa valeur<\/em> est \u00e9gale \u00e0 3. Une variable est en fait une donn\u00e9e form\u00e9e de deux choses : son nom (quoiqu&rsquo;il existe, en logique et en informatique, des variables anonymes) et sa valeur, et l&rsquo;\u00e9criture x=3 est un abus de langage pour dire que x a pour valeur 3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L&rsquo;\u00e9galit\u00e9 en informatique<\/h2>\n\n\n\n<p>Pour savoir si x=3, je dois donc r\u00e9cup\u00e9rer la valeur de la variable x (cela s&rsquo;appelle <em>\u00e9valuer<\/em> x, et suppose donc que la variable x  est une expression) et la comparer avec 3. Le r\u00e9sultat de la comparaison est un bool\u00e9en (<code>False<\/code> ou <code>True<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Affectation<\/h3>\n\n\n\n<p>Python h\u00e9rite d&rsquo;un choix malheureux datant de Fortran, un des premiers langages informatiques compil\u00e9s. Dans ces langages, lorsque je modifie une variable, par exemple en injectant la valeur 5 dans la variable x, je n&rsquo;\u00e9cris pas 5\u2192x pour sugg\u00e9rer cette affectation (ne serait-ce que parce que le caract\u00e8re \u2192 n&rsquo;existe pas sur un clavier azerty&#8230;) mais x=5, qui montre non pas un constat d&rsquo;\u00e9galit\u00e9, mais une volont\u00e9 (que x soit \u00e9gal \u00e0 5). Il y a eu des langages de programmation utilisant une suite non sym\u00e9trique de symboles pour d\u00e9signer l&rsquo;affectation (<code>:=<\/code> dans les langages issus d&rsquo;Algol, <code>&lt;-<\/code> pour R&#8230;) et dans ces langages (y compris les langages purement fonctionnels -d\u00e9pourvus de variables- comme Lisp, OCaml ou Haskell, et  SQL qui n&rsquo;est pas \u00e0 proprement parler un langage de programmation) il est possible d&rsquo;utiliser le signe d&rsquo;\u00e9galit\u00e9 pour une comparaison, mais pour Python on ne peut pas, ce signe \u00e9tant d\u00e9j\u00e0 r\u00e9serv\u00e9 \u00e0 l&rsquo;affectation. Comment faire alors ?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comparaison en Python<\/h3>\n\n\n\n<p>Pour savoir si deux objets sont \u00e9gaux, en Python, on utilise un signe d&rsquo;\u00e9galit\u00e9 d\u00e9doubl\u00e9 comme dans <code>2+2==4<\/code>. Ou pas ! On peut aussi \u00e9crire <code>2+2 is 4<\/code>, avec le m\u00eame r\u00e9sultat (\u00e9valuation \u00e0 <code>True<\/code>). Il y a donc deux \u00e9galit\u00e9s en Python, ce qui inscrit Python pleinement dans le th\u00e8me de la semaine des maths 2025 (<em>\u00e9galit\u00e9s<\/em>, au pluriel) ! En quoi ces deux \u00e9galit\u00e9s diff\u00e8rent-elles ? En rien, avec des objets immuables : la premi\u00e8re \u00e9value les deux membres de l&rsquo;\u00e9galit\u00e9 et compare les r\u00e9sultats des deux \u00e9valuations, la seconde compare les adresses m\u00e9moire des deux objets. Les r\u00e9ponses sont les m\u00eames, mais avec des objets mutables comme des listes, les \u00e9galit\u00e9s diff\u00e8rent :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; tab1 = &#91;3,1,4]\n&gt;&gt;&gt; tab2 = &#91;3,1,4]\n&gt;&gt;&gt; tab1 is tab2\nFalse\n&gt;&gt;&gt; tab1 == tab2\nTrue<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u00c9galit\u00e9 approch\u00e9e<\/h3>\n\n\n\n<p>Pour comparer deux entiers, on sait depuis le cycle 2 comment faire avec leur \u00e9criture d\u00e9cimale. Pour les r\u00e9els c&rsquo;est plus compliqu\u00e9, parce que les r\u00e9els sont mod\u00e9lis\u00e9s par des flottants, et que des flottants, il n&rsquo;y en a que 18446744073709551616 (et encore, certains flottants, comme <code>NaN<\/code> et l&rsquo;infini, ne sont pas des r\u00e9els). A priori, si on veut comparer <math data-latex=\"\\sqrt{8}\"><semantics><msqrt><mn>8<\/mn><\/msqrt><annotation encoding=\"application\/x-tex\">\\sqrt{8}<\/annotation><\/semantics><\/math> avec <math data-latex=\"2 \\sqrt{2}\"><semantics><mrow><mn>2<\/mn><msqrt><mn>2<\/mn><\/msqrt><\/mrow><annotation encoding=\"application\/x-tex\">2 \\sqrt{2}<\/annotation><\/semantics><\/math>, il ne devrait pas y avoir de souci puisque les deux nombres ne sont pr\u00e9sents en m\u00e9moire que sous forme approch\u00e9e, et devraient \u00eatre approch\u00e9s par le m\u00eame flottant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; a =8**0.5\n&gt;&gt;&gt; b = 2*2**0.5\n&gt;&gt;&gt; a == b\nTrue\n&gt;&gt;&gt; a\n2.8284271247461903\n&gt;&gt;&gt; b\n2.8284271247461903<\/code><\/pre>\n\n\n\n<p>Mais les flottants sont des fractions dyadiques, ensemble strictement inclus dans celui des d\u00e9cimaux, et m\u00eame les nombres d\u00e9cimaux ne peuvent \u00eatre compar\u00e9s exactement :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; a = 0.1 + 0.2\n&gt;&gt;&gt; b = 0.3\n&gt;&gt;&gt; a == b\nFalse\n&gt;&gt;&gt; a\n0.30000000000000004\n&gt;&gt;&gt; b\n0.3\n&gt;&gt;&gt; a-b\n5.551115123125783e-17<\/code><\/pre>\n\n\n\n<p>Cela pose un probl\u00e8me en g\u00e9om\u00e9trie, o\u00f9 un d\u00e9terminant cens\u00e9 \u00eatre nul peut ne pas valoir exactement 0. On y reviendra plus tard, parce qu&rsquo;une solution possible utilise la POO. En attendant, on constate que l&rsquo;entier 3 et le r\u00e9el 3 ne sont pas consid\u00e9r\u00e9s comme \u00e9gaux par Python :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; 3 == 3.0\nTrue\n&gt;&gt;&gt; 3 is 3.0\nFalse<\/code><\/pre>\n\n\n\n<p>C&rsquo;est donc bien le double \u00e9gal qui est le plus pratique pour la comparaison de r\u00e9els, et pas le <code>is<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">POO et \u00e9galit\u00e9s<\/h2>\n\n\n\n<p>Comment comparer deux r\u00e9els ? On essaye<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>print(dir(3.0))<\/code><\/pre>\n\n\n\n<p>et on obtient (sous <a href=\"https:\/\/alainbusser.github.io\/SofusPy974\/\">SofusPy974<\/a> en l\u2019occurrence) quelque chose comme<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;'__eq__', '__ge__', '__gt__', '__le__', '__lt__', '__ne__', 'clone', 'numberCompare', 'toFixed']<\/code><\/pre>\n\n\n\n<p>montrant qu&rsquo;il est possible de savoir, respectivement, si un flottant est \u00e9gal, sup\u00e9rieur ou \u00e9gal, sup\u00e9rieur, inf\u00e9rieur ou \u00e9gal, inf\u00e9rieur, ou diff\u00e9rent d&rsquo;un autre flottant, et qu&rsquo;il est possible de faire ces comparaisons algorithmiquement (pour les nombres d\u00e9cimaux, ces algorithmes sont abord\u00e9s en cycle 3).<\/p>\n\n\n\n<p>Pour faire de la programmation objet, on a parfois besoin de red\u00e9finir l&rsquo;\u00e9galit\u00e9, et donc de se poser la question qui entame cet article : quand doit-on consid\u00e9rer comme indistinguables deux objets ? Par exemple dans un annuaire t\u00e9l\u00e9phonique, lorsqu&rsquo;une personne change de num\u00e9ro de t\u00e9l\u00e9phone, elle est quand m\u00eame toujours la m\u00eame personne. Si on veut mettre \u00e0 jour un abonn\u00e9 dans un annuaire, il est prudent de commencer par v\u00e9rifier si l&rsquo;abonn\u00e9 est d\u00e9j\u00e0 dans l&rsquo;annuaire. Or en testant <code>('Dupont','Jean','1\/1\/1970',01234567) in annuaire<\/code> on risque de ne pas trouver cet abonn\u00e9 parce que dans l&rsquo;annuaire il y a bien <code>('Dupont','Jean','1\/1\/1970',01222233)<\/code> mais il ne sera consid\u00e9r\u00e9 comme \u00e9gal \u00e0 l&rsquo;abonn\u00e9 recherch\u00e9, que s&rsquo;il a aussi le m\u00eame num\u00e9ro de t\u00e9l\u00e9phone, ce qui n&rsquo;est pas le cas. Ainsi, m\u00eame pour une recherche dans une liste, il peut s&rsquo;av\u00e9rer n\u00e9cessaire de red\u00e9finir l&rsquo;\u00e9galit\u00e9.<\/p>\n\n\n\n<p>En SQL, il est obligatoire de choisir des champs qui, \u00e0 eux tous, constituent une <em>cl\u00e9 primaire<\/em>, c&rsquo;est-\u00e0-dire qu&rsquo;il n&rsquo;y a par exemple pas deux abonn\u00e9s ayant le m\u00eame pr\u00e9nom, le m\u00eame nom et la m\u00eame date de naissance. En SQL, typiquement, on cr\u00e9e une cl\u00e9 enti\u00e8re d\u00e9clar\u00e9e explicitement comme cl\u00e9 primaire. <\/p>\n\n\n\n<p>En Python, la m\u00e9thode d&rsquo;\u00e9galit\u00e9 est appel\u00e9e <code>__eq__<\/code> (on prononce <em>dundereq<\/em>) et on peut la surcharger, par exemple au sein d&rsquo;une classe <code>Reel<\/code> mod\u00e9lisant les nombres r\u00e9els :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Reel(float):\n    def __init__(self,valeur):\n        self.v = valeur\n    def __eq__(self,other):\n        return abs(self.v-other.v) &lt; 1e-12\n    def __add__(self,other):\n        return Reel(self.v+other.v)\n    def __sub__(self,other):\n        return Reel(self.v-other.v)\n    def __mul__(self,other):\n        return Reel(self.v*other.v)<\/code><\/pre>\n\n\n\n<p>Le <code>float<\/code> entre parenth\u00e8ses \u00e9vite d&rsquo;avoir \u00e0 red\u00e9finir les op\u00e9rations : a priori, un r\u00e9el se comporte comme un flottant, <em>sauf mention contraire<\/em>. La mention contraire porte sur l&rsquo;\u00e9galit\u00e9, qui est red\u00e9finie comme une \u00e9galit\u00e9 \u00e0 10<sup>-12<\/sup> pr\u00e8s. La premi\u00e8re m\u00e9thode, <code>__init__<\/code>, permet de donner une valeur \u00e0 un r\u00e9el. Cette valeur est un flottant. Les r\u00e9els fonctionnent mieux que les flottants, concernant l&rsquo;\u00e9galit\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; x = Reel(0.3)\n&gt;&gt;&gt; y = Reel(0.1) + Reel(0.2)\n&gt;&gt;&gt; x == y\nTrue\n&gt;&gt;&gt; x\n0.3\n&gt;&gt;&gt; y\n0.30000000000000004<\/code><\/pre>\n\n\n\n<p>Python poss\u00e8de un module <code>decimal<\/code> qui peut aussi faire le job :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; from decimal import *\n&gt;&gt;&gt; x = Decimal('0.3')\n&gt;&gt;&gt; y = Decimal('0.1') + Decimal('0.2')\n&gt;&gt;&gt; x == y\nTrue\n&gt;&gt;&gt; x\nDecimal('0.3')\n&gt;&gt;&gt; y\nDecimal('0.3')<\/code><\/pre>\n\n\n\n<p>Mais si on veut comparer des hypot\u00e9nuses calcul\u00e9es par Pythagore, on ne peut pas utiliser ce module, parce que les racines carr\u00e9es ne sont pas n\u00e9cessairement des d\u00e9cimaux. On utilisera donc des \u00e9galit\u00e9s approch\u00e9es pour aborder les vecteurs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vecteurs et \u00e9galit\u00e9<\/h2>\n\n\n\n<p>Dans le projet de programme pour la rentr\u00e9e 2026, en Seconde, il est pr\u00e9vu, comme exemple d&rsquo;algorithme, le suivant :<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u00c9tudier l\u2019alignement de trois points dans le plan.<\/p>\n<\/blockquote>\n\n\n\n<p>Comme, en g\u00e9om\u00e9trie, il est \u00e9galement pr\u00e9cis\u00e9 ceci :<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>D\u00e9terminant de deux vecteurs dans une base orthonorm\u00e9e, crit\u00e8re de colin\u00e9arit\u00e9. Application \u00e0 l\u2019alignement, au parall\u00e9lisme.<\/p>\n\n\n\n<p>Caract\u00e9riser alignement et parall\u00e9lisme par la colin\u00e9arit\u00e9 de vecteurs.<\/p>\n\n\n\n<p>Caract\u00e9risations de la colin\u00e9arit\u00e9 de deux vecteurs non nuls : nullit\u00e9 du d\u00e9terminant ; proportionnalit\u00e9 des coordonn\u00e9es.<\/p>\n<\/blockquote>\n\n\n\n<p>on voit qu&rsquo;il va \u00eatre n\u00e9cessaire, \u00e0 un moment ou \u00e0 un autre, de d\u00e9finir une fonction <code>determinant<\/code> en Python, et de comparer deux r\u00e9els (en fait, comparer un r\u00e9el avec 0).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vecteurs en Python<\/h3>\n\n\n\n<p>Comme le programme pr\u00e9cise que le d\u00e9terminant est <a href=\"http:\/\/revue.sesamath.net\/spip.php?article1226\">une fonction<\/a> qui, \u00e0 deux vecteurs, associe un r\u00e9el, il est n\u00e9cessaire de voir comment on peut mod\u00e9liser un vecteur en Python. Le plus simple est de prendre un couple de flottants, mais alors  on a ce ph\u00e9nom\u00e8ne :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def d\u00e9terminant(u,v):\n    (xu,yu)=u\n    (xv,yv)=v\n    return xu*yv-xv*yu\n\n&gt;&gt;&gt; u = (2,3)\n&gt;&gt;&gt; v = (0.2,0.3)\n&gt;&gt;&gt; d\u00e9terminant(u,v)\n-1.1102230246251565e-16<\/code><\/pre>\n\n\n\n<p>La nullit\u00e9 (c&rsquo;est-\u00e0-dire l&rsquo;\u00e9galit\u00e9 avec 0) du d\u00e9terminant est un crit\u00e8re de colin\u00e9arit\u00e9. Or, bien que v soit le dixi\u00e8me de u, il n&rsquo;est pas consid\u00e9r\u00e9 comme colin\u00e9aire \u00e0 u.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Colin\u00e9arit\u00e9 de deux vecteurs<\/h3>\n\n\n\n<p>Deux vecteurs ayant des coordonn\u00e9es r\u00e9elles, leur d\u00e9terminant doit \u00eatre un r\u00e9el :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def sont_colin\u00e9aires(u,v):\n    return d\u00e9terminant(u,v) == 0\n&gt;&gt;&gt; sont_colin\u00e9aires(u,v)\nFalse<\/code><\/pre>\n\n\n\n<p>Pour r\u00e9soudre ce probl\u00e8me on va renoncer \u00e0 l&rsquo;\u00e9galit\u00e9 stricte et lui pr\u00e9f\u00e9rer une presqu&rsquo;\u00e9galit\u00e9 (\u00e0 10<sup>-9<\/sup> pr\u00e8s) :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from math import isclose\ndef sont_colin\u00e9aires(u,v):\n    return isclose(d\u00e9terminant(u,v),0.0,abs_tol=1e-9)\n\n&gt;&gt;&gt; sont_colin\u00e9aires(u,v)\nTrue<\/code><\/pre>\n\n\n\n<p>Mais cela est peu satisfaisant : si le d\u00e9terminant de u et v est approximativement nul, u et v sont approximativement colin\u00e9aires. Pour faire les choses avec plus de pr\u00e9cision, on peut utiliser le calcul formel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Calcul formel<\/h3>\n\n\n\n<p>En Python le calcul formel se fait avec <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from sympy import *<\/code><\/pre>\n\n\n\n<p>Ensuite, on peut red\u00e9finir le vecteur v comme vecteur de fractions :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; v = (Integer(2)\/10,Integer(3)\/10)\n&gt;&gt;&gt; v\n(1\/5, 3\/10)\n&gt;&gt;&gt; d\u00e9terminant(u,v)\n0\n&gt;&gt;&gt; sont_colin\u00e9aires(u,v)\nTrue\n<\/code><\/pre>\n\n\n\n<p>La pr\u00e9cision du calcul formel est infinie :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; w = (sqrt(8),sqrt(18))\n&gt;&gt;&gt; w\n(2*sqrt(2), 3*sqrt(2))\n&gt;&gt;&gt; sont_colin\u00e9aires(v,w)\nTrue\n&gt;&gt;&gt; sont_colin\u00e9aires(u,w)\nTrue<\/code><\/pre>\n\n\n\n<p>Cela peut servir \u00e0 une d\u00e9couverte des \u00e9quations de droites, en prenant par exemple un vecteur (x,y) et en charchant s&rsquo;il est colin\u00e9aire avec u :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; x,y = symbols('x y')\n&gt;&gt;&gt; x\nx\n&gt;&gt;&gt; y\ny\n&gt;&gt;&gt; sont_colin\u00e9aires(u,(x,y))\nFalse\n&gt;&gt;&gt; d\u00e9terminant(u,(x,y))\n-3*x + 2*y<\/code><\/pre>\n\n\n\n<p>Ils ne sont pas colin\u00e9aires, mais le calcul de leur d\u00e9terminant montre que l&rsquo;\u00e9quation de la droite passant par l&rsquo;origine et de vecteur directeur u, a pour \u00e9quation <math data-latex=\"-3 \\times x + 2 \\times y = 0\"><semantics><mrow><mo>\u2212<\/mo><mn>3<\/mn><mo>\u00d7<\/mo><mi>x<\/mi><mo>+<\/mo><mn>2<\/mn><mo>\u00d7<\/mo><mi>y<\/mi><mo>=<\/mo><mn>0<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">-3 \\times x + 2 \\times y = 0<\/annotation><\/semantics><\/math><\/p>\n\n\n\n<p>Et pour l&rsquo;\u00e9quation de la droite passant par le point de coordonn\u00e9es (5,4), et dirig\u00e9e par le vecteur u, on peut tenter :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; d\u00e9terminant(u,(5-x,4-y))\n3*x - 2*y - 7<\/code><\/pre>\n\n\n\n<p>qui donne l&rsquo;\u00e9quation <math data-latex=\"3x - 2 y = 7\"><semantics><mrow><mn>3<\/mn><mi>x<\/mi><mo>\u2212<\/mo><mn>2<\/mn><mi>y<\/mi><mo>=<\/mo><mn>7<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">3x &#8211; 2 y = 7<\/annotation><\/semantics><\/math>.<\/p>\n\n\n\n<p>Cependant, avec le calcul formel, il convient de se demander ce que signifie l&rsquo;\u00e9galit\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; (x-2)*(x+2) == x**2-4\nFalse\n&gt;&gt;&gt; (x-2)*(x+2)\n(x - 2)*(x + 2)\n&gt;&gt;&gt; simplify((x-2)*(x+2))\nx**2 - 4<\/code><\/pre>\n\n\n\n<p>Des expressions ne doivent \u00eatre consid\u00e9r\u00e9es comme \u00e9gales, que si leurs versions simplifi\u00e9es (ici, d\u00e9velopp\u00e9es) le sont. Il est donc parfois n\u00e9cessaire de simplifier des expressions avant de les comparer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le th\u00e8me de la semaine des math\u00e9matiques 2026 est \u00e9galit\u00e9s. Ce concept, tr\u00e8s pr\u00e9sent en math\u00e9matiques, l&rsquo;est aussi dans la programmation objet, et plus g\u00e9n\u00e9ralement en informatique o\u00f9 il existe plusieurs d\u00e9finitions de l&rsquo;\u00e9galit\u00e9. Les diff\u00e9rents sens de l&rsquo;\u00e9galit\u00e9 en maths Le premier math\u00e9maticien \u00e0 parler d&rsquo;\u00e9galit\u00e9 est Euclide. Il \u00e9voque des propri\u00e9t\u00e9s de l&rsquo;\u00e9galit\u00e9 [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,4,10],"tags":[32,35],"coauthors":[54],"class_list":["post-1745","post","type-post","status-publish","format-standard","hentry","category-algorithmes-programmation-et-langages","category-geometrie","category-machines-information-codage","tag-lycee","tag-nsi"],"_links":{"self":[{"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=\/wp\/v2\/posts\/1745","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1745"}],"version-history":[{"count":19,"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=\/wp\/v2\/posts\/1745\/revisions"}],"predecessor-version":[{"id":1987,"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=\/wp\/v2\/posts\/1745\/revisions\/1987"}],"wp:attachment":[{"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1745"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1745"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1745"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/iremi.univ-reunion.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcoauthors&post=1745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}