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

24 comentarios

  1. ReMaTXEs | 4 de enero de 2007 | 10:33

    Vótalo Thumb up 0

    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

  2. Jose | 4 de enero de 2007 | 12:15

    Vótalo Thumb up 0

    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?

  3. mimetist | 4 de enero de 2007 | 17:45

    Vótalo Thumb up 0

    ¿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

  4. mimetist | 4 de enero de 2007 | 17:46

    Vótalo Thumb up 0

    ueeee… vale, no, tiene razón, faltan los “+” xD

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

  5. Farragut | 4 de enero de 2007 | 18:56

    Vótalo Thumb up 0

    Hola a todos:

    Segun al wikipedia, una terna pitagorica es:

    a² + b² = c²

    Por lo que en este caso y com odice Mimetist, a² + b² = 1000² … Hallense a y b :-)

    http://es.wikipedia.org/wiki/Terna_pitag%C3%B3rica

  6. Enric | 4 de enero de 2007 | 23:11

    Vótalo Thumb up 0

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

  7. Jose | 4 de enero de 2007 | 23:12

    Vótalo Thumb up 0

    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.

  8. ^DiAmOnD^ | 4 de enero de 2007 | 23:15

    Vótalo Thumb up 0

    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.

  9. Trackback | 5 ene, 2007

    Tiempo finito y logarítmico

  10. Daniel Ajoy | 12 de enero de 2007 | 04:02

    Vótalo Thumb up 0

    Se parecen a estos otros de la Olimpiada de Computación e Informática 2005

    http://mondragon.angeltowns.net/paradiso/OlimpiadaCyM2005.html

    Intenté resolver estos con Logo :)

  11. klondike | 13 de enero de 2007 | 04:14

    Vótalo Thumb up 0

    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

  12. ^DiAmOnD^ | 13 de enero de 2007 | 16:22

    Vótalo Thumb up 0

    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.

  13. klondike | 14 de enero de 2007 | 00:38

    Vótalo Thumb up 0

    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));
    }

  14. Juan juanete | 28 de febrero de 2007 | 12:01

    Vótalo Thumb up 0

    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.

  15. ^DiAmOnD^ | 28 de febrero de 2007 | 15:53

    Vótalo Thumb up 0

    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

  16. Alejandro | 2 de marzo de 2007 | 18:20

    Vótalo Thumb up 0

    En esta página se encuentran todos los codigos para poder escribir (hay q estar registrado para entrar)

    http://projecteuler.net/index.php?section=faq&ref=forum_html

    Para tu pregunta en puntual la caja de codigo se escribe:

    [code]Code box[/code]

    Buena suerte!

  17. jorge mauricio morales parra | 13 de abril de 2007 | 04:46

    Vótalo Thumb up 0

    YO quisiera saberla terna de cuarenta

  18. Nexus7 | 13 de abril de 2007 | 10:10

    Vótalo Thumb up 0

    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

  19. ^DiAmOnD^ | 13 de abril de 2007 | 14:24

    Vótalo Thumb up 0

    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 :)

  20. Nexus7 | 13 de abril de 2007 | 19:56

    Vótalo Thumb up 0

    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.

  21. bourjiñousz santos | 16 de abril de 2007 | 19:43

    Vótalo Thumb up 0

    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

  22. Nexus7 | 16 de abril de 2007 | 21:42

    Vótalo Thumb up 0

    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. :D

  23. ^DiAmOnD^ | 16 de abril de 2007 | 21:59

    Vótalo Thumb up 0

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

  24. Jose | 10 de julio de 2013 | 19:25

    Vótalo Thumb up 0

    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))

Escribe un comentario

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. Utiliza la Vista Previa antes de publicar tu comentario para asegurarte de que las fórmulas están correctamente escritas.