<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://cygal.info/blog/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Dissidents - Algo</title>
  <link>http://cygal.info/blog/index.php/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 01 Apr 2008 21:56:24 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>« Ca ne marchera pas ...</title>
    <link>http://cygal.info/blog/index.php/post/Ca-ne-marchera-pas</link>
    <guid isPermaLink="false">urn:md5:dfc82c01f9845324d0d87dc8ec15a362</guid>
    <pubDate>Mon, 05 Nov 2007 16:16:00 +0100</pubDate>
    <dc:creator>Dark-Side</dc:creator>
        <category>Algo</category>
        <category>IA</category><category>prolog</category><category>sex</category>    
    <description>... Vous savez pourquoi ? Parce que ça nous amuse. Vous trouvez quelque chose pour m’emmerder, je trouve quelque chose pour vous emmerder. C’est un jeu et je vais gagner. J’ai un coup d’avance. Vous êtes déjà emmerdé. »&lt;br /&gt;&lt;ins&gt;&lt;strong&gt;Edité le 25/12/07&lt;/strong&gt;&lt;/ins&gt;&lt;br /&gt;    Je crois que je vais faire comme ça désormais, toujours commencer mes articles par une citation sans rapport (ou du moins sans rapport logique apparent).&lt;br /&gt;
Bref, je suis là parce que j'avais dis que je vous montrerai une IA en &lt;strong&gt;&lt;em&gt;prolog&lt;/em&gt;&lt;/strong&gt;. Donc voilà je vais vous en montrer une.&lt;br /&gt;
Pour qu'on soit d'accord tout de suite : &lt;ol&gt;&lt;li&gt;oui le code est sale&lt;/li&gt;
&lt;li&gt;oui je m'en fous&lt;/li&gt;
&lt;li&gt;non je n'accepterai aucune remarque&lt;/li&gt;
&lt;/ol&gt;
Bien. Ceci mis au clair, voici le code : &lt;pre&gt;est_vainqueur(papier, pierre).&lt;br /&gt;est_vainqueur(pierre, ciseaux).&lt;br /&gt;est_vainqueur(ciseaux, papier).&lt;br /&gt;&lt;br /&gt;corres(pierre, 1).&lt;br /&gt;corres(papier, 2).&lt;br /&gt;corres(ciseaux, 3).&lt;br /&gt;&lt;br /&gt;corresp(perdu, 0).&lt;br /&gt;corresp(nul, 1).&lt;br /&gt;corresp(gagne, 2).&lt;br /&gt;&lt;br /&gt;same(X, X).&lt;br /&gt;&lt;br /&gt;plus_joue([Papier,Pierre,Ciseaux], X) :- Pierre &amp;gt;= Papier, Pierre &amp;gt;= Ciseaux, same(X, pierre).&lt;br /&gt;plus_joue([Papier,Pierre,Ciseaux], X):- Pierre =&amp;lt; Papier, Papier &amp;gt;= Ciseaux, same(X, papier).&lt;br /&gt;plus_joue([Papier,Pierre,Ciseaux], X) :- Ciseaux &amp;gt;= Papier, Pierre =&amp;lt; Ciseaux, same(X, ciseaux).&lt;br /&gt; &lt;br /&gt;traiter(perdu, pierre, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).&lt;br /&gt;traiter(perdu, ciseaux, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).&lt;br /&gt;traiter(perdu, papier, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).&lt;br /&gt; &lt;br /&gt;traiter(nul, papier, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).&lt;br /&gt;traiter(nul, pierre, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).&lt;br /&gt;traiter(nul, ciseaux, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).&lt;br /&gt; &lt;br /&gt;traiter(gagne, ciseaux, [Papier, Pierre, Ciseaux], X) :- P is Papier + 1, same(X, [P,Pierre, Ciseaux]).&lt;br /&gt;traiter(gagne, papier, [Papier, Pierre, Ciseaux], X) :- P is Pierre + 1, same(X, [Papier,P, Ciseaux]).&lt;br /&gt;traiter(gagne, pierre, [Papier, Pierre, Ciseaux], X) :- C is Ciseaux + 1, same(X, [P,Pierre, C]).&lt;br /&gt; &lt;br /&gt;alea(X) :- random(1,4, X).&lt;br /&gt;&lt;br /&gt;stat(Coups, Nb) :- &lt;br /&gt;	plus_joue(Coups, Adv),&lt;br /&gt;	est_vainqueur(Coup, Adv),&lt;br /&gt;        corres(Coup, Nb).&lt;br /&gt;&lt;br /&gt;jouer(Coups, X) :- &lt;br /&gt;	random(1, 11, Al),&lt;br /&gt;	(Al =:= 1 -&amp;gt; alea(Nb);&lt;br /&gt;	stat(Coups, Nb)),&lt;br /&gt;	write(Nb), nl,&lt;br /&gt;	write('Gagné, nul ou perdu ?'), nl,&lt;br /&gt;	read(Score),&lt;br /&gt;	corresp(S, Score),&lt;br /&gt;	traiter(S, Coup, Coups, X).&lt;br /&gt;&lt;br /&gt;boucle(Coups) :-&lt;br /&gt;	jouer(Coups, N_coups),&lt;br /&gt;	write('1 pour rejouer, 0 pour arreter.'), nl,&lt;br /&gt;	read(X),&lt;br /&gt;	X =:= 1,&lt;br /&gt;	boucle(N_coups).&lt;br /&gt;	&lt;br /&gt;init :- boucle([0,0,0]).&lt;/pre&gt;
&lt;br /&gt;
Naturellement je vais faire quelques remarque, alors il faut savoir que c'est mon premier code en prolog, c'est pour ça qu'il est sale. Ensuite : ce code est surement optimisable (surtout au niveau des fonctions &lt;em&gt;traiter&lt;/em&gt;) mais ce n'est pas important, ce qu'il faut voir c'est que même si ce code est un peu plus long qu'un code OCaml bien optimisé il est quand même bien plus facile à comprendre par un non initié. Et c'est &lt;strong&gt;ça&lt;/strong&gt; l'important !
&lt;br /&gt;&lt;br /&gt;
Voilà, bonne journée !</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Ca-ne-marchera-pas#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Ca-ne-marchera-pas#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/42</wfw:commentRss>
      </item>
    
  <item>
    <title>Chiffrement de Vigenère</title>
    <link>http://cygal.info/blog/index.php/post/Chiffrement-de-Vigenere</link>
    <guid isPermaLink="false">urn:md5:9278247df8ca781e363eecf7fa5ae714</guid>
    <pubDate>Sat, 15 Sep 2007 21:58:00 +0000</pubDate>
    <dc:creator>Dark-Side</dc:creator>
        <category>Algo</category>
        <category>Crypto</category><category>inutile</category>    
    <description>Une brêve présentation de l'algorithme de cryptage inventé par Blaise de Vigenère au XVIe siècle.    Bon, je vais pas faire comme quelques rédacteurs de ce blog bien connu et vous dire que je vais vous sortir un article sur la cryptologie chaque semaine, déjà parce que je sais que je ne tiendrais jamais cet objectif, ensuite car je me doutes que ça va vite lasser tout le monde :-°&lt;br /&gt;&lt;br /&gt;
