martes, 27 de abril de 2021

El problema de la descomposición de un número entero en la suma de dos cuadrados en dos formas distintas (o por lo menos en una)

En el primer capítulo del libro "Inteligencia matemática " de Eduardo Sáez de Cabezón se propone como ejercicio final, encontrar algún número que se pueda descomponer de dos formas diferentes en la suma de dos cuadrados, pues bien algunos son:

  • 250 se puede descomponer como 5^2+15^2 y 9^2+13^2
  • 500 se puede descomponer como 4^2+22^2 y 10^2+20^2
¿ Y si pudiésemos encontrar más números como estos?

¿ Es posible obtener un algoritmo y programarlo?, pues si lo es, en estos casos lo mejor es hacerlo a mano y pasar el algoritmo nuestro lenguaje de programación favorito.

El programa en Java que se indica a continuación sirve para indicar :
  • Si un número se puede descomponer en la suma de cuadrados de dos formas diferentes
  • Si se puede descomponer en por lo menos una forma
  • Si no se puede descomponer
Evidentemente se puede mejorar y optimizar, si has visto este comentario pruébalo e indica si ha fallado en algún intento.

El código es:

 

// buscamos numeros naturales que se puedas expresar por sumas de cuadrados diferentes

 

 

import java.util.Scanner;

 

public class cuadrados {

    

    public static void main(String[] args) {

 

        double numero; // valor del numero a descomponer en la suma de cuadrados 

        long n=1; // numeros buscados

        int contador=0; // contador de numeros

 

        double x; // iterador

        double raiz;

        // variables del resultado

        double numero1=0;

        double numero2=0;

 

        Scanner sc=new Scanner(System.in);

 

        System.out.println("Introducir el mumero ");

        numero=sc.nextDouble();

 

        System.out.printf("El numero es %.0f %n",numero);

 

        do{

            x=Math.pow(n,2);

            raiz=Math.sqrt(numero-x);

 

            if(raiz==(long)raiz)

            {

                numero1=n;

                numero2=raiz;

                contador++; 

 

                System.out.printf("Los numeros son %.0f y %.0f%n",numero1,numero2);

            }

            if (numero-x<0)

            {   System.out.printf("No se han encontrado valores de suma de cuadrados para el número %.0f%n",numero);

                break;

            }

            n++; // incremento de n

            

 

 

        }while((n!=numero2)&&(contador<2));

 

 

        sc.close(); // cerramos el Scanner

    }

 

 

}