Argus - Challenge 2 - HardCore - C++
4 participantes
:: Programação :: A competição :: Arquivo :: Challenge 2
Página 1 de 1
Argus - Challenge 2 - HardCore - C++
Bom, não ando tendo muito tempo já que tenho que estudar certos assuntos nas férias. Mas só para não deixar a inércia reinar, resolvi solucionar um dos problemas do Challenge 2. Já havia solucionado um parecido quando resolvi alguns problemas do projecteuler. Como havia codificado em python naquela época, resolvi criar essa solução em C++ (até porque nunca estudei python como deveria). A solução foi codificada em C++ levando em consideração a portabilidade do código. Assim, deve ser possível compilar o código em qualquer compilador que suporte os padrões da linguagem C++. No entanto, como foi usada a biblioteca matemática cmath, em alguns sistemas pode ser necessário a linkagem de tal biblioteca, como é o caso do GNU/Linux. Basta passar o parâmetro -lm ao gcc para que se possa compilar nesse sistema. Em caso de dúvida vocês podem consultar a documentação dos seus compiladores. Na solução usei o crivo de eratóstenes, que é bem simples e bastante famoso. Tentei comentar ao máximo os detalhes cruciais da solução. Codifiquei apressadamente, mas o algoritmo não demora décadas para retornar a solução. No meu computador (processador intel core i3 e sistema operacional windows 7 32 bits), obtive a resposta em cerca de 3~4 segundos. Então, vamos ao problema e respectiva codificação da solução.
2 - A soma dos números primos abaixo de 10 é 2 + 3 + 5 + 7 = 17.
Faça um programa que encontre e imprima a soma de todos os números primos abaixo de dois milhões como também, imprima quantos números foram encontrados.
Solução:
2 - A soma dos números primos abaixo de 10 é 2 + 3 + 5 + 7 = 17.
Faça um programa que encontre e imprima a soma de todos os números primos abaixo de dois milhões como também, imprima quantos números foram encontrados.
Solução:
1 | #include <algorithm> |
Argus- Mensagens : 5
Data de inscrição : 09/07/2011
Idade : 39
Localização : Natal - RN
Re: Argus - Challenge 2 - HardCore - C++
Seja bem vindo ao Challenge Argus. E.. fico feliz em ver C++ na competição. Pois, ja ouço algumas pessoas dizerem que estão afim de entrar com C++ .... além disso, estudo python e estou começando no C++ por agora também. Espero que tire o máximo de proveito do forum ...que compartilhe e aprenda junto conosco. Valeu.
Argus - Challenge 2 - HardCore - C++
Bom, como ninguém ainda propôs uma solução para a questão 3 desse desafio, vim aqui compartilhar um pouco do que descobri a respeito. É um assunto de teoria dos números que exigiu dos Matemáticos alguma dedicação. O assunto trata de somas e diferenças de quadrados. Como não sou matemático, fui pesquisar a respeito. A solução aqui proposta é inteiramente baseada em um artigo que trata desse assunto, provavelmente o assunto foi muito estudado por Euler. Para entender a solução, é necessário o entendimento de três lemas mecionados no artigo. O que se fez foi obter os números x, y e z a partir de alguns fatores p, q, r e s. Só entrando um pouco no assunto, suponha que x + y = a^2 e x - y = d^2. Resolvendo esse sistema chegamos a x = (a^2 + d^2)/2 e y = (a^2 - d^2)/2. Através de um dos lemas citados no artigo, conclui-se que p = (a + d)/2 e q = (a - d)/2 e, consequentemente, x = pp + qq e y = 2pq. Em um outro lema, mostra-se que p = ac + bd, q = ad - bc, r = ad + bc e s = ac - bd. O artigo mostra ainda que z = 2rs. Mostra-se também que o problema pode ser reduzido às seguintes equações:
a = d = 4ffgg
b = f^4 - 2ffgg + 9g^4
c = f^4 + 2ffgg + 9g^4
Com isso, atribuindo valores a f e g, obtem-se os termos a, b, c e d e os fatores p, q, r e s. Por fim obtemos x, y e z. Para quem interessar, é importante a leitura do artigo a esse respeito. O título do artigo é Sums That Are Squares cujo autor é Ed Sandifer. O artigo pode ser encontrado aqui.
Solução:
a = d = 4ffgg
b = f^4 - 2ffgg + 9g^4
c = f^4 + 2ffgg + 9g^4
Com isso, atribuindo valores a f e g, obtem-se os termos a, b, c e d e os fatores p, q, r e s. Por fim obtemos x, y e z. Para quem interessar, é importante a leitura do artigo a esse respeito. O título do artigo é Sums That Are Squares cujo autor é Ed Sandifer. O artigo pode ser encontrado aqui.
3 - Faça um programa que encontre o menor número de x + y + z com inteiros x> y> z> 0 tal que x + y, x - y, x + z, x - z, y + z, y - z sejam quadrados perfeitos.
Solução:
1 | #include <cmath> |
Última edição por Argus em Qui Jul 21, 2011 10:02 pm, editado 1 vez(es) (Motivo da edição : Os sinais de adição das equações sumiram no momento de postar.)
Argus- Mensagens : 5
Data de inscrição : 09/07/2011
Idade : 39
Localização : Natal - RN
Argus - Challenge 2 - HardCore - C++
Mais uma vez, não esqueçam de linkar a biblioteca matemática.
Argus- Mensagens : 5
Data de inscrição : 09/07/2011
Idade : 39
Localização : Natal - RN
Re: Argus - Challenge 2 - HardCore - C++
Que bagulho.............. mirabolante hein!? vou ainda meditar em cima disso...
Re: Argus - Challenge 2 - HardCore - C++
Deu uma luz mas ainda vou pesquisar mais a respeito. Vlw
OmegaMK-XII- Mensagens : 29
Data de inscrição : 04/07/2011
Re: Argus - Challenge 2 - HardCore - C++
Olá Argus. O seu algoritmo do crivo não está simplificado pelo motivo de que você testa todos os números abaixo de 2,000,000 que são pares mas na matemática a teoria é de que não exista números pares primos com exceção do único número: 2.
Eu já usei este método para resolver o project euler (tenho 17 questões resolvidas por lá) mas existe um método melhor para resolver isso aí.
Eu já usei este método para resolver o project euler (tenho 17 questões resolvidas por lá) mas existe um método melhor para resolver isso aí.
Re: Rimack Zelnick
Por isso eu disse que codifiquei de forma apressada. E sim, eu sei que existe algoritmo mais eficiente pra testar primalidade. Inclusive, conheço o famoso AKS, mas nunca implementei e nem achei necessário, já que o crivo, mesmo incluindo todos os pares, encontra rapidamente os primos para este caso. Como ainda não estudei teoria dos números, fico com o crivo por enquanto.
[]'s
[]'s
Argus- Mensagens : 5
Data de inscrição : 09/07/2011
Idade : 39
Localização : Natal - RN
Re: Argus - Challenge 2 - HardCore - C++
Olá Argus! Eu compilei o seu código-fonte e fiz um profile dele usando o gprof. Na minha máquina Intel atom N455, 1GB RAM, ubuntu 11.04, kernel linux 2.6.38-10-generic, gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4). Demorou 1 minuto e 12.76 segundos!
Por outro lado, o meu algoritmo rodou em 0.14 segundos (olha o meu post).
Se você estiver duvidando (comum porque eu também duvidaria), dê uma olhada nos relatórios:
O relatório do seu programa:
http://pastebin.com/byFtcsBw
O relatório do meu programa:
http://pastebin.com/03CreyW9
Por outro lado, o meu algoritmo rodou em 0.14 segundos (olha o meu post).
Se você estiver duvidando (comum porque eu também duvidaria), dê uma olhada nos relatórios:
O relatório do seu programa:
http://pastebin.com/byFtcsBw
O relatório do meu programa:
http://pastebin.com/03CreyW9
Re: Argus - Challenge 2 - HardCore - C++
Dei uma pequena olhada e vi que esse negócio de jogar os zeros no início pra eliminar depois tem um custo um pouco alto. Se vc simplesmente deixasse os zeros onde estão e fosse somando os elementos ignorando-os, seria um pouco mais rápido.
OmegaMK-XII- Mensagens : 29
Data de inscrição : 04/07/2011
Argus - Challenge 2 - HardCore - C++
Tudo bem, já que vocês estão tocando muito no assunto eficiência, re-implementei o algoritmo de forma a otimizar a busca pelos primos no intervalo dado. Notem, porém que a mudança feita foi somente nos múltiplos dos primos encontrados no intervalo. De qualquer forma, o algoritmo passou a rodar instantaneamente no meu computador. Como sou curioso, fui testar esse gprof, já que nunca tinha ouvido falar e, percebi que 74% do tempo gasto pelo programa otimizado se deve ao uso do container vector. O algoritmo otimizado passou a rodar em 0.19 segundos no meu computador dos quais cerca de 0.14 segundos se deve o uso do vector. Não quis editar a solução original para que percebam a diferença de tempo. Então, eis a solução otimizada a seguir.
No entanto, ainda pode-se otimizar a solução para usar menos memória e executar mais rapidamente.
No entanto, ainda pode-se otimizar a solução para usar menos memória e executar mais rapidamente.
2 - A soma dos números primos abaixo de 10 é 2 + 3 + 5 + 7 = 17.
Faça um programa que encontre e imprima a soma de todos os números primos abaixo de dois milhões como também, imprima quantos números foram encontrados.
Solução otimizada:
1 | #include <cmath> |
Argus- Mensagens : 5
Data de inscrição : 09/07/2011
Idade : 39
Localização : Natal - RN
:: Programação :: A competição :: Arquivo :: Challenge 2
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos