C source code to current TM #4 (chaotic) simulator

The code compiles and executes without problems using the GCC compiler on architecture x86_64 on Linux.

It only needs the standard C library. It’s an accelerated simulator that combines many repated operations into one big operation. It was checked against a conventional un-accelerated TM simulator, and the outputs matched.

(no name program, or sim12g84.c locally):

=========================================================

 

#include <stdio.h>
#define STACK_HEIGHT 100000000
#define TMAX 10

 

long lstack[STACK_HEIGHT]; // pile gauche; pas de malloc ou calloc
long rstack[STACK_HEIGHT]; // pile droite; “” “” “”

int main(void)
{

long ltop; // le sommet de la pile gauche; ltop est un indice
long rtop; // sommet de pile droite
int p1, p2, p3; // variables essentiellement booleennes
long time;
long time_billions;
long current_block; // nombre de 0 ou de 1 consecutifs dans le bloc sous la
long subindex; // tete de lecture; subindex indique ou la tete est
long loop_counter;
long loop_counter_b;
long delta_time;
long num1, num2, num9;
long count_ones;
long i;
int done;
int state; // 1->A, 2->B, 3->C
int the_rule; // meta-regle: de 1 a 10

 

ltop = 1;
rtop = 1;
lstack[1] = 3;
rstack[1] = 2;
current_block = 4; // au debut: 2000000000, 3, *4*, 2, 2000000000
subindex = 1; // nombre de 0 consecutifs, 1 consec., 0 consec., 1 consec., 0 consec.
time = 38; // on debute au temps 38
time_billions = 0;
state = 1; // on debute dans l’etat A
done = 0; // si 0: pas encore termine; si 1: on doit stopper le programme
loop_counter = 0;
loop_counter_b = 0;

 

while(done == 0)
{

 

if(1==0)
{
done = 1; // depasse le temps 10^10, on va stopper le programme
}

 

 

 

if( loop_counter>104)
{

if(the_rule == 10)
{
//printf(“a”);
}
else
{

if(the_rule == 1)
{
//printf(“\n”);
}

//printf(“%d”,the_rule);
}
} // le bloc de code C precedant concerne juste ce qui sera affiche

 

 

lstack[0] = 2000000000; // on pretend qu’il y a 2000000000 de zeros consec.
// a gauche, au debut de la pile; 2e+9 remplace l’infini

rstack[0] = 2000000000;

if(done == 1)
{
break; // porte de sortie de la boucle while(done == 0)
}

if(state == 1) // etat present = A
{
p1=0; // p1, p2, p3 sont des booleennes
p2=0; // avec des affectations qui varient selon l’etat
p3=0; // c’est pour economiser les noms de variable

if(subindex == 1)
{
p1 = 1;
}

if(lstack[ltop-1]==3 && lstack[ltop]==3)
{
p2 = 1;
}

if(lstack[ltop-1] > 7)
{
p3 = 1;
}

if(p1==1 && p2==0 && p3==1)
{
the_rule = 1; // the_rule := numero de la meta-regle a appliquer
}

if(p1==1 && p2==0 && p3==0)
{
the_rule = 5;
}

if(p1==1 && p2==1)
{
the_rule = 6;
}

if(p1 == 0)
{
the_rule = 8;
}
}

if(state == 2) // etat present = B
{
p1 = 0;
p2 = 0;

if(rstack[rtop-1] > 1)
{
p1 = 1;
}

if( (rstack[rtop]%2) == 0)
{
p2 = 1;
}

if(p1==0)
{
the_rule = 2;
}

if(p1==1 && p2==1)
{
the_rule = 3;
}

if(p1==1 && p2==0)
{
the_rule = 4;
}

}

if(state == 3) // etat present = C
{
p1 = 0;
p2 = 0;

if(subindex == 1)
{
p1 = 1;
}

if(current_block > 2)
{
p2 = 1;
}

if(p1 == 0)
{
the_rule = 7;
}

if(p1 == 1 && p2 == 1)
{
the_rule = 9;
}

if(p1==1 && p2==0)
{
the_rule = 10;
}

}

/*** le numero de la meta-regle est maintenant connu;
il s’agit ensuite de l’appliquer;
c’est le role du switch(the_rule) plus bas avec les “case” ***/

switch(the_rule)
{
case 1:
rstack[rtop] = 2+rstack[rtop];
lstack[ltop-1]=lstack[ltop-1]-8;
ltop=ltop+2;
lstack[ltop]=5;
lstack[ltop-1]=1;
subindex=4;
state=2;
delta_time=103;
break;

case 2:
num1=rstack[rtop];
num2=rstack[rtop-2];
current_block = current_block – 1;
rstack[rtop]=rstack[rtop]+1;
rstack[rtop-4]=rstack[rtop-4]+2;
ltop=ltop+2; // pile gauche “gagne 2 elements”
lstack[ltop]=rstack[rtop];
lstack[ltop-1]=current_block;
rtop=rtop-4; // la pile de droite “perd 4 elements”
current_block=num2;
subindex=num2;
state=2; // le prochain etat va etre B, apres application de Rule 2
delta_time=3*num1 + num2 + 4; // temps a ajouter au compteur de temps
break;

/*** dans la meta-regle 2, il y a une amalgation de blocs
suite a l’application de la meta-regle **/

case 3:
subindex=subindex-1;
current_block = current_block + 2;
rstack[rtop-1]=rstack[rtop-1]-2;
state=1;
delta_time = 7*rstack[rtop] – 1;
break;

case 4:
num1=rstack[rtop];
current_block=current_block+1;
rstack[rtop]=rstack[rtop]+1;
rstack[rtop-1]=rstack[rtop-1]-2;
subindex=subindex-1;
state=3;
delta_time = 7*num1 + 2;
break;

case 5:
current_block=current_block-1;
lstack[ltop]=lstack[ltop]-2;
rtop=rtop+2; // le sommet de pile droite croit de 2 blocs
rstack[rtop]=1;
rstack[rtop-1]=current_block;
current_block=2;
state=3;
delta_time=6;
break;

/*** case 5: ltop est inchange, rtop augmente de 2: cas de fission de blocs
apres application de la regle; inverse d’une amalgamation ***/

 

case 6:
subindex=2;
lstack[ltop-1]=lstack[ltop-1]-1;
current_block=current_block-1;
rtop=rtop+4;
rstack[rtop]=1;
rstack[rtop-1]=3;
rstack[rtop-2]=1;
rstack[rtop-3]=current_block;
current_block=lstack[ltop-1];
ltop=ltop-2;
state=2;
delta_time=5;
break;

case 7:
current_block=current_block-3;
subindex=subindex-1;
rtop=rtop+2;
rstack[rtop]=2;
rstack[rtop-1]=1;
state=2;
delta_time=3;
break;

case 8:
subindex=subindex-2;
current_block=current_block-3;
rtop=rtop+2;
rstack[rtop]=2;
rstack[rtop-1]=1;
state=3;
delta_time=10;
break;

case 9:
num9=lstack[ltop];
current_block=current_block-2;
lstack[ltop]=lstack[ltop]-1;
lstack[ltop-1]=lstack[ltop-1]+3;
subindex=lstack[ltop-1]-3;
rtop=rtop+2;
rstack[rtop-1]=current_block;
rstack[rtop]=lstack[ltop];
current_block=lstack[ltop-1];
ltop=ltop-2;
state=1;
delta_time= 4*num9 – 6;
break;

case 10:
num9=lstack[ltop];
current_block=current_block-2;
lstack[ltop]=lstack[ltop]-1;
lstack[ltop-1]=lstack[ltop-1]+3;
subindex=lstack[ltop-1]-3;
rstack[rtop]=rstack[rtop]+lstack[ltop];
current_block=lstack[ltop-1];
ltop=ltop-2;
state=1;
delta_time=4*num9 – 6;
break;

}

 

time = time + delta_time; // ajustement du nombre de steps ecoules
// un step est une transition selon la table

 

while(time >= 1000000000) // pour s’occuper de l’overflow de “time”
{
time = time – 1000000000;
time_billions++;
}

/****************

 

TIME IS: 8 billion + 914287753
USING RULE 1
ltop = 4611
rtop = 1673

1222

498722222
498722222
498722222
498722222
498722222
498722222
498722222
498722222
498722222
498722222

4987222
49896495a89
TIME IS: 8 billion + 914314687
USING RULE 1
ltop = 4691
rtop = 1533

 

*******************/

 

if(rtop == 1 && the_rule ==3 &&(3==(ltop%701)) )
{

/*** if rtop=1 and the_rule=3, then the head seems to
always be over square 0 July 18, 2006 ***/

 

count_ones=0;

i=1; // plus petit indice pointant a un bloc de 1 consecutifs

while(i<=ltop)
{
count_ones = count_ones + lstack[i];
i=i+2;
}

 

i=1;

if( time_billions > 455000)
{

while(i<=ltop)
{
printf(“%d “, lstack[i]);
i=i+1;
}

}

 

 

 

 

 

i=1;

while(i<=rtop)
{
count_ones = count_ones + rstack[i];
i=i+2;
}

 

printf(“\n”);

 

printf(“TIME IS: %ld billion + %ld\n”,time_billions, time);
printf(“COUNT OF ONES IS: %ld\n”, count_ones);

printf(“USING RULE %d\n”, the_rule);
printf(“ltop = %ld\n”, ltop);
printf(“rtop = %ld\n”, rtop);
printf(“counter= %ld billion + %ld\n”,loop_counter_b, loop_counter);

 

}

loop_counter++;
while(loop_counter>=1000000000)
{
loop_counter= loop_counter-1000000000;
loop_counter_b++;
}

 

} // ferme l’accoade de while(done == 0)

return 0;

} // ferme l’accoade de main()

Published
Categorized as History
meditationatae's avatar

By meditationatae

Canadian

Discover more from meditationatae

Subscribe now to keep reading and get access to the full archive.

Continue reading