// Una conjetura es una proposición verdadera o falsa, difÃcil de probar. Mediante una
// demostración se prueba la conjetura; mediante un programa se comprueba que la
// conjetura es verdad/falsa para un caso de prueba. Programe la clase Conjeturas
// para comprobar dos conjeturas:
//
// La Conjetura de Collatz dice: Sea n un entero positivo. La sucesión:
// n/2 Si n es par,
// 3*n+1 En otro caso
// converge al patrón repetitivo …., 4, 2 ,1, ejemplo:
// 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 4, 2, 1 4, 2, 1 ...
//
// Muestre en el monitor las sucesión:
// 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 // finalice al llegar a 1
//
// Conjetura de Goldbach: Cada número entero par mayor que 2 es la suma de dos
// números primos. Simbólicamente se representa asÃ: p + q = 2n, donde p y q son
// primos y 2n, cualquier par mayor que 2, ejemplo:
// Goldbach: 22 = 19 + 3
//
// La salida en el monitor será:
// Collatz : 13 40 20 10 5 16 8 4 2 1 // finalizar la sucesión al llegar a 1
// Goldbach: 22 = 19 + 3
class Conjeturas{
public static void main(String[] args){
collatz(13);
// for (int i= 0; i<20;i++) System.out.println(i + ": " + esPrimo(i)); // casos de prueba
// for (int i= 0; i<20;i++) goldbach(i); // casos de prueba // Casos de prueba
goldbach(22);
}
static void collatz(int n){
System.out.print("Collatz : " + n + " ");
do{
if (n%2==0) n /= 2;
else n = 3*n +1
System.out.print(n + " ");
} while(n>1);
System.out.println("\n");
}
static void goldbach(int n){
if (n%2 != 0) {
System.out.println("n = " + n + " no es par");
return;
} // inicio de la repetición
if (n<4) {
System.out.println("n = " + n + " < 4");
return;
}
// inicia texto
System.out.print("Goldbach: " + n + " = " );
// busca primos
int p = 2; // primer primo
while(p <= n/2){
if(esPrimo(p) && esPrimo(n-p)) {
System.out.println(p + " + " + (n-p));
return;
}
if (p==2) p++; // optimización de la iteración
else p +=2;
};
System.out.println("No se cumple GoldBach");
}
static boolean esPrimo(int n){
// algoritmo óptimo
if (n < 2) return false;
if (n == 2) return true;
if (n%2 == 0) return false;
for (int i=3; i<n/2; i+=2)
if (n%i == 0) return false;
// algoritmo óptimo
return true;
}
}