domingo, 30 de mayo de 2021

Cálculo del Máximo Común Divisor y del mínimo común múltiplo

 En bastantes problemas no encontramos con la necesidad de calcular este valor, el MCD sobre todo se usa en criptografía.

Para el MCD  de dos números se no enseña en la escuela que hay que descomponerlos en factores primos y el producto de los factores comunes es el valor del MCD, por ejemplo el MCD de 48 y de 60, su descomposición en factores primos es :

  • Para 60 es 2^2 x 5 x 3
  • Para 48 es 2^4 x 3
Es el MCD es 2^2 x 3 = 12

Hay otro método menos costoso computacionalmente que es el siguiente:

  • Se divide el mayor (dividendo) entre el menor(divisor), si el resto es 0 el MCD es el valor menor
  • En caso contrario se divide el divisor entre el resto en un proceso iterativo, en el que se actualizan los valores en cada operación, finaliza cuando  el resto es 0, en este caso el MCD es el último divisor usado.
En este enlace se explica de forma gráfica y fácil

Para el cálculo del mínimo común múltiplo la operación es sencilla
mcm=(numero1 x numero2)/MCD(numero1,numero2)
A continuación os pongo un código en Java, que he probado en bastantes  casos y no me ha dado error, pero que hay que sestearlos más.

// cálculo de Máxomo común divisor y el mínimo común múltiplo

import java.util.Scanner;
import java.lang.Math;

public class MCD_mcm {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);

long numero1;
long numero2;
long resto;
long mayor;
long menor;

// entrada de datos
System.out.println("Introducir el numero 1 ");
numero1=sc.nextLong();
System.out.println("Introducir el mumero 2 ");
numero2=sc.nextLong();

// ordenacion de los numeros
if(numero1>=numero2){
mayor=numero1;
menor=numero2;
}
else{
mayor=numero2;
menor=numero1;
}

// cálculos

resto=mayor % menor; // cálculo del resto
System.out.println("Valor del resto "+resto);

while(resto!=0){
mayor=menor;
menor=resto;

resto=mayor%menor;
}
//Salida del Máximo Común divisor MCD
System.out.printf("El MCD de %d y %d es %d%n",numero1,numero2,menor);
/ calculo de mínimo común multiplo mcm
System.out.printf("El mcm de %d y %d es %d%n",numero1,numero2,Math.abs(numero1*numero2)/menor);

sc.close(); // cerramos el Scanner
}
}

domingo, 16 de mayo de 2021

El problema de dado un número entero, encontrar otro entero que sumado al anterior sea divisible por otro entero determinado

 En este caso resolvemos el problema suponiendo que la suma es divisible por 7 y después lo extendemos al resto de los enteros.

Tomemos por ejemplo el número 30 y queremos encontrar otro entero que sumado al anterior sea dicha suma múltiplo de 7, y además le añadimos que sea la menor suma que cumple esta condición.

la lista de los primeros  múltiplos de 7 son:

  • 7, 21, 28, 35, 42, 49, 56, etc
Entonces el 30 se encuentra entre el 28 y 35, por lo que el número múltiplo de 7 más cercano es el 35 y el  valor que le tenemos que sumar a 30 es  35-30=5.

Se puede extrapolar a cualquier divisor no solo el 7.

Abajo dejo el código en Java para cualquier divisor :


import java.util.Scanner;

public class Divisible {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        int numero;
        int divisor;
        int paso;

        // entrada de datos
        System.out.println("Introducir el mumero divisor ");
        divisor=sc.nextInt();             
        
        System.out.println("Introducir el mumero base a sumar ");
        numero=sc.nextInt();

        paso=divisor*(numero/divisor+1);

        // cálculo y resultados
        System.out.printf("Hay que sumar %d a %d para obtener un multiplo de %d que es %d%n",paso-numero,numero,divisor,paso);

        sc.close(); // cerramos el Scanner
    }
    
}

no incluye condicionales, ni búsquedas por bucle que sería la primera tentación para resolver el problema.

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

    }

 

 

}



sábado, 2 de enero de 2021

Distribuciones para OSINT


OSINT significa Open Source Intelligence (en español Inteligencia de Fuentes Abiertas), y se trata de un conjunto de técnicas y herramientas para recopilar información pública, correlacionar los datos y procesarlos.

 

En lo que respecta a las herramientas hay unas cuantas distribuciones Linux, con diferencias en  las herramientas disponibles, por lo que para iniciaros en este mundo podéis seleccionar una y después personalizarla según las herramientas que necesitéis.

Yo recomiendo empezar con kali como base y añadir herramientas según os hace falta

 en el siguiente enlace se comentan algunas :


Distros Linux para OSINT(CiberPatrulla)

En el enlace hay un cuadro comparativo que reproduzco 



De la misma página un montón de herramientas :

Herramientas OSINT (gracias a Ciberpatrulla)


A esta lista hay que añadir

Ananke

CsiLinux

De libros recomendados para iniciarse:

0xword Libros

Libros ciberpatrulla