Autor Tema: Teorema empírico de Goldbach

0 Usuarios y 1 Visitante están viendo este tema.

29 Noviembre, 2009, 07:38 pm
Leído 1989 veces

Leo_Gutierrez

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 45
  • Karma: +0/-0
  • Sexo: Masculino
  • Aprendiendo de a poco.
Agradezco al libro "Historias de matemáticos" en dónde leí esto, y de allí que haya decidido hacer el código, el autor del libro es Mariano Mataix.

Teorema empirico de Goldbach.

Esta proposición de Goldbach tiene hoy en día un puesto al lado del "último teorema de Fermat". Es decir, que se trata de una proposición que tiene todas las trazas de ser cierta, pero que nadie ha podido probarlo ni tampoco hallar un caso que la contradiga.

Fue enunciada por Euler, en respuesta a una simple conjetura que le había sometido Goldbach; de ahí que lleve este nombre. Dice así: "Todo número par es la suma de los dos números primos".

Aquí está el código en C, dicho código hace uso de una función "primo" que determina si un número es primo, no es el algoritmo más eficiente, pero sirve bien para el cometido. También se hace uso de una macro "esImpar", que como su nombre lo indica, checa si un número es par o impar.

Aquí el código:
Código: [Seleccionar]
/* Teorema empirico de Goldbach */
#include <stdio.h>
signed int primo(signed int numero)
{
    signed int divisores = 0, i;
    for(i = 1; i <= numero; i++)
        if(numero % i == 0)
        divisores++;
    if(divisores == 2)
    return 1;
    else
    return 0;
}
int main(void)
{
    signed int numero, i, j;
    do
    {
        printf("Numero : ");
        setbuf(stdin, NULL);
    } while(scanf("%d", &numero) != 1);
    putchar('\n');
    for(i = 1; i < 100; i++)
    for(j = 1; j < 100; j++)
    if(primo(i) && primo(j))
    {
        if(i + j == numero)
        printf("%d + %d = %d\n", i, j, numero);
    }
    return 0;
}

No creo que haya un número par que no cumpla la condición.

29 Noviembre, 2009, 09:18 pm
Respuesta #1

topo23

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 937
  • Karma: +0/-0
Una forma un poquito mas eficiente de determinar si un numero es primo es la siguiente:

Código: [Seleccionar]
bool primo(int numero)
{
    if (numero<=1) return false; // 0 y 1 no son primos
    if (numero==2) return true; // 2 es primo
    if (numero%2==0) return false; // el resto de los pares no son primos
    // n es compuesto entonces tiene un divisor d tal que 1 < d <= sqrt(n)
    // descartados los numeros pares chequeamos solo los divisores impares
    for (int i=3; i*i<=numero;i+=2)
    {
        if (numero%i==0)
        {
            return false;
        }
    }
    return true;
}

Como i+j = j+i, es suficiente con chequear cuando i <= j, asi te ahorras los chequeos duplicados.

Código: [Seleccionar]
for (i = 1; i < 100; ++i)
{
    if (!primo(i)) continue; // si i no es primo nos podemos saltear el siguiente for
    for (j = i; j < 100; ++j) // notar que j empieza desde "i"
    {
        // ...
    }
}
.

29 Noviembre, 2009, 11:59 pm
Respuesta #2

Leo_Gutierrez

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 45
  • Karma: +0/-0
  • Sexo: Masculino
  • Aprendiendo de a poco.
Oh, gracias por el tip, por fin me encuentro complacido con una función primo.

Pero bueno, tú código me sirve pero para C99 o C++, no para C90, que es lo que yo uso. Incluso podría hacerse más eficiente así:
Código: [Seleccionar]
unsigned short int primo(signed int numero)
{
    if(numero<=1)
    return 0;
    if(numero == 2)
    return 1;
    if(!(numero & 1))
    return 0;
    unsigned int i;
    for(i = 3; i * i <= numero; i += 2)
        if(!(numero % i))
            return 0;
    return 1;
}

Usando los modificadores de variable y el operador & que trabaja más rapido que el operador mod, sólo para reducir un poco el esfuerzo.

28 Abril, 2010, 12:07 am
Respuesta #3

Leusss

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 315
  • Karma: +1/-0
  • Sexo: Masculino
Hola, me gusto mucho el código, porque me viene al pelo :P pero sólo una aclaración. Cuando descartas los números pares chequeando que x%2==0, ¿no deberías aclarar que x sea distinto de 2? Porque sino el caso 2 es ambiguo.

Saludos

28 Abril, 2010, 12:58 am
Respuesta #4

topo23

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 937
  • Karma: +0/-0
Hola, me gusto mucho el código, porque me viene al pelo :P pero sólo una aclaración. Cuando descartas los números pares chequeando que x%2==0, ¿no deberías aclarar que x sea distinto de 2? Porque sino el caso 2 es ambiguo.

Saludos

Si te fijas en el código esta contemplado ese caso, e incluso los comentarios hacen esa aclaración

Código: [Seleccionar]
bool primo(int numero)
{
    if (numero<=1) return false; // 0 y 1 no son primos
    if (numero==2) return true; // 2 es primo
    if (numero%2==0) return false; // el resto de los pares no son primos

Primero comprueba que sea 2 y luego hace la otra comprobacion.
.