{"id":9342,"date":"2023-10-11T14:39:35","date_gmt":"2023-10-11T12:39:35","guid":{"rendered":"https:\/\/www.mathweb.fr\/euclide\/?p=9342"},"modified":"2023-10-11T14:39:36","modified_gmt":"2023-10-11T12:39:36","slug":"simplifier-une-racine-carree-en-python","status":"publish","type":"post","link":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/","title":{"rendered":"Simplifier une racine carr\u00e9e en Python"},"content":{"rendered":"\n<p class=\"is-style-Paragraph-paragraph\">Simplifier une racine carr\u00e9e en Python peut s&#8217;av\u00e9rer un peu compliqu\u00e9. C&#8217;est pourquoi j&#8217;ai cr\u00e9\u00e9 une classe pour cela.<\/p>\n\n\n\n<!--more-->\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Au menu sur cette page...<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Simplifier_une_racine_carree_en_Python_introduction\" >Simplifier une racine carr\u00e9e en Python: introduction<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Simplifier_une_racine_carree_en_Python_rappels_mathematiques\" >Simplifier une racine carr\u00e9e en Python: rappels math\u00e9matiques<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Vers_limplementation_Python\" >Vers l&#8217;impl\u00e9mentation Python<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Simplifier_une_racine_carree_en_Python_la_classe\" >Simplifier une racine carr\u00e9e en Python: la classe<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Le_constructeur\" >Le constructeur<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Une_premiere_methode_pour_simplifier_la_racine_carree\" >Une premi\u00e8re m\u00e9thode pour simplifier la racine carr\u00e9e<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#La_methode_str\" >La m\u00e9thode __str__<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Une_alternative\" >Une alternative<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Methode_de_multiplication\" >M\u00e9thode de multiplication<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#La_methode_de_soustraction\" >La m\u00e9thode de soustraction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#La_methode_de_division\" >La m\u00e9thode de division<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#La_methode_dexponentiation\" >La m\u00e9thode d&#8217;exponentiation<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#Limplementation_complete\" >L&#8217;impl\u00e9mentation compl\u00e8te<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Simplifier_une_racine_carree_en_Python_introduction\"><\/span>Simplifier une racine carr\u00e9e en Python: introduction<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">J&#8217;aime beaucoup la <a href=\"https:\/\/www.mathweb.fr\/euclide\/2019\/09\/06\/les-classes-en-python\/\">POO<\/a> et j&#8217;ai choisi, pour r\u00e9pondre \u00e0 la probl\u00e9matique trait\u00e9e dans cet article, ce paradigme de programmation.<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">J&#8217;ai donc souhait\u00e9 \u00e9crire une <em>classe<\/em> Python permettant de repr\u00e9senter un radical, c&#8217;est-\u00e0-dire un nombre de la forme \\(a\\sqrt{b}\\), o\u00f9 <em>a<\/em> et <em>b<\/em> sont deux nombres rationnels.<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">J&#8217;ai souhait\u00e9 impl\u00e9menter les op\u00e9rations \u00e9l\u00e9mentaires (addition, multiplications) et l&#8217;affichage sous la forme la plus r\u00e9duite possible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Simplifier_une_racine_carree_en_Python_rappels_mathematiques\"><\/span>Simplifier une racine carr\u00e9e en Python: rappels math\u00e9matiques<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Avant de se lancer dans un tel projet, aussi humble soit-il, il est peut-\u00eatre n\u00e9cessaire de faire quelques rappels concernant la simplification de racines carr\u00e9es.<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Prenons un exemple: on souhaite simplifier \\(\\sqrt{150}\\). Pour cela, il faut d\u00e9composer en produit de facteurs premiers le radicande (ici, 150):$$150=2\\times3\\times5^2.$$<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Ensuite, on doit extraire les facteurs qui sont \u00e9lev\u00e9s \u00e0 un exposant pair:$$\\sqrt{150}=5^{2\/2}\\sqrt{2\\times3}=5\\sqrt6.$$<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">\u00c0 travers cet exemple, on comprend ce qu&#8217;il faut faire.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Vers_limplementation_Python\"><\/span>Vers l&#8217;impl\u00e9mentation Python<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Pensons que le coefficient et le radicande sont des rationnels; par cons\u00e9quent, je vais utiliser le module <em>fractions<\/em>.<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Ensuite, il me faut impl\u00e9menter une fonction qui d\u00e9compose en produit de facteurs premiers le radicande. Je vais nommer cette fonction  <em>decomp(n)<\/em>. Je vais mettre cette fonction \u00e0 l&#8217;ext\u00e9rieur de ma classe. Cette fonction retournera un dictionnaire de la forme { facteurs premiers : exposants }.<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Il me faudra ensuite penser aux diverses m\u00e9thodes de la classe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Simplifier_une_racine_carree_en_Python_la_classe\"><\/span>Simplifier une racine carr\u00e9e en Python: la classe<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Le_constructeur\"><\/span>Le constructeur<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class Rc:\n    def __init__(self,a,b):\n        self.coef = Fraction(a)\n        self.radicand = Fraction(b)<\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Ici, rien de fou-fou&#8230; \ud83d\ude42 On d\u00e9clare les deux arguments comme des rationnels.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Une_premiere_methode_pour_simplifier_la_racine_carree\"><\/span>Une premi\u00e8re m\u00e9thode pour simplifier la racine carr\u00e9e<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def simp(self):\n        x = self.radicand\n        numer = decomp(x.numerator)\n        denom = decomp(x.denominator)\n        coef_num, radicand_num = 1, 1\n        for facteur, exposant in numer.items():\n            coef_num *= facteur**(exposant\/\/2)\n            if exposant%2 == 1:\n                radicand_num *= facteur\n                \n        coef_denom, radicand_denom = 1, 1\n        for facteur, exposant in denom.items():\n            coef_denom *= facteur**(exposant\/\/2)\n            if exposant%2 == 1:\n                radicand_denom *= facteur\n                \n        return Fraction(coef_num,coef_denom)*self.coef, Fraction(radicand_num,radicand_denom)<\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Cette m\u00e9thode, comme son nom peut le sugg\u00e9rer, consiste \u00e0 simplifier une racine carr\u00e9e sans coefficient (donc \\(\\sqrt{b}\\)). La difficult\u00e9 ici est que ce radicande est consid\u00e9r\u00e9 comme une fraction. Il faut donc simplifier la racine carr\u00e9e du num\u00e9rateur et celle du d\u00e9nominateur.<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">La m\u00e9thode retourne un 2-uplet (coefficient, radicande).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"La_methode_str\"><\/span>La m\u00e9thode __str__<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Vous le savez d\u00e9j\u00e0 s\u00fbrement, mais lorsque vous tapez:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>>>> print(bidule)<\/code><\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">ce qui est affich\u00e9 est ce que renvoie la m\u00e9thode __str__ de l&#8217;objet <em>bidule<\/em>.<\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Ainsi, si je souhaite afficher lisiblement mon objet, je dois formater cet affichage.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def __str__(self):\n        c, r = self.simp()[0], self.simp()[1]\n        if r == 1:\n            return c.__str__()\n        elif c == 1:\n            return f'\u221a({self.simp()[1]})'\n        else:\n            return f'({c})\u221a({r})'<\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">\u00c0 ce stade de l&#8217;impl\u00e9mentation, on a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>>>> a = Rc(1,150)\n>>> print( a )\n(5)\u221a(6)<\/code><\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">L\u2019apparence du r\u00e9sultat est un choix artistique personnel&#8230; Libre \u00e0 vous de l&#8217;adapter \u00e0 votre convenance. Il m&#8217;a juste paru plus clair de mettre les nombres entre parenth\u00e8ses dans le cas o\u00f9 on manipulerait des fractions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>>>> a = Rc(1,Fraction(150,9072))\n>>> print( a )\n(5\/6)\u221a(1\/42)<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">On peut alors bien lire:$$\\sqrt{\\frac{150}{9072}}=\\frac{5}{6}\\sqrt{\\frac{1}{42}}.$$<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Une_alternative\"><\/span>Une alternative<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Si ce formatage ne vous convient pas, ce que je peux ais\u00e9ment concevoir, et si vous pr\u00e9f\u00e9rez le formatage conventionnel \\(k\\sqrt{n}\\), on peut utiliser la m\u00e9thode l\u00e9g\u00e8rement modifi\u00e9e:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def __str__(self):\n        c, r = self.simp()[0], self.simp()[1]\n        \n        if r.denominator != 1:\n            c, r = Fraction(c.numerator,c.denominator*r.denominator), Fraction(r.denominator,1)\n        \n        if r == 1:\n            return c.__str__()\n        elif c == 1:\n            return f'\u221a({self.simp()[1]})'\n        else:\n            return f'({c})\u221a({r})'<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>>>> a = Rc(1,Fraction(150,9072))\n>>> print(a)\n(5\/252)\u221a(42)<\/code><\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Il est vrai que l&#8217;on pr\u00e9f\u00e8re \u00e9crire les r\u00e9sultats de sorte qu&#8217;il n&#8217;y ait pas de radical au d\u00e9nominateur d&#8217;une fraction!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Methode_de_multiplication\"><\/span>M\u00e9thode de multiplication<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def __mul__(self, other):\n        c,r = other.coef, other.radicand\n        return Rc( self.coef * c , self.radicand * r)<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>>>> a, b = Rc(1,150), Rc(1,9072)\n>>> print( a*b )\n(180)\u221a(42)<\/code><\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Le produit est ici consid\u00e9r\u00e9 comme une racine carr\u00e9e, donc comme un objet de la m\u00eame nature que ceux qui sont multipli\u00e9s entre eux.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"La_methode_de_soustraction\"><\/span>La m\u00e9thode de soustraction<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def __sub__(self, other):\n        return self.__add__(Rc(-other.coef,other.radicand))<\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Rien de plus simple quand on sait qu&#8217;une diff\u00e9rence n&#8217;est qu&#8217;une somme dans le corps des nombres r\u00e9els&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"La_methode_de_division\"><\/span>La m\u00e9thode de division<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def __truediv__(self, other):\n        return self.__mul__( Rc(1\/other.coef,1\/other.radicand) )<\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Rien de plus simple quand on sait qu&#8217;une division n&#8217;est qu&#8217;une multiplication dans le corps des nombres r\u00e9els&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"La_methode_dexponentiation\"><\/span>La m\u00e9thode d&#8217;exponentiation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"false\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    def __pow__(self,n):\n        r = Rc(1,1)\n        for _ in range(n):\n            r *= self\n            \n        return r<\/pre>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Rien de plus simple quand on sait que l&#8217;exponentiation est une suite de multiplications \ud83d\ude42<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>>>> a = Rc(1,150)\n>>> print( a**6 )\n3375000\n>>> print( a**7 )\n(16875000)\u221a(6)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Limplementation_complete\"><\/span>L&#8217;impl\u00e9mentation compl\u00e8te<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"is-style-Paragraph-paragraph\">Allez, c&#8217;est cadeau mon coco, voici le tout:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from fractions import Fraction\n\ndef decomp(n):\n    D = dict() # dictionnaire vide\n    \n    k = 2\n    \n    while n > 1:\n        exposant = 0\n        while n%k == 0:\n            exposant = exposant + 1\n            n = n\/k\n        if exposant != 0:\n            D[k] = exposant\n        k = k+1\n        j = 2\n        while k%j == 0:\n            k = k + 1 \n        \n    return D\n\nclass Rc:\n    def __init__(self,a,b):\n        self.coef = Fraction(a)\n        self.radicand = Fraction(b)\n        \n    def simp(self):\n        x = self.radicand\n        numer = decomp(x.numerator)\n        denom = decomp(x.denominator)\n        coef_num, radicand_num = 1, 1\n        for facteur, exposant in numer.items():\n            coef_num *= facteur**(exposant\/\/2)\n            if exposant%2 == 1:\n                radicand_num *= facteur\n                \n        coef_denom, radicand_denom = 1, 1\n        for facteur, exposant in denom.items():\n            coef_denom *= facteur**(exposant\/\/2)\n            if exposant%2 == 1:\n                radicand_denom *= facteur\n                \n        return Fraction(coef_num,coef_denom)*self.coef, Fraction(radicand_num,radicand_denom)\n    \n    def __str__(self):\n        c, r = self.simp()[0], self.simp()[1]\n        \n        if r.denominator != 1:\n            c, r = Fraction(c.numerator,c.denominator*r.denominator), Fraction(r.denominator,1)\n        \n        if r == 1:\n            return c.__str__()\n        elif c == 1:\n            return f'\u221a({self.simp()[1]})'\n        else:\n            return f'({c})\u221a({r})'\n        \n    def __mul__(self, other):\n        c,r = other.coef, other.radicand\n        return Rc( self.coef * c , self.radicand * r)#.__str__()\n        \n    def __add__(self, other):\n        c,r = other.coef, other.radicand\n        s1, s2 = self.simp(), Rc(c,r).simp()\n        if s1[1] == s2[1]:\n            result = Rc(s1[0]+s2[0] , s1[1])\n            return result.__str__()\n        else:\n            return self.__str__() + ' + ' + other.__str__()\n        \n    def __sub__(self, other):\n        return self.__add__(Rc(-other.coef,other.radicand))\n    \n    def __truediv__(self, other):\n        return self.__mul__( Rc(1\/other.coef,1\/other.radicand) )\n    \n    def __pow__(self,n):\n        r = Rc(1,1)\n        for _ in range(n):\n            r *= self\n            \n        return r<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Simplifier une racine carr\u00e9e en Python peut s&#8217;av\u00e9rer un peu compliqu\u00e9. C&#8217;est pourquoi j&#8217;ai cr\u00e9\u00e9 une classe pour cela.<\/p>\n","protected":false},"author":1,"featured_media":9347,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[125,403,222],"class_list":["post-9342","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","tag-decomposistion","tag-facteurs-premiers","tag-racines-carrees"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Simplifier une racine carr\u00e9e en Python - Mathweb.fr<\/title>\n<meta name=\"description\" content=\"Simplifier une racine carr\u00e9e en Python peut s&#039;av\u00e9rer un peu compliqu\u00e9. C&#039;est pourquoi j&#039;ai cr\u00e9\u00e9 une classe pour cela.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Simplifier une racine carr\u00e9e en Python - Mathweb.fr\" \/>\n<meta property=\"og:description\" content=\"Simplifier une racine carr\u00e9e en Python peut s&#039;av\u00e9rer un peu compliqu\u00e9. C&#039;est pourquoi j&#039;ai cr\u00e9\u00e9 une classe pour cela.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Mathweb.fr\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-11T12:39:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-11T12:39:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2023\/10\/head-articles-python-simplifier-racine-carree.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"740\" \/>\n\t<meta property=\"og:image:height\" content=\"198\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"St\u00e9phane Pasquet\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"St\u00e9phane Pasquet\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/\"},\"author\":{\"name\":\"St\u00e9phane Pasquet\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"headline\":\"Simplifier une racine carr\u00e9e en Python\",\"datePublished\":\"2023-10-11T12:39:35+00:00\",\"dateModified\":\"2023-10-11T12:39:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/\"},\"wordCount\":675,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/head-articles-python-simplifier-racine-carree.jpg\",\"keywords\":[\"d\u00e9composistion\",\"facteurs premiers\",\"racines carr\u00e9es\"],\"articleSection\":[\"Python\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/\",\"name\":\"Simplifier une racine carr\u00e9e en Python - Mathweb.fr\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/head-articles-python-simplifier-racine-carree.jpg\",\"datePublished\":\"2023-10-11T12:39:35+00:00\",\"dateModified\":\"2023-10-11T12:39:36+00:00\",\"description\":\"Simplifier une racine carr\u00e9e en Python peut s'av\u00e9rer un peu compliqu\u00e9. C'est pourquoi j'ai cr\u00e9\u00e9 une classe pour cela.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/head-articles-python-simplifier-racine-carree.jpg\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/head-articles-python-simplifier-racine-carree.jpg\",\"width\":740,\"height\":198,\"caption\":\"simplifier racine carr\u00e9e en Python\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/2023\\\/10\\\/11\\\/simplifier-une-racine-carree-en-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Simplifier une racine carr\u00e9e en Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\",\"name\":\"Mathweb.fr\",\"description\":\"Math\u00e9matiques, LaTeX et Python\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#\\\/schema\\\/person\\\/e4d3bb07968238378f0d5052a70dcd69\",\"name\":\"St\u00e9phane Pasquet\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\",\"width\":74,\"height\":77,\"caption\":\"St\u00e9phane Pasquet\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-logo-mathweb.webp\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Simplifier une racine carr\u00e9e en Python - Mathweb.fr","description":"Simplifier une racine carr\u00e9e en Python peut s'av\u00e9rer un peu compliqu\u00e9. C'est pourquoi j'ai cr\u00e9\u00e9 une classe pour cela.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/","og_locale":"fr_FR","og_type":"article","og_title":"Simplifier une racine carr\u00e9e en Python - Mathweb.fr","og_description":"Simplifier une racine carr\u00e9e en Python peut s'av\u00e9rer un peu compliqu\u00e9. C'est pourquoi j'ai cr\u00e9\u00e9 une classe pour cela.","og_url":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/","og_site_name":"Mathweb.fr","article_published_time":"2023-10-11T12:39:35+00:00","article_modified_time":"2023-10-11T12:39:36+00:00","og_image":[{"width":740,"height":198,"url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2023\/10\/head-articles-python-simplifier-racine-carree.jpg","type":"image\/jpeg"}],"author":"St\u00e9phane Pasquet","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"St\u00e9phane Pasquet","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#article","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/"},"author":{"name":"St\u00e9phane Pasquet","@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"headline":"Simplifier une racine carr\u00e9e en Python","datePublished":"2023-10-11T12:39:35+00:00","dateModified":"2023-10-11T12:39:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/"},"wordCount":675,"commentCount":0,"publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2023\/10\/head-articles-python-simplifier-racine-carree.jpg","keywords":["d\u00e9composistion","facteurs premiers","racines carr\u00e9es"],"articleSection":["Python"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/","url":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/","name":"Simplifier une racine carr\u00e9e en Python - Mathweb.fr","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#primaryimage"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2023\/10\/head-articles-python-simplifier-racine-carree.jpg","datePublished":"2023-10-11T12:39:35+00:00","dateModified":"2023-10-11T12:39:36+00:00","description":"Simplifier une racine carr\u00e9e en Python peut s'av\u00e9rer un peu compliqu\u00e9. C'est pourquoi j'ai cr\u00e9\u00e9 une classe pour cela.","breadcrumb":{"@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#primaryimage","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2023\/10\/head-articles-python-simplifier-racine-carree.jpg","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2023\/10\/head-articles-python-simplifier-racine-carree.jpg","width":740,"height":198,"caption":"simplifier racine carr\u00e9e en Python"},{"@type":"BreadcrumbList","@id":"https:\/\/www.mathweb.fr\/euclide\/2023\/10\/11\/simplifier-une-racine-carree-en-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mathweb.fr\/euclide\/"},{"@type":"ListItem","position":2,"name":"Simplifier une racine carr\u00e9e en Python"}]},{"@type":"WebSite","@id":"https:\/\/www.mathweb.fr\/euclide\/#website","url":"https:\/\/www.mathweb.fr\/euclide\/","name":"Mathweb.fr","description":"Math\u00e9matiques, LaTeX et Python","publisher":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mathweb.fr\/euclide\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/www.mathweb.fr\/euclide\/#\/schema\/person\/e4d3bb07968238378f0d5052a70dcd69","name":"St\u00e9phane Pasquet","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp","width":74,"height":77,"caption":"St\u00e9phane Pasquet"},"logo":{"@id":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2025\/06\/cropped-logo-mathweb.webp"}}]}},"_links":{"self":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/9342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/comments?post=9342"}],"version-history":[{"count":0,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/posts\/9342\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media\/9347"}],"wp:attachment":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media?parent=9342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/categories?post=9342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/tags?post=9342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}