FRACTRAN
|
|
Cet article est une ébauche concernant les mathématiques.
Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants.
|
FRACTRAN est un langage de programmation exotique et Turing-complet s'appliquant à des entiers naturels. Il a été inventé par le mathématicien John Conway qui en publie une description en 1987[1] [note 1].
Il consiste à représenter toute fonction calculable sur des entiers par une liste de fractions.
Pour chercher l'image d'un entier A, on regarde dans la liste la première des fractions qui multipliée par A donne un entier B, puis on applique de nouveau la procédure sur l'entier B. Si aucune des fractions de la liste multipliée par A ne donne un entier la procédure s'arrête.
Sommaire |
Exemple [modifier]
Soit la liste :
.
Si on l'applique à l'entier 14, la procédure s'arrête immédiatement car, ni
, ni
ne donnent un entier.
Si on l'applique à 15, on obtient successivement 20 (car seule
donne un entier), puis 6 (car
est entier) , puis 8 (car seule
donne un entier) et la procédure s'arrête.
Principe [modifier]
Le principe s'appuie sur l'existence d'une décomposition en produits de facteurs premiers des entiers et sur la notion de valuation p-adique.
Tout entier A possède une décomposition en produit de facteurs premiers unique dans laquelle l'exposant du nombre premier p est appelé valuation de p dans A et est noté
.
Pour un entier A donné, les
sont tous nuls sauf un nombre fini d'entre eux. Multiplier l'entier A par une fraction permettant d'obtenir un entier B, consiste à opérer des additions et des soustractions sur les
.
Ainsi la liste précédente opère sur les valuations de 2, 3 et 5. La première fraction enlève 1 aux valuations de 2 et 5 (si cela est possible) et augmente de 1 la valuation de 3, la seconde fraction n'agit que lorsque la valuation de 2 ou de 5 est nulle elle augmente la valuation de 2 de deux unités et baisse celle de 3 d'une unité.
Lorsque A s'écrit
avec A' premier avec 30, et
, à l'aide de deux boucles, la procédure transforme A en
puis en
et s'arrête alors.
Le programme permet ainsi de définir des opérations sur les valuations.
Opérations basiques [modifier]
Addition [modifier]
La liste contenant l'unique fraction
permet de faire la somme des valuations de 2 et de 3 : lorsque A s'écrit
avec A' premier avec 6, la procédure s'applique jusqu'à ce que A soit transformé en
.
Multiplication [modifier]
On peut créer une fonction multiplicative à l'aide d'une boucle additive. Pour cela, il faut introduire la notion d'état dans l'algorithme. Cet algorithme s'applique à un nombre
et le transforme en
et travaille sur les valuations de 2, 3, 5 mais aussi 7 , 11 et 13 :
| État courant | Condition | Action | État suivant |
|---|---|---|---|
| A | v7 > 0 | Soustraire1 à v7 ajouter 1 à v3 |
A |
| v7 = 0 et v2 > 0 |
Soustraire 1 à v2 | B | |
| v7 = 0 et v2 = 0 et v3 > 0 |
Soustraire 1 à v3 | A | |
| v7 = 0 et v2 = 0 et v3 = 0 |
Stop | ||
| B | v3 > 0 | Soustraire 1 à v3 Ajouter 1 à v5 Ajouter 1 à v7 |
B |
| v3 = 0 | Rien | A |
L'état B est une boucle qui ajoute v3 à v5 et déplace aussi v3 en v7 et l'état A est une boucle qui répète la boucle B v2 fois. L'état A remet aussi dans v3 la valeur initiale (présente dans v7) quand la boucle B est terminée.
Pour gérer ces états, de nouvelles variables sont nécessaires : elles jouent le rôle d'indicateurs d'états. Les indicateurs d'état pour la boucle B sont v11 et v13. Deux indicateurs d'états sont nécessaires pour la seule boucle B : en effet, le premier indicateur (v11) étant consommé à l'entrée de la boucle, il est nécessaire d'en posséder un second (v13) pour indiquer au programme qu'il doit continuer dans le même état. L'indicateur v13 est basculé en v11 lors de l'instruction "next" de la boucle.
En ajoutant les indicateurs d'états et les instructions au tableau d'algorithme de la multiplication, on obtient :
| Instruction FRACTRAN |
État courant | Indicateurs d'état |
Condition | Action | État suivant |
|---|---|---|---|---|---|
![]() |
A | Aucun | v7 > 0 | Soustraire 1 à v7 Ajouter 1 à v3 |
A |
![]() |
v7 = 0 et v2 > 0 |
Soustraire 1 à v2 Mettre v11 à 1 |
B | ||
![]() |
v7 = 0 et v2 = 0 et v3 > 0 |
Soustraire 1 à v3 | A | ||
| v7 = 0 et v2 = 0 et v3 = 0 |
Stop | ||||
![]() |
B | v11, v13 | v3 > 0 | Soustraire 1 à v3 Ajouter 1 à v5 Ajouter 1 à v7 |
B |
![]() |
v3 = 0 | Mettre v11 à 0 | A |
Quand on écrit la liste d'instructions FRACTRAN, on doit mettre les instructions de l'état A en dernier car l'état A n'a pas d'indicateur d'état, c'est l'état par défaut.
Ainsi le programme FRACTRAN de multiplication est la liste suivante :
Si on entre le nombre
, le programme rend
[note 2].
Soustraction [modifier]
La simple fraction
permet de transformer le nombre
en
, si
;
, si
;
si
.
Division euclidienne [modifier]
La division euclidienne de a par b (a et b entiers naturels, b > 1) est la donnée de deux entiers naturels q et r tels que r < b et a = bq + r. Cette division euclidienne peut être vue comme une boucle de soustractions : diviser a par b, c'est ôter b à a autant de fois qu'il est nécessaire, le nombre de fois où cette soustraction est effectuée correspond à q, la dernière valeur dans a correspond au reste.
L'algorithme travaille lors sur v2 contenant a, v3 contenant b , v5 destiné à contenir q, et v7 destiné à contenir r. Ces variables sont complétées par 4 indicateurs d'états v11, v13, v17, v19.
Le programme FRACTRAN qui suit consiste en trois états :
- l'état A opère différemment selon que v3 est plus petit ou plus grand que v2;
- si v3 ≤ v2, la boucle retranche v3 à v2, vide v3 dans v7, ajoute 1 à v5 et passe à l'état B ;
- si v3 > v2, la boucle vide v2 dans v7 et passe à l'état X.
- l'état B est une sur-boucle qui ré-effectue la boucle A après avoir au préalable vidé v7 dans v3;
- l'état X consiste à vider v3 quand v2 est vide et v3 est non vide.
| Instructions FRACTRAN |
État courant | Indicateurs d'état |
Conditions | Actions | État suivant |
|---|---|---|---|---|---|
![]() |
A | v11, v13 | v2 > 0 et v3 > 0 |
Soustraire 1 à v2 Soustraire 1 à v3 Ajouter 1 à v7 |
A |
![]() |
v2 = 0 et v3 > 0 |
Soustraire 1 à v3 Mettre v11 à 0 |
X | ||
![]() |
v3 = 0 | Ajouter 1 à v5 Mettre v11 à 0 Mettre v17 à 1 |
B | ||
![]() |
B | v17, v19 | v7 > 0 | Soustraire 1 à v7 Ajouter 1 à v3 |
B |
![]() |
v7 = 0 | Mettre v11 à 1 Mettre v17 à 0 |
A | ||
![]() |
X | v3 > 0 | Soustraire 1 à v3 | X | |
| v3 = 0 | Stop |
L'écriture du programme est alors :
Il suffit d'entrer
pour obtenir en sortie
où
avec
.
Exemples plus complexes [modifier]
Certains programmes bouclent indéfiniment et sont propices à la génération de suites
Algorithme de Conway des nombres premiers [modifier]
Le programme suivant est présenté par John Conway dans le livre coécrit avec Richard Guy, The book of numbers. John Conway les appelle « les 14 fractions fantastiques »[1].
Ce programme, appliqué à l'entier 2, génère une suite qui contient tous les termes de la forme
où
est un nombre premier. Réciproquement, toute puissance de 2 dans cette suite a pour exposant 1 ou un nombre premier. Cette suite porte le nom de Conway primegame[2]
L'algorithme est essentiellement un algorithme de division euclidienne. Le principe est le suivant : partant d'un nombre de la forme
où 0 ≤ m < n, l'algorithme tente de diviser n+1 par tous les nombres de n à 1, jusqu'à ce qu'il trouve le plus grand entier k tel que k divise n+1 et retourne alors
. Les seuls cas où l'algorithme rend une puissance de 2 sont les cas où k=1, c'est-à-dire les cas où n+1 est premier[note 3].
Suite de Fibonacci [modifier]
Le programme suivant :
appliqué à l'entier 3, génère une suite qui contient tous les termes de la forme
où a et b sont deux termes consécutifs de la suite de Fibonacci. Réciproquement, tout terme de la suite de la forme
a pour exposant deux termes consécutifs de la suite de Fibonacci.
L'algorithme est essentiellement un algorithme d'addition qui consiste, en partant de
à fournir
.
En effet :
- pour
, la fraction
transforme
en
, puis les fractions
et
transforment itérativement ce dernier en
. Dans le cas où
, on arrive directement à
grâce au 7 final de la liste. - La fraction
transforme alors
en
, puis les fractions
et
le transforme itérativement en
. - La fraction
le transforme en
, puis les fractions
et
le transforment en
. - Enfin, la fraction
supprime le facteur 19.
où
est le nombre calculé à la n-ème étape, sortis par cette machine FRACTRAN, est assez chaotique (les coordonnées des premiers points sont (0,3), (1,21), (2,39), (3,17), (4,130), (5,190), (6,46), (7,114) et (8,6)...) mais les nombres
n'ayant que 2 et 3 comme facteurs premiers (en rouge) représentent bien les termes successifs de la suite de Fibonacci :
| Rang | Nombre | Facteurs premiers |
|---|---|---|
| 8 | 6 | ![]() |
| 18 | 18 | ![]() |
| 32 | 108 | ![]() |
| 54 | 1944 | ![]() |
Suite de Syracuse [modifier]
Ce programme présenté par Kenneth G. Monks[3] :
appliqué à
, génère une suite qui contient successivement tous les termes
, où b parcourt les termes de la suite de Syracuse de premier terme N. Réciproquement, toute puissance de 2 dans cette suite a pour exposant un élément de la suite de Syracuse.
- Partant de
, les fractions
et
le transforme en
pour les valeurs croissantes de k jusqu'à arriver à
si N est pair égal à 2p, ou bien
si N est impair égal à 2p+1. - Dans le premier cas, le terme final 7 transforme
en
, puis les fractions
et
le transforment itérativement en
. La fraction
supprime ensuite le 7 superflu. On est alors passé de
à
. - Dans le deuxième cas, la fraction
transforme
en
, puis les fractions
et
le transforment itérativement en
. La dernière fraction
le transforme enfin en
qui n'est autre que
.
L'idée de Kenneth Monks est d'étudier les suites de Syracuse cycliques en cherchant les propriétés des suites cycliques générées par ce programme[3].
Programme universel [modifier]
Conway a également défini un programme FRACTRAN universel[note 1], constitué des fractions suivantes :
On peut alors montrer que, pour toute fonction partielle récursive f, il existe un entier c tel que, pour tout entier n, en appliquant le programme FRACTRAN avec la liste ci-dessus au nombre
, on atteint le nombre
si et seulement si le calcul de f(n) se termine. Cette propriété montre qu'on obtient en FRACTRAN toutes les fonctions calculables.
Notes et références [modifier]
Notes [modifier]
- dans l'article FRACTRAN : A simple universal programming language for arithmétic, paru dans le livre de Cover et Gopinath, Open problems in communication et computation, Springer-Verlag, New York, (1987), p.4-26.
- Des algorithmes similaires sont décrits dans cette page.
- Pour une explication détaillée, voir Julian Havil, Nonplussed!:mathemalical proof of implausible ideas, Princeton University Press, 2007, ISBN 9780691120560
Références [modifier]
- Julian Havil, Nonplussed!:mathemalical proof of implausible ideas, p 162-163.
- suite A007542 de l'OEIS
- Kenneth G. Monks, « 3x+1 minus the + », in Discrete Mathematics and Theoretical Computer Science 5, 2002, 47–54
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « FRACTRAN » (voir la liste des auteurs)
Voir aussi [modifier]
Articles connexes [modifier]
Ressources bibliographiques [modifier]
- John Conway, « FRACTRAN: A simple universal programming language for arithmetic », in Open problems in communication and computation, Thomas M. Cover (Editor), B. Gopinath (Editor), Springer; 1er éd. (November 9, 1987);
- Julian Havil, Nonplussed!:mathemalical proof of implausible ideas, Princeton University Press, 2007;
- Kenneth G. Monks, « 3x+1 minus the + », in Discrete Mathematics and Theoretical Computer Science 5, 2002, 47–54.







, si
;
, si
;
si
.







, la fraction
transforme
en
, puis les fractions
et
transforment itérativement ce dernier en
. Dans le cas où
, on arrive directement à
grâce au 7 final de la liste.
transforme alors
, puis les fractions
et
le transforme itérativement en
.
le transforme en
, puis les fractions
et
le transforment en
.
supprime le facteur 19.




et
pour les valeurs croissantes de k jusqu'à arriver à
si N est pair égal à 2p, ou bien
si N est impair égal à 2p+1.
, puis les fractions
et
le transforment itérativement en
. La fraction
supprime ensuite le 7 superflu. On est alors passé de
.
transforme
, puis les fractions
et
le transforment itérativement en
. La dernière fraction
le transforme enfin en
qui n'est autre que
.