Project Euler: Matemáticas y Programación

Project Euler es una web donde podemos encontrar muchos desafíos que involucran matemáticas y programación. Se trata de una serie de problemas matemáticos que requieren casi obligatoriamente la creación de un programa para resolverlos. Por ejemplo:

Si el 2 es el primer número primo, el 3 el segundo, el 5 el tercero…encuentra el primo número 10001.

Podemos verlos todos sin necesidad de registrarnos, pero si nos registramos podemos ir sumando puntos conforme vamos resolviendo las cuestiones. Cada uno de los problemas comienza con 20 puntos cuando es propuesto y va bajando de puntuación conforme los usuarios van resolviéndolo. Yo he estado mirando unos cuantos, pero como mi nivel de programación es nulo no he podido hacer mucho. He resuelto uno, el problema número 9 en estos momentos:

Encuentra una terna pitagórica (a,b,c) tal que a+b+c=1000

Ese también lo podéis resolver vosotros. Buscad en este blog y encontraréis la información suficiente.

Y si vais resolviendo problemas podéis usar lo comentarios para informarnos y para dar o pedir ayuda. Seguro que los informáticos del blog estarán encantados.

Share

Autor: ^DiAmOnD^

Miguel Ángel Morales Medina. Licenciado en Matemáticas y autor del blog Gaussianos. Puedes seguirme en Twitter o indicar que te gusta mi página de Facebook.

