I primi di Collatz
Se andate su Wikipedia al seguente link link troverete una chiara spiegazione sulla congettura di Collatz. Se prendiamo un qualsiasi numero e iteriamo la seguente procedura:
la congettura afferma che prima o poi arriveremo sempre ad 1. Questo è quantomeno affascinante, il sapere cioè che ogni numero sottoposto a questa legge converga inesorabilmente ad 1 un numero finito di passi. Allora mi è venuto in mente di studiare come si comportano i numeri primi, e ho così scritto un semplice programma in c++ usando le gmplib per capire l’andamento delle orbite dei primi, ovvero del numero di iterazioni necessarie a raggiungere uno. I risultati non mostrano per adesso alcun comportamento particolare ma ancora mi riservo qualche ulteriore analisi.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gmp.h>
int main(int argc, char *argv[])
{
int i = 0, k = 0, c = 10;
mpz_t s, n, one;
if(argc > 1)
c = strtol (argv[1], 0, 10);
mpz_init (s);
mpz_init (n);
mpz_init (one);
mpz_set_ui (s, 3);
mpz_set_ui (one, 1);
FILE *fd = fopen ("orbita.txt", "w");
while( i < c )
{
if (mpz_probab_prime_p (s, 15) == 2) // if s is definitely prime
{
mpz_set (n, s);
char *stxt = mpz_get_str(0, 10, s);
printf ("Trovato primo: %s, con orbita = ", stxt);
while ( mpz_cmp_ui (n, 1) != 0 )
{
if( mpz_tstbit(n, 0) == 0 ) // pari
{
mpz_divexact_ui (n, n, 2);
}
else
{
// n = 3*n + 1
mpz_mul_ui (n, n, 3);
mpz_add_ui (n, n, 1);
}
k++;
}
printf ("%d\n", k);
fprintf(fd, "%s %d\n", stxt, k);
free(stxt);
k = 0;
i++;
}
mpz_add_ui (s, s, 2);
}
mpz_clear (s);
mpz_clear (n);
mpz_clear (one);
fclose (fd);
return 0;
}