<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php-experts.org - développement php et internet &#187; algo</title>
	<atom:link href="http://www.php-experts.org/tag/algo/feed" rel="self" type="application/rss+xml" />
	<link>http://www.php-experts.org</link>
	<description>Ressources sur le développement internet, PHP/MySQL, Ajax, marketing online, référencement...</description>
	<lastBuildDate>Sun, 27 Jun 2010 23:09:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pseudo-code et calcul du PGCD</title>
		<link>http://www.php-experts.org/developpement-web/algoritmes/pseudo-code-et-calcul-du-pgcd-391</link>
		<comments>http://www.php-experts.org/developpement-web/algoritmes/pseudo-code-et-calcul-du-pgcd-391#comments</comments>
		<pubDate>Fri, 30 Oct 2009 11:23:43 +0000</pubDate>
		<dc:creator>Didier</dc:creator>
				<category><![CDATA[Algorithmes]]></category>
		<category><![CDATA[algo]]></category>
		<category><![CDATA[pgcd]]></category>
		<category><![CDATA[pseudo-code]]></category>

		<guid isPermaLink="false">http://www.php-experts.org/?p=391</guid>
		<description><![CDATA[Dans cet article, qui fait partie d&#8217;une série sur les algorithmes usuels en PHP, nous verrons comment rédiger du pseudo-code pour modéliser nos fonctions PHP. L&#8217;algorithme présenté n&#8217;est pas là en raison de sa surpuissance ou de son utilité (pas flagrante dans la vie courante&#8230; ou du moins pas dans la mienne), mais simplement parce [...]]]></description>
			<content:encoded><![CDATA[<p>Dans cet article, qui fait partie d&#8217;une série sur les algorithmes usuels en PHP, nous verrons comment rédiger du pseudo-code pour modéliser nos fonctions PHP. L&#8217;algorithme présenté n&#8217;est pas là en raison de sa surpuissance ou de son utilité (pas flagrante dans la vie courante&#8230; ou du moins pas dans la mienne), mais simplement parce qu&#8217;il est facile à comprendre. Merci <img src='http://www.php-experts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Le &#8220;Plus Grand Commun Diviseur&#8221; est le nombre entier maximal qui divise deux autres entiers (deux, ou plus!). Par exemple, le PGCD de 30 et 12 est 6: il n&#8217;y a aucun nombre entier (integer) supérieur à 6 qui puisse diviser à la fois 12 et 30. Pour calculer le PGCD, théoriquement, on décompose chaque entier en produit de nombres premiers. Ca donne, pour 30 : 2&#215;3x5 et pour 12 : 2&#215;2x3. Quand on prend les facteurs en commun dans les deux expressions, on a bien 3&#215;2 = 6.<br />
<span id="more-391"></span><br />
Mais décomposer un nombre en produits de nombres premiers n&#8217;est pas à proprement parler simple en termes de calculs. Surtout pour un ordinateur, où les divisions coûtent toujours plus cher au niveau du processeur, et à plus forte raison quand, comme ici, il faudra en faire en grand nombre. Assez difficile donc d&#8217;en tirer un algorithme facile à réutiliser et à comprendre.</p>
<h2>Calcul du PGCD par l&#8217;Algorithme d&#8217;Euclide</h2>
<p>Sauf avec l&#8217;Algorithme d&#8217;Euclide, qui part du principe que :</p>
<blockquote><p>si un nombre entier divise deux autres nombres entiers, alors il divise leur différence (et leur somme). Il divisera donc les différences successives du plus petit ôté du plus grand.</p></blockquote>
<p>Source: <a href="http://fr.wikipedia.org/wiki/Algorithme_d%27Euclide">Wikipedia, PGCD (Mathématiques élémentaires)</a> </p>
<p>Il devient alors très simple de trouver le PGCD de deux entiers, sans effectuer la moindre division. On soustrait le plus grand entier au plus petit, jusqu&#8217;à obtenir le plus petit reste non nul. Reprenons l&#8217;exemple de 30 et 12 :</p>
<p>30 &#8211; 12 = 18<br />
18 &#8211; 12 = 6</p>
<p>Et voila !</p>
<h2>Le code de l&#8217;Algorithme d&#8217;Euclide de calcul du PGCD</h2>
<p>Pour pouvoir écrire le code de notre fonction à partir de l&#8217;énoncé de l&#8217;Algorithme, il faut qu&#8217;on traduise les étapes de la résolution du problème en &#8220;pseudo-code&#8221;. Le pseudo-code est une simple syntaxe qui utilise des mots classiques et ressemble fort à du code, mais sans référence à un langage de programmation en particulier. C&#8217;est une étape intermédiaire entre le langage naturel et les langages de programmation. Son but est de modéliser le cheminement &#8220;de pensée&#8221; de l&#8217;Algorithme.<br />
Ici, on dirait :</p>
<blockquote><p>Soient $a et $b deux entiers. (On devra les passer comme paramètres de notre fonction)<br />
Tant que (reste de la soustraction des deux entiers) > entier le plus petit et 0, on continue.</p></blockquote>
<p>On passe ensuite au vrai code PHP, qui traduit simplement ce pseudo-code : </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> pgcd<span class="br0">&#40;</span><span class="re0">$a</span>,<span class="re0">$b</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$reste</span> = <span class="re0">$b</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$reste</span> &gt; <span class="re0">$a</span> &amp;&amp; <span class="re0">$reste</span> &gt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$reste</span> -= <span class="re0">$a</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$reste</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><a href="http://www.php.net/echo"><span class="kw3">echo</span></a> pgcd<span class="br0">&#40;</span><span class="nu0">12</span>,<span class="nu0">30</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p><u>Remarques sur le code : </u> Le code présenté n&#8217;est pas du tout optimal. Il faudrait, notamment, vérifier que l&#8217;entier le plus petit est bien le premier paramètre de la fonction. Bref, c&#8217;est un exemple.</p>
<p>Comme on le voit, l&#8217;Algorithme d&#8217;Euclide permet de trouver très simplement le PGCD de deux entiers (ou plus en modifiant un peu la fonction) sans effectuer de division, avec une seule boucle.</p>
<p>Et en passant par l&#8217;étape du pseudo-code, on sait déjà clairement où on va avant même d&#8217;écrire la première ligne de code. Ici, cela semble trivial, voire même superflu, mais ma vie a déjà été sauvée par quelques lignes de pseudo-code laissées en commentaires dans une fonction particulièrement ardue. Essayez, vous verrez !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.php-experts.org/developpement-web/algoritmes/pseudo-code-et-calcul-du-pgcd-391/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