23 Comentarios

  1. Joás! En 2º de ITIS tuve una asignatura relacionada con esto.. Se llamaba Métodos Numéricos y consistia en implementarlos en C xDD

    Me acuerdo aun de alguno como las reglas de Simpson, la del trapecio, regresiones lineales, binomiales… xD

    Publica una respuesta
  2. Feliz año y enhorabuena por la página.

    Diamond, supongo que te refieres al de la terna pitagórica tal que a+b+c=1000 (no veo los “+” en tu post).
    Yo lo he resuelto también sin programar pero he usado una hoja de cálculo despues de haber despejado una variable para buscar cuál era el único entero dándo valores a la otra. a=200, b=375, c=425 ¿Cómo lo has resuelto tu?

    Publica una respuesta
  3. ¿las ternas pitagóricas no eran las de la forma a² + b² = c² ??

    si c = 1000, entonces tendríamos que buscar dos números tales que a² + b² = 1000000

    no?

    El comentario de Jose me ha despistado :S

    Publica una respuesta
  4. ueeee… vale, no, tiene razón, faltan los “+” xD

    Joer, porqué no leeré con más atención antes de abrir la boca!!

    Publica una respuesta
  5. En Project Euler piden hasta el primo 10001, y en el post has puesto 100001 :) Imagino que ha sido un error tipográfico

    Publica una respuesta
  6. Hola Farragut,

    El problema que aparece en la página (projecteuler.net) del que hablamos es: Hállese una terna pitagórica (que sí es un a, b y c tal que a^2 + b^2 = c^2) que cumpla que a+b+c=1000.

    Esta es: a=200, b=375, c=425.

    Publica una respuesta
  7. Ya están puestos los + y arreglado lo del 10001 :).

    Sobre lo de las ternas pitagóricas: son ternas (a,b,c) tal que a2+b2=c2. Lo que pide el problema es que encontremos una terna de ese tipo que cumpla que a+b+c=1000. Yo lo resolví usando el post cómo construir triángulos pitagóricos que publiqué hace un tiempo. Echad un ojo.

    Publica una respuesta
  8. Hola, os he descubierto hace poco y lo primero que quiero deciros es gracias por hacer un blog así.
    Las matemáticas nunca me habían llamado especialmente la atención, pero desde que os leo me ha entrado el gusanillo y no puedo parar. Así que GRACIAS y seguid así.

    Una de las consecuencias de leeros es que me he puesto a resolver problemas del Project Euler. Resolviendo este problema en concreto he aprendido varias cosas y he recordado otras que tenía olvidadas. Quería compartir mi solución con vosotros porque utilizo un método de construción de ternas pitagóricas distinto (creo) del que comenta Diamond en el post citado. Mi nivel en mates es muy bajo, si pongo alguna burrada avisadme y os pido disculpas por adelantado.

    Para generar todas las ternas pitagóricas primitivas de un número x podemos hacer esto:
    (corolario al teorema de pitágoras)
    Si x es par:
    a = x;
    b = (x² – 1) / 2
    c = (x² + 1) / 2
    Si x es impar:
    a = x
    b = (x/2)² – 1
    c = (x/2)² – 1

    El problema se resuelve cuando a+b+c = 1000 o bien
    cuando 1000 es divisible entre (a+b+c), porque
    si a²+b²=c² y a+b+c=p
    entonces da+db+dc=dp
    Siguiendo este método se puede programar un algoritmo que resuelve el problema en sólo 6 iteraciones, empezando
    por x = 3 que es el número más pequeño que puede formar parte de una terna pitagórica. No pongo el código para no aburrir, pero si a alguien le interesa no tiene más que pedirlo.
    Saludos

    Publica una respuesta
  9. klondike me alegro mucho de que hayamos conseguido despertar en ti el gusanillo de las matemáticas :).

    Respecto a tu comentario: me suena haber visto por ahí esa forma de calcular ternas pitagóricas, pero te has confundido. Donde pones par debería poner impar y dodne pone impar debería poner par.

    Y otra cosa: pon el código hombre, así lo vemos.

    Publica una respuesta
  10. Efectivamente, lo de par-impar está invertido, y no es el único error, también pongo un menos donde debería ir un más, espero no haber liado a nadie con mi descuido.

    Os pongo el código, este sí está libre de errores y da la respuesta correcta al problema:

    public void euler9() {
    int a = 0;
    int b = 0;
    int c = 0;
    int p = 0;
    int x = 3;
    do {
    if (x % 2 != 0) {
    a = x;
    b = ((x*x) – 1) / 2;
    c = ((x*x) + 1) / 2;
    }
    else {
    a = x;
    b = ( (x/2)*(x/2) ) – 1;
    c = ( (x/2)*(x/2) ) + 1;
    }
    x++;
    p = a + b + c;
    }while (1000%p != 0);
    int k = 1000/p;
    System.out.println(“Result = “+(k*a*k*b*k*c));
    }

    Publica una respuesta
  11. Holas, ya se que este comentario lo escribo con retraso pero por si alguien lo lee le agradecería que me respondiera. A raíz de leer gaussianos hace dos semanas empezé a participar en el proyecto euler, y mi pregunta no puede ser más tonta: ¿Cómo pongo el código fuente en los foros de forma que quede dentro de un recuadro como los de todo el mundo?

    Enhorabuena por la página.

    PD: estoy en el puesto 625, mi nick es zippol.

    Publica una respuesta
  12. Juan pues ni idea, yo no he escrito en los foros así que no sé cómo hay que escribirlo.

    Cuando lo descubras cuéntanoslo

    Publica una respuesta
  13. La terna pitagórica entera más pequeña es 3,4,5 y todas las ternas pitagóricas son múltiplos de dicha terna. Esto es, toda terna pitagórica cumple la siguiente condición: 3x,4x,5x donde x es un cualquier número real (o cualquier natural si buscamos ternas enteras)

    Encontrar la terna que suma 40 es tan sencillo como resolver la ecuación 3x+4x+5x=40
    3x+4x+5x = 40
    12x = 40
    x = 40/12
    x = 10/3 = 3,333…

    Por lo tanto la terna es
    3*10/3, 4*10/3, 5*10/3
    10, 13,333.., 16,666…

    Comprobamos que es una terna pitagórica.
    a²+b²=c²
    10² + (40/3)² = (50/3)²
    100 + 1600/9 = 2500/9
    900/9 + 1600/9 = 2500/9
    2500/9 = 2500/9

    Comprobamos que suman 40
    10 + 13,333.. + 16,666… = 10+30 = 40

    Publica una respuesta
  14. Nexus7 no todas las ternas pitagóricas son múltiplos de (3,4,5). Es cierto que toda terna múltiplo de ésa vuelve a ser una terna pitagórica, pero hay muchas más que no se pueden obtener como (3x,4x,5x). Échale un ojo a este post de hace un tiempo:

    Cómo construir ternas pitagóricas.

    Saludos :)

    Publica una respuesta
  15. OK. Gracias, ya entendí. Ahora compruebo que yo malinterpreté qué era una “terna pitagórica”.

    Para mi, que suelo razonar estás cuestiones de forma geométrica, un triángulo pitagórico es el triángulo rectángulo con un seno y un coseno = 0.6 (que su hipotenusa valga 5, 50, 26.57 o pi solo es un convencionalismo llamado escala) Pero veo que yo estaba equivocado y el tema es una cuestión más aritmética que geométrica (un triángulo previamente dibujado será o no será pitagórico dependiendo de la escala que utilicemos)

    Hoy ya no me acostaré sin aprender algo nuevo.

    Publica una respuesta
  16. esto es mentira!!!!!!!!!!!!
    aqui teneis algunos ejemplos mas no múltiples…!!
    esas matematicas!!

    3 4 5
    5 12 13
    6 8 10
    7 24 25
    8 15 17
    9 12 15
    9 40 41

    Publica una respuesta
  17. Muchas gracias, pero eso que dices ya lo señaló Diamond y ya reconocí mi error.

    Podemos ponernos a cantar a coro que yo me equivoqué, pero ganaríamos poco con ello. 😀

    Publica una respuesta
  18. bourjiñousz lee el comentario anterior como te dice Nexus7. Y de todas formas se puede comentar con otros modos.

    Publica una respuesta
  19. Bueno, para el primer problema he usado R (lenguaje y entorno para estadística)

    esprimo <- function(num){

    comp <- 0

    if(num<=2){
    return(TRUE)
    }

    else{

    for(i in 2:floor(sqrt(num))){
    if(num%%i==0){
    comp <- 1
    }

    }

    if(comp==1){
    return(FALSE)
    }
    else{
    return(TRUE)
    }

    }

    listaprimos <- function(n){

    primos <- c()
    i <- 1

    while(length(primos)<n){
    if(esprimo(i)==TRUE){
    primos <- c(primos,i)
    }
    i <- i+1

    }
    return(primos)

    }

    mimi <- listaprimos(10001)
    mimi[10001]

    (resultado 104743)

    Para el segundo problema, uso Haskell. Son dos líneas usando List Comprehensions:

    let list = [(a,b,c) | c <- [1..1000], a <- [1..c], b <- [1..a], a^2+b^2==c^2, a+b+c=1000]
    head list

    (resultado (375,200,425))

    Publica una respuesta

Trackbacks/Pingbacks

  1. Tiempo finito y logarítmico - [...] Lo encontré via Gaussianos.   Por Jaime Soffer, 5. January 2007, 06:10…

Puedes utilizar código LaTeX para insertar fórmulas en los comentarios. Sólo tienes que escribir
[latex]código-latex-que-quieras-insertar[/latex]
o
$latex código-latex-que-quieras-insertar$.

Si tienes alguna duda sobre cómo escribir algún símbolo puede ayudarte la Wikipedia.

Y si los símbolos < y > te dan problemas al escribir en LaTeX te recomiendo que uses los códigos html & lt; y & gt; (sin los espacios) respectivamente.

Envía un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Uso de cookies

Este sitio web utiliza cookies para que tengas la mejor experiencia de usuario. Si continúas navegando estás dando tu consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies. Más información sobre las cookies <aquí..

ACEPTAR