Dev - C++ - Ultimo teorema de fermat

   
Vista:

Ultimo teorema de fermat

Publicado por Blaky (7 intervenciones) el 09/10/2015 18:47:53
Hola q tal señores les pido una ayuda con un programa en dev c que me imprima las primeras 100 soluciones para el ultimo teorema de fermat xn + yn = zn , n es exponente ,cuando
n=2 por favor si me podrian ayudar con eso gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ultimo teorema de fermat

Publicado por agustin (304 intervenciones) el 10/10/2015 20:46:28
En tu caso, no puede ser n mayor a 2 porque no daria ningun resultado. Te paso unos codigos que hice por fuerza bruta para el cuadrado y el cubo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
int LastFermatSquare(int maxA, int maxB, int maxC, int limite);
int LastFermatCubic(int maxA, int maxB, int maxC, int maxD, int limite);
int RaizCubica(double numero,double *resto);
//---------------------------------------------------------------------------
 
int LastFermatSquare(int maxA, int maxB, int maxC, int limite)
{
   int x,y,z;
   double a,b,c;
   int encontradas=0,salir=0;
 
   for(x=1;x<maxA && salir==0;x++)
      for(y=1;y<maxB && salir==0;y++)
      {
         a=pow(x,2);
         b=pow(y,2);
         c=a+b;
         z=sqrt(c);
         c=pow(z,2);
 
         if(a + b == c)
         {
            if(maxC == -1 || z <= maxC){
               encontradas++;
               if(encontradas == limite)
                  salir=1;
               printf("%d^2 + %d^2 = %d^2\n",x,y,z);
            }
         }
      }
   return encontradas;
}
//---------------------------------------------------------------------------
 
int RaizCubica(double numero,double *resto)
{
   //(3r^2*y*100) + (3r*y^2*10) + (y^3)
   int resultado=0,largo,y,valor;
   char n[20]={0};
   char parte[25]={0};
   char bajada[4]={0};
   double valorParte;
 
   sprintf(n,"%.0lf",numero);
 
   //Obtengo el grupo de 3cifras de mas a la izquierda del número
   for(largo=strlen(n);largo>3;largo-=3);
 
   strncpy(parte,n,largo);
   valorParte = atoi(parte);
 
   //Busco el cubo mas cercano al grupo
   for(y=1;pow(y,3) <= valorParte; y++);
   y--;
 
   //lo pongo en resultado
   resultado=y;
 
   //Le resto al valor de la tripleta el resultado del cubo obtenido
   valorParte-=pow(resultado,3);
   *resto=valorParte;
 
   while(strlen(n) > 3){
      //Elimino esa tripleta del numero
      strcpy(n,&n[largo]);
 
      //Añado detras la siguiente tripleta
      strncpy(bajada,n,3);
      largo=strlen(bajada);
      sprintf(parte,"%.0lf",valorParte);
      strcat(parte,bajada);
      valorParte = atoi(parte);
 
      valor=3*pow(resultado,2);
      y=(valorParte/100)/valor;
      valorParte -= (3*pow(resultado,2)*y*100)+(3*resultado* pow(y,2)*10)+pow(y,3);
      *resto=valorParte;
      sprintf(parte,"%.0lf",valorParte);
      resultado *=10;
      resultado +=y;
   }
   return resultado;
}
//---------------------------------------------------------------------------
 
int LastFermatCubic(int maxA, int maxB, int maxC, int maxD, int limite)
{
   int w,x,y;
   double a,b,c,d,z,resto;
   int encontradas=0,salir=0;
 
   for(w=1;w<maxA && salir==0;w++)
      for(x=1;x<maxB && salir==0;x++)
         for(y=1;y<maxC && salir==0;y++)
         {
            a=pow(w,3);
            b=pow(x,3);
            c=pow(y,3);
            d=a+b+c;
            z=RaizCubica(d,&resto);
 
            if(resto == 0){
               if(maxD == -1 || z <= maxD){
                  encontradas++;
                  if(encontradas == limite)
                     salir=1;
                  printf("%d^3 + %d^3 + %d^3 = %.0lf^3\n",w,x,y,z);
               }
            }
         }
   return encontradas;
}
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
   int coincidencias;
   double resto;
 
   //Con esta funcion ponemos a A el limite maximo de 1000, B el maximo de 1000,
   //C el maximo de 100, y le decimos que nos muestre las 100 primeras coincidencias
   //del ultimo teorema de Fermat
   coincidencias = LastFermatSquare(1000,1000, 100,100);
   printf("\nEncontradas %d coincidencias\n",coincidencias);
   printf("Pulsa intro para continuar");
   getchar();
 
   //Con esta funcion ponemos a A el limite maximo de 100, B el maximo de 100,
   //C el maximo de 100, no ponemos limite a D y le decimos que nos muestre las 100
   //primeras coincidencias del ultimo teorema de Fermat
   coincidencias = LastFermatCubic(100,100,100,-1,100);
   printf("\nEncontradas %d coincidencias\n",coincidencias);
   printf("Pulsa intro para salir");
   getchar();
   return 0;
}
//---------------------------------------------------------------------------

No se me ocurre otro modo que con el uso de fuerza bruta ya que no soy muy ducho en matematicas aunque me gustan.
Otra cosa, en la teoria, la raiz cubica de un numero es lo mismo que elevar ese numero a 1.0/3 pero me daba problemas para verificar luego si era exacta o no ya que para ello elevaba el resultado al cubo y me mostraba que era exacta pero a la hora de la comparacion no funcionaba y supongo que es por el tema de que el resultado de dividir 1/3 es periodico y el pc no puede ser mas exacto de lo que es porque no puede calcular hasta el infinito. Entonces decidi crearme una funcion que calcule la raiz cubica como se haria a mano y me devuelva el resto para saber si es exacta o no. Uso cadenas para ello y es mas lento que usar numeros pero es el precio que tuve que pagar para solucionarlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ultimo teorema de fermat

Publicado por Luis Eduardo (1 intervención) el 10/10/2015 22:06:08
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <math.h>
using namespace std;
main()
{
int i,j,k,rest=1;
float h,c;
		for(i=1;i<=100;i++)
		{		for(j=1;j<=100;j++)
				{
					for(k=1;k<=100;k++)
						{if(rest<=100)
							{
								h=pow(k,2);
								c=pow(i,2)+pow(j,2);
								if(h==c)
							{
								cout<<"Solucion numero : "<<rest<<endl;
								cout<<i<<";"<<j<<";"<<k<<endl;
								rest=rest+1;}
							}
						}
				}
		}
}


Hola que tal, prueba así. Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ultimo teorema de fermat

Publicado por agustin (304 intervenciones) el 10/10/2015 23:02:34
A simple vista parece que tu código también lo hace.
Algo que quizás interese es hacer que no se repitan, o sea, (3^2)+(4^2)=(5^2) es lo mismo que (4^2)+(3^2)=(5^2). Ambos son válidos pero es redundante así que si sabemos que son 100 los que vamos a guardar podemos ordenar los sumandos de menor a mayor y los buscamos en un array de dos dimensiones y si ya los guardamos antes los desechamos. Así tendríamos 100 resultados que no se repiten.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ultimo teorema de fermat

Publicado por Blaky (7 intervenciones) el 11/10/2015 17:05:41
Lo que queria saber es como hacer que me salgan los numeros pitagoricos en bloques de tres con esa ecuacuacion de fermat
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ultimo teorema de fermat

Publicado por Blaky (7 intervenciones) el 11/10/2015 17:02:39
Hola Agustín me ayudo mucho tu respuesta

Muchas gracias . Agradecerte el interés
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar