« Suite de Conway » : différence entre les versions

Contenu supprimé Contenu ajouté
m 1 version depuis w:Suite de Conway
Aucun résumé des modifications
Ligne 1 :
{{feuille volante}}
La '''suite de Conway''' est une [[Suite (mathématiques)|suite]] inventée en [[1986]] par le mathématicien [[John Horton Conway]], initialement sous le nom de « suite audioactive »<ref>{{article|langue=en|prénom1=John H.|nom1=Conway|lien auteur1=John Horton Conway|titre=The Weird and Wonderful Chemistry of Audioactive Decay|périodique=Eureka|numéro=46|pages=5-18|année=1986|éditeur=[[Université de Cambridge]]|ISSN=0071-2248}}.</ref>. Elle est également connue sous le nom anglais de ''Look and Say'' (« regarder et dire »). Dans cette suite, un terme se détermine en annonçant les [[chiffre]]s formant le terme précédent.
{{Wikipédia}}
 
== Générer la suite de Conway avec des [[Langage de programmation|langages de programmation]] ==
== Définition ==
 
[[Image:Fonction Conway.png|thumb|upright=1.5|La fonction <code>conway()</code> représentant la suite de Conway]]
Le premier terme de la suite de Conway est posé comme égal à 1. Chaque terme de la suite se construit en annonçant le terme précédent, c'est-à-dire en indiquant combien de fois chacun de ses chiffres se répète.
 
=== Avec le [[PHP]] ===
Concrètement :
:<math>X_0 = 1</math>
 
<div class="exemple">
Ce terme comporte juste un « 1 ». Par conséquent, le terme suivant est :
<source lang="php">
:<math>X_1 = 11</math>
<?php
$a1 = array('1', '2', '3');
$a2 = array('a', 'b', 'c');
$b1 = array('bbb', 'aaa', 'cc', 'bb', 'aa', 'c', 'b', 'a');
$b2 = array('32', '31', '23', '22', '21', '13', '12', '11');
function conway($n, $str = '1', $i = 0) {
// $n : la ligne de la suite de conway à afficher
// $i est passé en paramètre lors de la récursivité (appel à la fonction même)
// On rend globales les variables $a1, $a2, $b1 et $b2, pour ne pas avoir à les définir à chaque fois.
global $a1, $a2, $b1, $b2;
if($i < $n) {
return conway($n, str_replace($b1, $b2, str_replace($a1, $a2, $str)), ++$i);
}
else {
return $str;
}
}
echo conway(3, $str = '1', $i = 0);
// Execution : cela affichera 3 lignes de la suite
?>
</source>
</div>
 
=== En [[C]] ===
Celui-ci est composé de deux « 1 » :
:<math>X_2 = 21</math>
 
Voici un programme écrit en C qui affiche les n premiers termes de la suite de Conway, n étant passé en ligne de commande :
En poursuivant le procédé :
<div class="exemple">
:<math>X_3 = 1211</math>
<source lang="c">
:<math>X_4 = 111221</math>
#include <stdio.h>
:<math>X_5 = 312211</math>
#include <stdlib.h>
:<math>X_6 = 13112221</math>
#include <string.h>
 
int main(int argc, char **argv)
Et ainsi de suite.
{
const int nb_terms = argc > 1 ? atoi(argv[1]) : 10;
int max_length = 1024;
char *s1 = malloc(max_length), *s2 = malloc(max_length);
strcpy(s1, "1");
for (int i = 0; i < nb_terms; ++i) {
puts(s1);
if (strlen(s1) > max_length / 2) {
max_length *= 2;
s1 = realloc(s1, max_length);
free(s2); s2 = malloc(max_length);
}
s2[0] = 0;
char *start = s1;
do {
char *stop = start + 1;
while (*stop == *start) ++stop;
sprintf(s2, "%s%td%c", s2, stop - start, *start);
start = stop;
} while (*start);
strcpy(s1, s2);
}
free(s1); free(s2);
return 0;
}
</source>
</div>
 
=== En [[Haskell]] ===
Il est possible de généraliser le procédé en prenant un terme initial différent de 1. Dans le reste de l'article, on supposera que ce n'est pas le cas.
 
<div class="exemple">
== Propriétés ==
<source lang="haskell">
import Data.List
 
conway = iterate step [1] where
Les principales propriétés de cette suite sont :
step l = [f x | x <- group l, f <- [length,head] ]
 
main = print . take 10 $ conway
* Aucun terme de la suite ne comporte un chiffre supérieur à 3.
</source>
* Tous les termes de la suite possèdent un nombre pair de chiffres, sauf le terme initial.
</div>
* Les termes de rang impair se terminent par 11 et les termes de rang pair par 21 (là encore à l'exception du terme initial).
* En moyenne, les termes de la suite possèdent 50 % de chiffres 1, 31 % de 2 et 19 % de 3.
* Le nombre de chiffres du n{{e}} terme de la suite est proportionnel à <math>\lambda^n</math>, où <math>\lambda \approx 1,303577269 </math> est un [[nombre algébrique]] de degré 71 nommé [[constante de Conway]]. Plus précisément, si on note <math>L_n</math> le nombre de chiffre du n{{e}} terme de la suite, alors :
*:<math>\lim_{n \to +\infty}\frac{L_{n+1}}{L_{n}} = \lambda</math>
:Cette propriété reste vraie dans le cas général où le premier terme de la suite est choisi différent de 1 (et de 22, puisque dans ce cas la suite est stable).
[[Image:Conway constant.png|thumb|[[Racine d'un polynôme|Racines]] du polynôme de Conway sur le [[plan complexe]].]]
La constante de Conway est l'unique solution réelle positive de l'[[équation polynomiale]] suivante :
 
=== En [[Perl (langage)|Perl5]] ===
: <math> x^{71}-x^{69}-2x^{68}-x^{67}+2x^{66}+2x^{65}+x^{64}-x^{63}-x^{62}-x^{61}-x^{60}-x^{59}+ </math>
: <math> 2x^{58}+5x^{57}+3x^{56}-2x^{55}-10x^{54}-3x^{53}-2x^{52}+6x^{51}+6x^{50}+x^{49}+9x^{48}-3x^{47}- </math>
: <math> 7x^{46}-8x^{45}-8x^{44}+10x^{43}+6x^{42}+8x^{41}-5x^{40}-12x^{39}+7x^{38}-7x^{37}+7x^{36}+x^{35}- </math>
: <math> 3x^{34}+10x^{33}+x^{32}-6x^{31}-2x^{30}-10x^{29}-3x^{28}+2x^{27}+9x^{26}-3x^{25}+14x^{24}-8x^{23}-</math>
: <math> 7x^{21}+9x^{20}+3x^{19}-4x^{18}-10x^{17}-7x^{16}+12x^{15}+7x^{14}+2x^{13}-12x^{12}-4x^{11}- </math>
: <math> 2x^{10}+5x^9+x^7-7x^6+7x^5-4x^4+12x^3-6x^2+3x-6=0</math>
 
<div class="exemple">
=== « Désintégration audioactive » ===
<source lang="perl">
for ( $_=1;; ) { say; s/((.)\2*)/length($1).$2/xeg; }
</source>
</div>
 
ou depuis le shell:
John Conway qualifia initialement cette suite de « désintégration audioactive » (''audioactive decay'' en anglais), un jeu de mots sur la [[Radioactivité|désintégration radioactive]], en remarquant le comportement des différents termes de la suite.
 
<div class="exemple">
Il montra qu'à partir d'un certain point, ''presque tous'' les termes de la suite peuvent être décomposés en 92 sous-termes (nommés éléments, par analogie avec les [[Élément chimique|éléments chimiques]]) qui se décomposent au terme suivant en un certain nombre d'autres éléments.
<source lang="bash">
perl -E 'for ( $_=1;; ) { say; s/((.)\2*)/length($1).$2/xeg; }'
</source>
</div>
 
=== En [[Python (langage)|Python]] ===
Par exemple, l'élément le plus simple, nommé [[hydrogène]], est la séquence <math>22</math> qui donne elle-même au terme suivant. La séquence <math>3113322112</math> est dénommée [[manganèse]] ; au terme suivant, elle donne <math>132123222112</math> qui se décompose en les séquences [[prométhium]] (<math>132</math>) et [[sodium]] (<math>123222112</math>).
<div class="exemple">
<source lang="python">
import itertools
 
def conway():
Il a été montré que si l'on débute la suite par le terme [[uranium]] <math>3</math>, les 91 autres éléments seront apparus dans un terme ou un autre au bout de 91 itérations. Cette suite porte d'ailleurs en anglais le nom de ''Conway's sequence''.
x = '1'
while True:
yield x
nx = ''
for item, grouper in itertools.groupby(x):
nx += '%d%s' % (len(list(grouper)), item)
x = nx
 
suite = conway()
for i in range(10):
print suite.next()
</source>
</div>
 
=== En [[Prolog]] ===
<div class="exemple">
<source lang="prolog">
conway(0,[1]).
conway(N,R):- N>0, M is N-1, conway(M,L), conwayLigneSuivante(L,R).
 
conwayLigneSuivante([],[]).
conwayLigneSuivante([E],[1,E]).
conwayLigneSuivante([E,E|L],[M,E|R]) :- conwayLigneSuivante([E|L],[N,E|R]), M is N+1.
conwayLigneSuivante([E,F|L],[1,E|R]) :- dif(E,F), conwayLigneSuivante([F|L],R).
</source>
</div>
 
=== En [[Ocaml]] ===
<div class="exemple">
<source lang="ocaml">
let rec suivant c l e = match l with
| [] -> [c; e]
| t::q when t = e -> suivant (c + 1) q t
| t::q -> c::e::(suivant 1 q t)
let conway n =
let rec aux n l =
print_newline (List.iter print_int l);
if n > 1 then aux (n - 1) (suivant 1 (List.tl l) (List.hd l)) in
aux n [1]
 
let () = conway 10
</source>
</div>
 
=== En [[Java (langage)|Java]] ===
<div class="exemple">
La classe ConwayTerm représente un terme donné de la suite. Sa méthode nextTerm calcule le terme suivant. Dans l'exemple ci-dessous, le premier terme est 1. Si l'on veut commencer avec 22, il faut un tableau de 2 bytes contenant chacun 2 et non un byte contenant 22 (new byte[] { 2,2 })
<source lang="java">
package fr.math.suite;
 
import java.util.Arrays;
 
public class ConwayTerm {
private byte[] digits;
 
/**
* @param args
*/
public static void main(String[] args) {
ConwayTerm term = new ConwayTerm(new byte[] { 1 }); // Premier terme de la suite:1
//Affiche les 25 premiers termes
for (int i = 0; i < 25; i++) {
System.out.println("u(" + i + ")=" + term);
term = term.nextTerm();
}
}
 
public ConwayTerm(byte[] digits) {
this.digits = digits;
}
 
/**
* calcule le terme suivant de la suite.
*/
public ConwayTerm nextTerm() {
if (digits.length != 0) {
byte count = 1;
while ((count < digits.length && digits[0] == digits[count])) count++;
return concat(count, digits[0], new ConwayTerm(Arrays.copyOfRange(
digits, count, digits.length)).nextTerm());
} else {
return this;
}
}
/**
* Affiche les chiffres du terme de la suite
*/
public String toString() {
StringBuffer buffer = new StringBuffer();
for (byte b : digits) buffer.append(b);
return buffer.toString();
}
private ConwayTerm concat(byte count, byte digit, ConwayTerm other) {
byte[] result = new byte[2 + other.digits.length];
result[0] = count;
result[1] = digit;
for (int i = 0; i < other.digits.length; i++) result[i + 2] = other.digits[i];
return new ConwayTerm(result);
}
 
}
 
 
</source>
</div>
== Références ==
{{Références}}
 
== Annexes ==
=== Articles connexes ===
* [[Suite de Robinson]]
* [[Run-length encoding]]
* [[Suite (mathématiques)]]
 
=== Liens externes ===
{{Autres projets
|b=Suite de Conway
}}
* {{en}} [http://www.research.att.com/cgi-bin/access.cgi/as/njas/sequences/eisA.cgi?Anum=A005150 Suite A005150] sur l'[[Encyclopédie en ligne des suites de nombres entiers]]
* {{en}} [[Eric W. Weisstein]], « [http://mathworld.wolfram.com/LookandSaySequence.html Look and Says Sequence] », sur [[MathWorld]]
* {{en}} Henry Bottomley, « [http://www.btinternet.com/~se16/js/lands2.htm Evolution of Conway's 92 Look and Say audioactive elements] » : une compilation des 92 éléments « audioactifs » de la suite
 
{{portail mathématiques}}
 
[[Catégorie:Suite d'entiers|Conway]]
 
[[de:Conway-Folge]]
[[en:Look-and-say sequence]]
[[eo:Vico de Conway]]
[[es:Constante de Conway]]
[[it:Costante di Conway]]
[[ko:읽고 말하기 수열]]
[[nl:Rij van Conway]]
[[sl:Conwayjevo zaporedje]]
[[zh:外觀數列]]