{"id":2381,"date":"2020-05-07T11:43:59","date_gmt":"2020-05-07T09:43:59","guid":{"rendered":"https:\/\/www.mathweb.fr\/euclide\/?page_id=2381"},"modified":"2023-04-16T16:18:17","modified_gmt":"2023-04-16T14:18:17","slug":"python-diviser-pour-regner","status":"publish","type":"page","link":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/","title":{"rendered":"Diviser pour r\u00e9gner en Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">La m\u00e9thode du \u00ab\u00a0Diviser pour r\u00e9gner\u00a0\u00bb est un paradigme de programmation imagin\u00e9 pour am\u00e9liorer la complexit\u00e9 d&rsquo;un programme. Regardons ce que cela donne en Python.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-1024x640.png\" alt=\"Diviser pour r\u00e9gner en Python\" class=\"wp-image-2555\" srcset=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-1024x640.png 1024w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-300x188.png 300w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-600x375.png 600w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-768x480.png 768w, https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner.png 1080w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Diviser pour r\u00e9gner en Python<\/figcaption><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-mathweb-fr wp-block-embed-mathweb-fr\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/www.mathweb.fr\/euclide\/produit\/python-en-mathematiques-au-lycee\/\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Le principe du \u00ab\u00a0diviser pour r\u00e9gner\u00a0\u00bb en Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On souhaite calculer \\(N=7^{52}\\). La m\u00e9thode basique consiste \u00e0 multiplier le nombre 7 par lui-m\u00eame 52 fois&#8230; Ce qui n&rsquo;est pas tr\u00e8s rapide !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;id\u00e9e consiste donc \u00e0 diviser le probl\u00e8me en 2 : on va calculer \\( 7^{26} \\times 7^{26}\\), c&rsquo;est-\u00e0-dire \\((7^{26})^2\\). L\u00e0, il n&rsquo;y a plus que 26 + 1 op\u00e9rations (26 multiplications pour calculer \\(7^{26}\\), et une derni\u00e8re pour faire le carr\u00e9 du r\u00e9sultat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On recommence ensuite avec \\(7^{26}\\) : on le calcule en faisant \\( (7^{13})^2 \\). \\(N\\) se calcule alors en 13+1+1 op\u00e9rations au lieu de 52 initialement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On ne s&rsquo;arr\u00eate pas l\u00e0, bien entendu : on continue tant que l&rsquo;on peut utiliser ce principe :$$\\begin{align}N &amp; = 7^{52}\\\\&amp;= (7^{26})^2\\\\&amp;= \\big((7^{13})^2\\big)^2\\\\&amp;=\\big[[(7^6)^2\\times7]^2\\big]^2\\\\&amp;=\\big[[\\big((7^3)^2\\big)^2\\times7]^2\\big]^2\\\\&amp;=\\big[[\\big((7^2\\times7)^2\\big)^2\\times7]^2\\big]^2 \\end{align}$$<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le principe est, vous l&rsquo;avez peut-\u00eatre remarqu\u00e9, r\u00e9cursif.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Impl\u00e9mentation en Python du \u00ab\u00a0diviser pour r\u00e9gner\u00a0\u00bb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous allons \u00e9crire une fonction \u00ab\u00a0puissance(x,n)\u00a0\u00bb bas\u00e9e sur ce paradigme, o\u00f9 <em>x<\/em> et <em>n<\/em> sont deux entiers (positif pour <em>n<\/em>). Pour cela, nous allons prendre en compte que:$$\\begin{cases}x^0  = 0&amp; \\\\x^n   = (x^2)^{n\/2} &amp; \\text{ si }n\\text{ est pair}\\\\x^n = x(x^2)^{(n-1)\/2} &amp; \\text{ si }n\\text{ est impair} \\end{cases}$$Cela donne alors la fonction suivante (exponentiation rapide):<\/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=\"\">def puissance(x,n):\n    if n == 0:\n        return 1\n    elif n%2 == 0:\n        return puissance(x*x , n\/2)\n    else:\n        return x * puissance(x*x , (n-1)\/2)\n    \n\nprint(puissance(2,9))<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Complexit\u00e9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Notons \\(C(n)\\) la complexit\u00e9 de la fonction \u00ab\u00a0puissance(n)\u00a0\u00bb.  Comme nous divisons en deux le probl\u00e8me \u00e0 chaque appel de la fonction, on peut estimer que : $$C(n) = a C(n\/2) + f(n)$$o\u00f9 \\(f(n)\\) est la complexit\u00e9 totale due au partage et \u00e0 la recombinaison, et o\u00f9:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\\(a=1\\) si la fonction s&rsquo;applique \u00e0 l&rsquo;un des deux sous-probl\u00e8mes;<\/li><li>\\(a=2\\) si la fonction s&rsquo;applique aux deux sous-probl\u00e8mes.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le cas de l&rsquo;exponentiation rapide, <em>a<\/em> = 1 et:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>si <em>n<\/em> est pair, \\(C(n) = C(n\/2) + 1\\);<\/li><li>si <em>n<\/em> est impair, \\(C(n) = C\\left(\\frac{n-1}{2}\\right) + 2\\).<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">On arrive \u00e0 prouver (sans doute au-del\u00e0 du programme de Terminale NSI) que la complexit\u00e9 de l&rsquo;exponentiation rapide est \\(C(n) = O(\\ln n)\\).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.mathweb.fr\/euclide\/ressources-python\/\">[Retour \u00e0 la page principale]<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La m\u00e9thode du \u00ab\u00a0Diviser pour r\u00e9gner\u00a0\u00bb est un paradigme de programmation imagin\u00e9 pour am\u00e9liorer la complexit\u00e9 d&rsquo;un programme. Regardons ce que cela donne en Python. Le principe du \u00ab\u00a0diviser pour r\u00e9gner\u00a0\u00bb en Python On souhaite calculer \\(N=7^{52}\\). La m\u00e9thode basique consiste \u00e0 multiplier le nombre 7 par lui-m\u00eame 52 fois&#8230; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2381","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Diviser pour r\u00e9gner en Python - Mathweb.fr - Optimiser un programme<\/title>\n<meta name=\"description\" content=\"La m\u00e9thode du &quot;diviser pour r\u00e9gner&quot; est une paradigme de programmation permettant d&#039;acc\u00e9lerer un programme. Regardons ce que cela donne en Python.\" \/>\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\/python-diviser-pour-regner\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Diviser pour r\u00e9gner en Python - Mathweb.fr - Optimiser un programme\" \/>\n<meta property=\"og:description\" content=\"La m\u00e9thode du &quot;diviser pour r\u00e9gner&quot; est une paradigme de programmation permettant d&#039;acc\u00e9lerer un programme. Regardons ce que cela donne en Python.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/\" \/>\n<meta property=\"og:site_name\" content=\"Mathweb.fr\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-16T14:18:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-1024x640.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/\",\"name\":\"Diviser pour r\u00e9gner en Python - Mathweb.fr - Optimiser un programme\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/Python-diviser-pour-regner-1024x640.png\",\"datePublished\":\"2020-05-07T09:43:59+00:00\",\"dateModified\":\"2023-04-16T14:18:17+00:00\",\"description\":\"La m\u00e9thode du \\\"diviser pour r\u00e9gner\\\" est une paradigme de programmation permettant d'acc\u00e9lerer un programme. Regardons ce que cela donne en Python.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/Python-diviser-pour-regner.png\",\"contentUrl\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/Python-diviser-pour-regner.png\",\"width\":1080,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/python-diviser-pour-regner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.mathweb.fr\\\/euclide\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Diviser pour r\u00e9gner 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":"Diviser pour r\u00e9gner en Python - Mathweb.fr - Optimiser un programme","description":"La m\u00e9thode du \"diviser pour r\u00e9gner\" est une paradigme de programmation permettant d'acc\u00e9lerer un programme. Regardons ce que cela donne en Python.","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\/python-diviser-pour-regner\/","og_locale":"fr_FR","og_type":"article","og_title":"Diviser pour r\u00e9gner en Python - Mathweb.fr - Optimiser un programme","og_description":"La m\u00e9thode du \"diviser pour r\u00e9gner\" est une paradigme de programmation permettant d'acc\u00e9lerer un programme. Regardons ce que cela donne en Python.","og_url":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/","og_site_name":"Mathweb.fr","article_modified_time":"2023-04-16T14:18:17+00:00","og_image":[{"url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-1024x640.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/","url":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/","name":"Diviser pour r\u00e9gner en Python - Mathweb.fr - Optimiser un programme","isPartOf":{"@id":"https:\/\/www.mathweb.fr\/euclide\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/#primaryimage"},"image":{"@id":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner-1024x640.png","datePublished":"2020-05-07T09:43:59+00:00","dateModified":"2023-04-16T14:18:17+00:00","description":"La m\u00e9thode du \"diviser pour r\u00e9gner\" est une paradigme de programmation permettant d'acc\u00e9lerer un programme. Regardons ce que cela donne en Python.","breadcrumb":{"@id":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/#primaryimage","url":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner.png","contentUrl":"https:\/\/www.mathweb.fr\/euclide\/wp-content\/uploads\/2020\/06\/Python-diviser-pour-regner.png","width":1080,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/www.mathweb.fr\/euclide\/python-diviser-pour-regner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.mathweb.fr\/euclide\/"},{"@type":"ListItem","position":2,"name":"Diviser pour r\u00e9gner 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\/pages\/2381","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/types\/page"}],"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=2381"}],"version-history":[{"count":0,"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/pages\/2381\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.mathweb.fr\/euclide\/wp-json\/wp\/v2\/media?parent=2381"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}