Il s'agit d'un développement supplémentaire de la réponse de @ ais523 , la réduisant à seulement deux ensembles de supports, et utilisant également un placement de cellule plus compact basé sur la théorie de la règle de Golomb. ais523 a créé un compilateur pour cette construction , ainsi que cette session TIO montrant un exemple de programme BF résultant exécuté avec le suivi de débogage des compteurs TWM.
Comme l'original, cela commence par un programme dans The Waterfall Model , avec quelques restrictions qui ne perdent pas la généralité:
- Tous les compteurs ont la même valeur de réinitialisation automatique R ; c'est-à-dire que la carte de déclenchement TWM F a la propriété F( x , x ) = R pour tous les X .
- Il y a un seul compteur d'arrêt h .
- Le nombre c de compteurs est ( p - 1 ) / 2 pour un nombre premier p .
Règle de Golomb
Nous combinons la construction Erdős – Turán avec la fonction de permutation d'un tableau Welch – Costas afin d'obtenir une règle de Golomb avec les propriétés nécessaires.
(Je suis sûr que cette construction combinée ne peut pas être une nouvelle idée, mais nous venons de trouver et d'assembler ces deux pièces de Wikipedia.)
Soit r une racine primitive de p=2c+1 . Définissez la fonction
g(k)=4ck−((rk−1)mod(2c+1)),k=0,…,2c−1.
- g est une règle de Golomb d'ordre . C'est-à-dire que la différence est unique pour chaque paire de nombres distincts .2 c g ( i ) - g ( j ) i , j ∈ { 0 , … , 2 c - 1 }2cg(i)−g(j)i,j∈{0,…,2c−1}
- g(k)mod(2c)0 , … , 2 c - 1 prend une seule fois chaque valeur .0,…,2c−1
Structure du ruban
Pour chaque compteur TWM , nous attribuons deux positions de cellule de bande BF, une cellule de secours et une cellule de valeur :x∈{0,…,c−1}u ( x ) v ( x ) u(x) v(x)
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
Par la deuxième propriété de il y a exactement deux valeurs distinctes choisir.gk1,k2
Le contenu d'une cellule de secours sera la plupart du temps maintenu à , sauf lorsque son compteur vient d'être visité, lorsqu'il sera à , deux fois la valeur de réinitialisation automatique du compteur. Une cellule de valeur sera maintenue à deux fois la valeur du compteur TWM correspondant.02R
Toutes les autres cellules qui peuvent être atteintes par l'exécution du programme BF (un nombre fini) seront conservées à des valeurs impaires, afin qu'elles testent toujours comme non nulles. Après l'initialisation, cela est automatique car tous les ajustements de cellule sont effectués en quantités égales.
Si vous le souhaitez, toutes les positions des cellules peuvent être décalées vers la droite d'une constante afin d'éviter de se déplacer vers la gauche de la position initiale de la bande BF.
Structure du programme BF
Soit la distance entre la valeur du compteur d'arrêt et les cellules de repli, et soit un nombre suffisamment grand pour que pour tous les compteurs . Ensuite, la structure de base du programme BF estH=v(h)−u(h)NcN+1≥v((x+1)modc)−u(x)x
initialisation ajustements[
>
×(H+cN+1) [
<
×c × H]
<
×H ]
Initialisation
La phase d' initialisation met toutes les cellules accessibles par le programme à leurs valeurs initiales, dans un état comme si le dernier compteur venait d'être visité et que la cellule juste active était sa cellule de secours :u(c−1)
- Les cellules de valeur sont initialisées à deux fois le contenu initial du compteur TWM correspondant, sauf que le compteur est pré-décrémenté.0
- Les cellules de repli sont définies sur , à l'exception de la cellule , qui est définie sur .0u(c−1)2R
- Toutes les autres cellules accessibles par le programme (un nombre fini) sont définies sur .1
Ensuite, le pointeur de bande est déplacé vers la position (une cellule toujours non nulle) avant d'atteindre le premier programme .u(c−1)−H[
Début de la boucle extérieure
Au début d'une itération de la boucle externe, le pointeur de bande sera à ou pour un compteur .u(x)−Hv(x)−Hx
Soit le prochain compteur à visiter.y=((x+1)modc)
Le mouvement place le pointeur de bande sur une position qui est et non à gauche de .>
×(H+cN+1)≡y(modc)v(y)
La boucle interne recherche maintenant vers la gauche aux étapes de une cellule nulle. Si le compteur est nul, il s'arrêtera à la cellule de valeur (zéro) ; sinon, il trouvera la cellule de repli .[
<
×c c y v ( y ) u ( y )]
cyv(y)u(y)
La cellule trouvée devient la nouvelle cellule active .
Ajustements
La phase d' ajustement ajuste diverses cellules sur la bande en fonction de leur position par rapport à la cellule active. Cette section ne contient que des +-><
commandes et ces ajustements se produisent donc sans condition. Cependant, comme toutes les cellules liées au compteur sont dans un modèle de règle de Golomb, tous les ajustements qui ne sont pas appropriés pour la cellule active actuelle manqueront toutes les cellules importantes et ajusteront à la place certaines cellules non pertinentes (tout en le gardant étrange).
Un code distinct doit donc être inclus dans le programme pour chaque paire requise possible de cellule active et ajustée, à l' exception de l'auto-ajustement d'une cellule active qui, parce que l'ajustement est basé uniquement sur la position relative, doit être partagée entre toutes.
Les ajustements requis sont:
- Ajustez la cellule de secours du compteur précédent de .u(x)−2R
- Ajustez la cellule de repli du compteur actuel de , sauf si la cellule active actuelle est et que nous devons donc nous arrêter.u(y)2Rv(h)
- Ajustez la cellule de valeur du compteur suivant de (décrémentation du compteur).v((y+1)modc)−2
- Lorsque la cellule active est une cellule de valeur (de sorte que le compteur a atteint zéro), ajustez toutes les cellules de valeur de partir de la carte de déclenchement TWM. lui-même est ajusté de .v(y)yv(z)2f(y,z)v(y)2R
Les premier et deuxième ajustements ci - dessus sont rendues nécessaires par le fait que toutes les cellules actives doivent régler eux - mêmes par la même valeur, qui est pour les cellules de valeur, et donc aussi pour les cellules de secours. Cela nécessite de préparer et de nettoyer les cellules de secours pour s'assurer qu'elles reviennent à dans les branches de valeur et de secours.2R0
Fin de la boucle extérieure
Le mouvement représente qu'à la fin de la phase de réglage, le pointeur de bande est déplacé à gauche de la cellule active.<
×HH
Pour toutes les cellules actives autres que la cellule de valeur du compteur d'arrêt , il s'agit d'une cellule non pertinente, donc impaire et non nulle, et la boucle externe continue pour une autre itération.v(h)
Pour , le pointeur est placé à la place sur sa cellule de repli correspondante , pour laquelle nous avons fait une exception ci-dessus pour le maintenir à zéro, et donc le programme se termine par la finale et s'arrête.v(h)u(h)]