FRACTRAN

Un article de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 16 décembre 2019 à 22:17 et modifiée en dernier par Bot de pluie (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.

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.

Exemple

Considérons le programme FRACTRAN correspondant à la liste de fractions .

Si on l'applique à l'entier 14, comme ni , ni ne sont des entiers, le programme s'arrête immédiatement.

Si on l'applique à l'entier 15, on obtient successivement 20 (car seul est un entier), puis 6 (car est un entier) , puis 8 (car seul donne un entier), puis 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é .

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

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 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].

Simulation de la machine FRACTRAN ci-dessus lors du calcul de 3×2, donc en entrant 23×32=72, et en récupérant à la fin 56.

Soustraction

La simple fraction permet de transformer le nombre en

  • , si  ;
  • , si  ;
  • si .


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
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 avec .

Génération de suites

Certains programmes bouclent indéfiniment, et génèrent des suites infinies.

Algorithme de Conway des nombres premiers

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 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

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 .

La suite des points 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

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.

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

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

Notes

  1. a et b Dans l'article FRACTRAN: A simple universal programming language for arithmetic, paru dans le livre de Cover et Gopinath, Open Problems in Communication and Computation, Springer-Verlag, New York, (1987), p. 4-26.
  2. (en) Des algorithmes similaires sont décrits dans cette page.
  3. Pour une explication détaillée, voir Julian Havil, Nonplussed!: Mathematical Proof of Implausible Ideas, Princeton University Press, 2007, (ISBN 978-0691120560).

Références

  1. a et b Julian Havil, Nonplussed!: Mathematical Proof of Implausible Ideas, p. 162-163.
  2. Voir suite A007542 de l'OEIS.
  3. a et b (en) [PDF] Kenneth G. Monks, « 3x+1 minus the + », in Discrete Mathematics and Theoretical Computer Science 5, 2002, 47–54.

Voir aussi

Articles connexes

Ressources bibliographiques

  • John Conway, « FRACTRAN: A simple universal programming language for arithmetic », in Open Problems in Communication and Computation, Thomas M. Cover (relecteur), B. Gopinath (relecteur), Springer ; 1re éd. () ;
  • Julian Havil, Nonplussed!: Mathematical 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.