- FRACTRAN
-
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
Soit la liste : .
Si on l'applique à l'entier 14, la procédure s'arrête immédiatement car, ni , ni 14 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
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é vp(A).
Pour un entier A donné, les vp(A) 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 vp.
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
Addition
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
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 2a3b et le transforme en 5ab et travaille sur les valuations de 2, 3, 5 mais aussi 7 , 11 et 13 :
-
Etat courant Condition Action Etat suivant A v7 > 0 Soustraire1 à v7
ajouter 1 to v3A v7 = 0 et
v2 > 0Soustraire 1 à v2 B v7 = 0 et
v2 = 0 et
v3 > 0Soustraire 1 à v3 A v7 = 0 et
v2 = 0 et
v3 = 0Stop B v3 > 0 Soustraire 1 à v3
Ajouter 1 à v5
Ajouter 1 à v7B 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
FRACTRANEtat courant Indicateurs
d'étatCondition Action Etat suivant A Aucun v7 > 0 Soustraire 1 à v7
Ajouter 1 à v3A v7 = 0 et
v2 > 0Soustraire 1 à v2
Mettre v11 à 1B v7 = 0 et
v2 = 0 et
v3 > 0Soustraire 1 à v3 A v7 = 0 et
v2 = 0 et
v3 = 0Stop B v11, v13 v3 > 0 Soustraire 1 à v3
Ajouter 1 à v5
Ajouter 1 à v7B 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 2a3b, le programme rend 5ab[note 2].
Soustraction
La simple fraction permet de transformer le nombre 2a3b en
- 2a − b30 , si a > b ;
- 203b − a, si b > a ;
- 2030 si a = b.
Division euclidienne
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
FRACTRANEtat courant Indicateurs
d'étatConditions Actions Etat suivant A v11, v13 v2 > 0 et
v3 > 0Soustraire 1 à v2
Soustraire 1 à v3
Ajouter 1 à v7A v2 = 0 et
v3 > 0Soustraire 1 à v3
Mettre v11 à 0X v3 = 0 Ajouter 1 à v5
Mettre v11 à 0
Mettre v17 à 1B B v17, v19 v7 > 0 Soustraire 1 à v7
Ajouter 1 à v3B v7 = 0 Mettre v11 à 1
Mettre v17 à 0A X v3 > 0 Soustraire 1 à v3 X v3 = 0 Stop
L'écriture du programme est alors :
Il suffit d'entrer 2a3b11 pour obtenir en sortie 5q7r où a = bq + r avec .
Exemples plus complexes
Certains programmes bouclent indéfiniment et sont propices à la génération de suites
Algorithme des nombres premiers de Conway
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 2p où p 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 2n7m 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 2n + 17k − 1. 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
Le programme suivant
- 23/95, 57/23, 17/39, 130/17, 11/14, 35/11, 19/13, 1/19, 35/2, 13/7, 7
appliqué à l'entier 3, génère une suite qui contient tous les termes de la forme 2a3b où a et b sont deux termes consécutifs de la suite de Fibonacci. Réciproquement, tout terme de la suite de la forme 2a3b 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 2a3b à fournir 2b3a + b.
Suite de Syracuse
Ce programme présenté par Kenneth G. Monks[3] :
- 1/11, 136/15; 5/17; 4/5; 26/21; 7/13; 1/7; 33/4, 5/2; 7
appliqué à 2N, génère une suite qui contient successivement tous les termes 2b, 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. 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].
Notes et références
- Notes
- 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.
- cette page ou sur ce blog. Des algorithmes similaires sont décrits dans
- ISBN 9780691120560 Pour une explication détaillée, voir Julian Havil, Nonplussed!:mathemalical proof of implausible ideas, Princeton University Press, 2007,
- Références
- Julian Havil, Nonplussed!:mathemalical proof of implausible ideas, p 162-163.
- A007542 de l’OEIS suite
- 3x+1 minus the + », in Discrete Mathematics and Theoretical Computer Science 5, 2002, 47–54 Kenneth G. Monks, «
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « FRACTRAN » (voir la liste des auteurs)
Ressources bibliographiques
- 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; 1 edition (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.
-
Wikimedia Foundation. 2010.