Mais bon comme le sujet m'interesse un temps soit peu et que je ne me préoccupes pas particulièrement de l'interêt que les visiteurs réguliers (alias les autres rédacteurs) peuvent lui porter je vais surement vous sortir quelques articles dessus ^_^&lt;br /&gt;&lt;br /&gt;
Pour ce premier article je vais vous parler du Chiffrement de Vigenère. Ceux qui connaissent un peu cette technique doivent s'attendra à voir apparaître ce &lt;a href=&quot;http://cygal.info/blog/public/Cryptographie/table_vigenere.png&quot;&gt;tableau&lt;/a&gt;.&lt;br /&gt;
Mais ce ne sera pas le cas (enfin si mais c'est juste pour vous dire qu'osef en fait :D ).&lt;br /&gt;&lt;br /&gt;
Non nous on va parler de la méthode mathématique, facilement implémentable dans un algorithme (plus facilement tu meurs d'ailleurs).&lt;br /&gt;
Le principe est très simple en mathématique les lettres de l'alphabet sont numérotées de 0 à 25 (oui toujours cette manie de mettre le premier index à 0), il devient alors très facile de crypter un texte lettre par lettre (comme ça va être le cas pour cette algorithme). Pour ce chiffrement on va devoir utiliser une clé de chiffrement et pour chaque lettre en clair va correspondre une lettre cryptée qui varie en fonction de la clé utilisée, et de la position de la lettre dans le texte.&lt;br /&gt;
En effet à chaque lettre va correspondre une lettre de la clé à partir de laquelle on trouvera la lettre cryptée.
Comme je me doute que ce n'est pas très clair voici un exemple :&lt;pre&gt;Texte de départ    : MOT&lt;br /&gt;Clé de chiffrement : CLE&lt;/pre&gt;
C'est assez basique comme exemple me direz vous mais on voit bien qu'à chaque lettre du mot MOT corresponds une lettre de la clé, vous pouvez alors vous demander : mais comment faire si le texte comporte plusieurs mots voir phrases, paragraphes ? La clé doit être  de la même longueur ? (c'est bien ces petites question ça montre pas du tout que je vous prends pour des cons et ça met une ambiance bonne enfant comme celle du site du zéro :-° )&lt;br /&gt;
Et bien je vais me faire un plaisir de vous répondre que non, il vous suffit de répeter la clé (*exclamations de surprise parmi la foule de lecteurs*), exemple :&lt;pre&gt;j'ai plusieurs mots dans mon texte&lt;br /&gt;clec lecleclec lecl ecle cle clecl&lt;/pre&gt;
Bon et maintenant qu'on a ça on fait quoi ?&lt;br /&gt;&lt;br /&gt;
Et bien on utilise la fonction mathématique (hyper compliquée soit dit en passant) que je vais vous montrer sous peu, ou alors on regarde dans le tableau la cellule présente à la colonne de la lettre à crypter et à la ligne de la lettre de la clé utilisée.&lt;br /&gt;
Avouez que ça devient vite lent et rébarbatif, au lieu de faire ça vous pouvez aussi utiliser le fait que chaque lettre qu'elle fasse partie de la clé, du texte à crypter ou du texte crypté a un index compris entre 0 et 25 (comme je vous l'ai appris précédement). Une fois qu'on a bien enregistré ce principe on a plus qu'à additionner pour chaque lettre du texte en clair : son index et l'index de la lettre de la clé correspondante, le résultat sera l'index de la lettre cryptée. Le problème une fois qu'on a fait ça c'est que par exemple si un z est associé à un y on a : 25+24 ce qui donne 49, c'est marrant on dirait que ça corresponds pas à une lettre cet index. :S&lt;br /&gt;
Ce qu'on peut faire c'est appliquer un modulo 26 à ce résultat, on obtient ainsi 49%26 = 23. Et 23 ça correspond à quoi ? A un 'x', c'est bon on a ce qu'on voulait !!!&lt;br /&gt;
Pour résumer on a la fonction suivante :
&lt;code&gt;crypté = (clair + cle) % 26&lt;/code&gt;
&lt;br /&gt;&lt;br /&gt;
Have fun ! (ou pas)</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Chiffrement-de-Vigenere#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Chiffrement-de-Vigenere#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/38</wfw:commentRss>
      </item>
    
  <item>
    <title>Un langage d'homme, un vrai ...</title>
    <link>http://cygal.info/blog/index.php/post/Un-langage-dhomme-un-vrai</link>
    <guid isPermaLink="false">urn:md5:0007ed651e50f18b46b08e5139620b73</guid>
    <pubDate>Mon, 27 Aug 2007 21:55:00 +0000</pubDate>
    <dc:creator>Dark-Side</dc:creator>
        <category>Algo</category>
        <category>ocaml</category><category>sex</category>    
    <description>Parce que y'en a marre de ces langages d'hérétiques ! (cf: billets précédents)&lt;br /&gt;
On va enfin pouvoir regarder un langage pur (et sayx) : l'ocaml ...    Je ne vais pas passer trois heures à vous présenter le caml vous avez déjà tous du écouter bluestorm moi je vais vous donner des exemples (des vrais) de la supériorité du caml sur les langages impurs.&lt;br /&gt;
Celà va d'un simple &quot;hello world ! &quot; à un bot irc §§
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;Les différents exemples&lt;/h2&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;ins&gt;&quot;Hello, World !&quot;&lt;/ins&gt;&lt;/strong&gt;&lt;br /&gt;
Code ocaml :
&lt;pre&gt;print_string &quot;Hello, World !&quot;&lt;/pre&gt;
Code C:
&lt;pre&gt;#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
int main(int argc, char *argv[])
{
printf(&quot;Bonjour&quot;);
return 0;
}
&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&lt;/pre&gt;
La lourdeur d'un langage impératif/impur n'est pas à démontrer plus avant sur cette exemple on va donc passer au suivant si vous le voulez bien !
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;ins&gt;Un algorithme de cryptage simple : le césar&lt;/ins&gt;&lt;/strong&gt;&lt;br /&gt;
Le code en ocaml :&lt;pre&gt;let rec replace crypted initial cle i long=&lt;br /&gt;    if i &amp;gt;= long then crypted&lt;br /&gt;    else &lt;br /&gt;      let cc = Char.chr (cle + Char.code initial.[i]) in&lt;br /&gt;      let sc = String.make 1 cc in replace (crypted ^ sc) initial cle (i+1) long&lt;br /&gt;;;&lt;br /&gt;&lt;br /&gt;let encrypt (mot: string) (cle: int) =&lt;br /&gt;  let long = String.length mot in&lt;br /&gt;  (replace &quot;&quot; mot cle 0 long)&lt;br /&gt;;;&lt;br /&gt;&lt;br /&gt;let string = read_line() in&lt;br /&gt;let cle = read_int ()in&lt;br /&gt;print_endline (encrypt string cle)&lt;/pre&gt;
Le code en C : &lt;pre&gt;#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#define MAX_BUF 50
void encrypt (char *chaine, int cle)
{
char *p;
for (p=chaine; *p != '\0'; ++p)
{
if(isalpha(*p+cle))
*p += cle;
}
printf (&quot;%s\n&quot;, chaine);
}
void clear(char* s, FILE* buffer)
{
char *p = NULL;
if((p = strchr(s, '\n')) != NULL)
*p = '\0';
else
while(getc(buffer) != '\n');
}
int main(int argc, char *argv[])
{
char chaine[MAX_BUF];
int cle;
fgets (chaine, MAX_BUF - 1, stdin);
clear(chaine, stdin);
scanf(&quot;%i&quot;, &amp;amp;cle);
encrypt (chaine, cle);
return 0;
}
&lt;/string.h&gt;&lt;/stdlib.h&gt;&lt;/stdio.h&gt;&lt;/pre&gt;
Une fois de plus le code C est plus long que le code en ocaml §§
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;ins&gt;Conway's game of life&lt;/ins&gt;&lt;/strong&gt;&lt;br /&gt;
Le code en ocaml : &lt;a href=&quot;http://www.pastebin.be/4803&quot;&gt;jeu_de_la_vie.ml&lt;/a&gt;&lt;br /&gt;
Le code en C : &lt;a href=&quot;http://www.perdu.com&quot;&gt;jeu_de_la_vie.c&lt;/a&gt; (merci à Cygal pour ce code gracieusement fournis, &lt;em&gt;il ne se doutais pas de ce à quoi allait servir sinon je ne l'aurais surement jamais eu en fait :p&lt;/em&gt;)&lt;br /&gt;
Concernant le code de Cygal vous pouvez enlever si vous le souhaitez tous les beaux commentaires qui ne servent à rien dans le contexte de cet article il n'en demeurera pas moins plus long, après certains pourront dire qu'il est mieux, le rendu plus jolie, etc etc mais reconnaissez que tous ces commentaires seraient dénués de bonne fois :p (tous comme ce billet ? :-° )
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;strong&gt;&lt;ins&gt;Le bot IRC&lt;/ins&gt;&lt;/strong&gt;
&lt;br /&gt;
Euh ... disons qu'on en parlera à l'occasion d'un autre article :D
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Conclusion:&lt;/h2&gt;
&lt;br /&gt;
Bon vous direz que ce billet pue (mais bon on a vu pire hein :p ) et que y'a des langages surement mieux que le caml mais sans exemples concrets vous resterez sous sa domination (mouhahahaha ? :-° ) si jamais vous avez envie de rajouter des exemples en python, en ruby voir en Obj-C n'hésitez pas à &lt;del&gt;éditer ce billet&lt;/del&gt; à me les passer afin que je les soumettent à la censure/dégradent/refuse.&lt;br /&gt;
Merci de votre attention.&lt;br /&gt;
Vous pouvez désormais fermer votre navigateur et reprendre une activité normale ... :p
&lt;br /&gt;&lt;br /&gt;
PS: je promet de trouver une vrai idée pour les autres billets et de les rédiger un tant soit peu :p&lt;br /&gt;
PS 2: Et dire que j'ai emmerdé Poulet toute la journée pour ce billet, quand il va le voir il va être deg :D</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/Un-langage-dhomme-un-vrai#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/Un-langage-dhomme-un-vrai#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/33</wfw:commentRss>
      </item>
    
  <item>
    <title>Superformula</title>
    <link>http://cygal.info/blog/index.php/post/2007/05/21/Superformula</link>
    <guid isPermaLink="false">urn:md5:419bf4973247e5ac8a52935ce2c9b5ab</guid>
    <pubDate>Mon, 21 May 2007 17:15:00 +0200</pubDate>
    <dc:creator>lasts</dc:creator>
        <category>Algo</category>
        <category>Qt</category>    
    <description>&lt;p&gt;Dans la continuité du Perlin Noise, une formule magique pour générer des courbes capables d'imiter celles qu'on trouve dans la nature (selon son inventeur, Johan Gielis, un biologiste à la con qui a généralisé le principe des &lt;a href=&quot;http://en.wikipedia.org/wiki/Superellipse&quot; hreflang=&quot;en&quot;&gt;superellipses&lt;/a&gt;).&lt;/p&gt;    &lt;p&gt;La formule permet de déterminer en coordonnées polaires (rayon, angle) le point de la courbe en fonction de six paramètres (&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;m&lt;/code&gt;, &lt;code&gt;n1&lt;/code&gt;, &lt;code&gt;n2&lt;/code&gt; et &lt;code&gt;n3&lt;/code&gt;). A vue de nez, les paramètres &lt;code&gt;a&lt;/code&gt; et &lt;code&gt;b&lt;/code&gt; déterminent la forme générale (cercle / ellipse) tandis qu'&lt;code&gt;m&lt;/code&gt; influence plutôt le nombre de pics. 'Fin bref, c'est pas très compliqué, les intérêts sont multiples, typiquement pour stoquer des formes complexes dans un format léger ou avoir des courbes esthétiques à disposition.&lt;/p&gt;
&lt;div class=&quot;centre&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/math/9/3/2/932649147ef032f63b06bafbd22d2554.png&quot; /&gt;&lt;/div&gt;
&lt;p&gt;La &lt;a hreflang=&quot;en&quot; href=&quot;http://en.wikipedia.org/wiki/Superformula&quot;&gt;page wikipedia&lt;/a&gt; fournit également des exemples de valeurs à donner aux paramètres &lt;code&gt;m&lt;/code&gt;, &lt;code&gt;n1/2/3&lt;/code&gt; (avec &lt;code&gt;a = b = 1&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&quot;centre&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/1/1c/Superformula.gif&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Et la &lt;a href=&quot;http://lasts.goldzoneweb.info/superformula/&quot;&gt;source en c++/qt (ainsi que des screenshots)&lt;/a&gt; fait maison pour expérimenter un peu dans son coin (super, super, me direz vous; la suite en 3d sera pour un autre jour).&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/2007/05/21/Superformula#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/2007/05/21/Superformula#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/9</wfw:commentRss>
      </item>
    
  <item>
    <title>Perlin Noise</title>
    <link>http://cygal.info/blog/index.php/post/2007/05/20/9-perlin-noise</link>
    <guid isPermaLink="false">urn:md5:a30352832708821465313ab45ae7b56a</guid>
    <pubDate>Sun, 20 May 2007 16:12:37 +0000</pubDate>
    <dc:creator>lasts</dc:creator>
        <category>Algo</category>
        <category>Qt</category>    
    <description>&lt;p&gt;Ou comment générer des courbes aléatoires jolies qui peuvent servir à un peu n'importe quoi, comme fabriquer des textures à bas prix, dessiner des trucs qu'on dirait que ça a été fait à la main ou générer des terrains / nuages à la &lt;a href=&quot;http://fr.wikipedia.org/wiki/Terragen&quot;&gt;terragen&lt;/a&gt;. Bref, une réponse possible à la question du réalisme en informatique dans des domaines assez diversifiés.&lt;/p&gt;    &lt;p&gt;Le Perlin Noise (ouais, ça veut dire bruit de Perlin, mais merde) est une fractale qui permet de rendre plus naturelle une série aléatoire. Le principe est assez simple : prendez &lt;code&gt;n&lt;/code&gt; valeurs aléatoires oscillant entre &lt;code&gt;0&lt;/code&gt; et &lt;code&gt;k&lt;/code&gt; et interpolez-les. Vous obtenez un résultat immonde et somme toute très banal. Re-prendez &lt;code&gt;2*n&lt;/code&gt; valeurs aléatoires oscillant entre &lt;code&gt;0&lt;/code&gt; et &lt;code&gt;k/2&lt;/code&gt; et interpolez-les. Ajoutez le résultat obtenu à la courbe précédente. Recommencez autant de fois que voulu. Servir chaud.&lt;/p&gt;

&lt;div class=&quot;centre&quot;&gt;
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/prln_c1.gif&quot; /&gt; +
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/prln_c2.gif&quot; /&gt; +
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/prln_c3.gif&quot; /&gt; +
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/prln_c4.gif&quot; /&gt; +
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/prln_c5.gif&quot; /&gt; +
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/prln_c6.gif&quot; /&gt; =
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/prln_cr.gif&quot; /&gt;
&lt;/div&gt;

&lt;p&gt;Bien, on reprends avec des vrais mots : appelons &lt;code&gt;n&lt;/code&gt; la fréquence et &lt;code&gt;k&lt;/code&gt; l'amplitude. Plus l'amplitude diminue, moins la courbe a d'influence sur le résultat final. Plus la fréquence augmente, plus la courbe est saccadée. On arrête naturellement l'itération lorsque l'amplitude est trop faible pour être visible.&lt;/p&gt;

&lt;p&gt;Concernant le passage sur l'interpolation, juste histoire de vous rafraîchir la mémoire : l'interpolation consiste à construire une courbe à partir de n points donnés. On citera notamment l'interpolation linéaire, qui consiste à relier chaque point par une ligne, l'interpolation sinusoïdale (la même chose, avec des sinus, si si), cubique ou lagrangienne (mais en pratique, tout le monde vous dira de favoriser l'avant-dernière).&lt;/p&gt;

&lt;div class=&quot;centre&quot;&gt;
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/m_inter1.gif&quot; /&gt;
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/m_inter2.gif&quot; /&gt;
&lt;img src=&quot;http://freespace.virgin.net/hugo.elias/models/m_inter4.gif&quot; /&gt;&lt;br /&gt;
linéaire / sinusoïdale / cubique
&lt;/div&gt;

&lt;div class=&quot;flot_droite&quot;&gt;&lt;a href=&quot;http://cygal.info/blog/images/algos/noise_2.jpg&quot;&gt;&lt;img src=&quot;http://cygal.info/blog/images/algos/noise_thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Le perlin noise en une dimension, c'est déjà super pratique pour tracer des traits à la main informatiquement (principe qui est notamment utilisé dans l'industrie logiciel pour donner un coté esquisse à l'apparence des gui et bien faire comprendre aux clients que le produit qu'ils voient n'est pas terminé - cf &lt;a href=&quot;http://mrl.nyu.edu/~meyer/projects/etchapad/lines.html&quot;&gt;Creating Informal Looking Interfaces&lt;/a&gt;). Lorsqu'on bascule en 2d, ça permet de générer des textures originales qui rendent super bien (marbre, bois, whatever en fait, il suffit d'appliquer un filtre sur le rendu) et qui ne consomment pas des masses. Lorsqu'on bascule en 3d, ça permet de donner plus de consistance à une map, à faire des &lt;a href=&quot;http://freespace.virgin.net/hugo.elias/models/m_clouds.htm&quot;&gt;jolis nuages&lt;/a&gt;, etc.&lt;/p&gt;

&lt;p&gt;Et pour conclure, une &lt;a href=&quot;http://lasts.goldzoneweb.info/perlin_noise/perlin_noise.zip&quot;&gt;implémentation en c++/qt&lt;/a&gt; vraiment lente ainsi qu'un &lt;a href=&quot;http://freespace.virgin.net/hugo.elias/models/m_perlin.htm&quot;&gt;joli lien&lt;/a&gt; vers un monsieur qui en parle mieux que moi (ouais, c'est minable comme redirection, le but était juste de vous présenter le concept).&lt;/p&gt;

&lt;p&gt;A noter que ça donne des &lt;a href=&quot;http://lasts.goldzoneweb.info/perlin_noise/noise_1.jpg&quot;&gt;bugs intéressants&lt;/a&gt; aussi.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/2007/05/20/9-perlin-noise#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/2007/05/20/9-perlin-noise#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/8</wfw:commentRss>
      </item>
    
  <item>
    <title>Project Euler</title>
    <link>http://cygal.info/blog/index.php/post/2007/05/19/6-project-euler</link>
    <guid isPermaLink="false">urn:md5:63ca3ac1cf70a6688908de6f15b0b698</guid>
    <pubDate>Sat, 19 May 2007 16:47:00 +0000</pubDate>
    <dc:creator>Cygal</dc:creator>
        <category>Algo</category>
        <category>Maths</category>    
    <description>&lt;p&gt;De la présentation d'un «&amp;nbsp;projet » qu'il est bien.&lt;/p&gt;
&lt;p&gt;Ou comment résoudre des problèmes mathématiques avec les outils qui vous plaisent, quels qu'ils soient.&lt;/p&gt;    &lt;div class=&quot;flot_droite&quot;&gt;&lt;a href=&quot;http://projecteuler.net/&quot; hreflang=&quot;en&quot;&gt;&lt;img src=&quot;http://cygal.info/blog/public/sites/project_euler.jpg&quot; alt=&quot;Logo du Projet Euler&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Le principe de &lt;a href=&quot;http://projecteuler.net/&quot; hreflang=&quot;en&quot;&gt;Project Euler&lt;/a&gt;
est très simple&amp;nbsp;: vous vous inscrivez (c'est rapide), et vous avez
à votre disposition de nombreux problèmes « mathématiques » (155 à
l'heure où je vous écris), pour la plupart assez originaux, et en tout
cas assez amusants, des plus simples aux plus ardus. Les premiers
permettent de se mettre en jambe, voyez vous-même (ceci est le problème
classé comme le plus facile)&amp;nbsp;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If we list all the natural numbers below 10 that are
multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples
is 23.
Find the sum of all the multiples of 3 or 5 below 1000.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour les anglophobes, sachez que le but est de trouver la somme de
tous les multiples de 3 et 5 inférieurs à 1000. Vous l'aurez
remarqué&amp;nbsp;: faire ce calcul à la main peut s'avérer difficile. Tout
l'intérêt est de trouver un autre moyen, qu'il soit plutôt mathématique
ou informatique. Au fur et à mesure des problèmes, la difficulté
augmente, dans le sens où un calcul non réfléchi ou qui utilise la &lt;a href=&quot;http://fr.wikipedia.org/wiki/Attaque_par_force_brute&quot;&gt;force brute&lt;/a&gt;
ne suffit tout simplement pas car le calcul serait bien trop long. Les
concepteurs des problèmes le font parfois remarquer lourdement&amp;nbsp;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;It is not possible to try every route to solve this
problem, as there are 299 altogether! If you could check one trillion
(1012) routes every second it would take over twenty billion years to
check them all. There is an efficient algorithm to solve it. ;o)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Note&amp;nbsp;: Vous n'aurez pas le droit à une traduction cette fois, bien fait pour vous&amp;nbsp;!&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;flot_gauche&quot;&gt;&lt;a href=&quot;http://fr.wikipedia.org/wiki/Leonhard_Euler&quot; hreflang=&quot;fr&quot;&gt;&lt;img src=&quot;http://cygal.info/blog/public/sites/euler_main.jpg&quot; alt=&quot;Leonhard Euler&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Vous êtes donc obligés, en raison des nombres relativement élevés,
de chercher une optimisation de l'implémentation naïve. Le plus
impressionnant est que les concepteurs assurent que tous les problèmes
peuvent être résolus sur une machine modeste en moins d'une minute.
Tout le fun est alors dans la recherche de l'algorithme&amp;nbsp;! Celle-ci
n'est parfois pas simple, et c'est là tout l'intérêt. Alors que trouver
la somme de tous les multiples de 3 et 5 inférieurs à 1000 est &lt;a href=&quot;http://fr.wiktionary.org/wiki/trivial&quot; hreflang=&quot;fr&quot;&gt;trivial&lt;/a&gt;, trouver les 40 premiers facteurs du nombre constitué d'un milliard de 1 l'est déja moins. :P&lt;/p&gt;
&lt;p&gt;Le but avoué est de permettre à n'importe quel public de découvrir
de nouveaux concepts, et de faire ceci tout en s'amusant avec son
langage préféré. C'est un des aspects les plus intéressants : le moyen
utilisé importe peu, et cette liberté permet de comparer différentes
manières de résoudre un même problème. Lorsque vous avez résolu un
problème, il est possible de voir les solutions des autres membres (qui
sont nombreux), ce qui est parfois très enrichissant (surtout quand
c'est de l'asm x86 :D). Au vu de ce succès, le &lt;a href=&quot;http://projecteuler.net/&quot; hreflang=&quot;en&quot;&gt;Project Euler&lt;/a&gt; est un projet réussi.&lt;/p&gt;</description>
    
    
    
          <comments>http://cygal.info/blog/index.php/post/2007/05/19/6-project-euler#comment-form</comments>
      <wfw:comment>http://cygal.info/blog/index.php/post/2007/05/19/6-project-euler#comment-form</wfw:comment>
      <wfw:commentRss>http://cygal.info/blog/index.php/feed/rss2/comments/5</wfw:commentRss>
      </item>
    
</channel>
</rss>