Home > Generale > I primi di Collatz

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:
n^{\prime} = \begin{cases} n/2 &\mbox{if } n \equiv 0 \pmod{2}\\ 3n+1 & \mbox{if } n\equiv 1 \pmod{2} \end{cases}
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;
}
Tag:
  1. Nessun commento ancora...
  1. Nessun trackback ancora...