Tarea de programación Java – Números primos

Una clásica tarea de programación es encontrar todos los números primos menores por debajo de una cantidad introducida por el usuario. El algoritmo más básico consiste en usar una versión digital de la criba de Eratóstenes que es bastante simple de escribir pero puede volverse muy lenta conforme se incrementa el la cantidad que introduce el usuario. El código en este post es básicamente el algoritmo la criba de Eratóstenes con unas cuantas optimizaciones. En mi PC es posible encontrar todos los números primos menores a 10,000,000 relativamente rápido usando este código. Para los números primos menores a 100,000,000 el código se tarda casi un minuto en mi PC. Para números mayores el tiempo se multiplicaría considerablemente.

El código para encontrar los números primos es el siguiente (lo siento, no pude lograr que wordpress formateara el código correctamente):

public static ArrayList<Integer> numerosPrimos(int max) {
    ArrayList<Integer> primos = new ArrayList<Integer>();
    primos.add(2);

    for (int i = 3; i < max; i++) {
        boolean es_primo = true;
        double limite = Math.ceil(Math.sqrt(i));
        for (int j = 0; j < primos.size(); j++) {
             if (i % primos.get(j) == 0) {
                 es_primo = false;
                 break;
             }
             if (primos.get(j) > limite) break;
        }
        if (es_primo) primos.add(i);
    }

    return primos;
}

 

He agregado este método a la clase TareasProgramacion en github. Se puede usar este método como en el siguiente ejemplo:

import java.util.*;
import org.monstruosoft.utils.*;

public class Prueba {
    public static void main(String args[]) {
        Scanner s = new Scanner(System.in);
        System.err.print("Escribe el número máximo para la búsqueda de números primos: ");
        int max = s.nextInt();
        ArrayList primos = TareasProgramacion.numerosPrimos(max);
        for (Integer i: primos)
            System.out.println(i);
        System.out.println("Se encontraron " + primos.size() + " números primos menores a " + max + ".");
    }
}

Al ejecutar el programa obtenemos la siguiente salida:

monstruosoft@debian:~/code/monstruosoft/java-utils$ java Prueba 
Escribe el número máximo para la búsqueda de números primos: 100
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
Se encontraron 25 números primos menores a 100.

Juegos indie mexicanos en Kickstarter – Parte 5

Las fiestas decembrinas realmente tuvieron un impacto en la actividad del blog pero no sólo eso, también se vieron reflejadas en Kickstarter, donde desde diciembre pasado no había aparecido un nuevo proyecto de videojuego mexicano.

Zaphiro’s Project marca el inicio de la actividad de este año en los proyectos de juegos indie mexicanos en Kickstarter. Desafortunadamente es el típico proyecto que solamente busca estafar a la gente o que tiene una buena intención o un sueño pero ninguna posibilidad de llevarlo a cabo. El proyecto es el típico “no tengo nada que mostrar, ni una imagen” que se ve aún más marcado por el hecho de que el creador de la campaña incluyó en el resumen de su proyecto que “la imagen es solo de referencia”, además promete que será un MMO de mundo abierto con mecánica artesanal, sistema de mejora de armas, minería y refinación de minerales, IA, agricultura, cría de animales, entre muchas otras cosas. Eso es un proyecto muy ambicioso para alguien que no da muestras de poder siquiera programar el “Hello world!”. Este proyecto está destinado a fracasar. Seguiré esperando el día en que aparezca un proyecto serio 😦 .

GIMP 2.10 en Debian Stretch

Como lo he escrito múltiples ocasiones en otros posts, los repositorios estables son a la vez la mejor y la peor parte de Debian. Por un lado, el software en los repositorios estables está, en teoría, garantizado que funcione sin problemas pero por otro lado eso significa no es raro encontrarse con que el software en los repositorios estables es software con varios años de antigüedad 😦 . GIMP es un ejemplo de esto, la versión en el repositorio estable de Debian es la 2.8.18 a pesar de que la versión 2.10 ya fue lanzada de forma oficial hace tiempo, así que si quieres probar la nueva versión de GIMP, los repositorios estables no son una opción.

Es posible que la versión más reciente de GIMP esté disponible en repositorios como el de backports o el de debian-multimedia pero ahora la página oficial de GIMP ofrece un link a la versión para Flatpak que es lo más cercano a tener un ejectuable oficial. Para instalar y ejecutar GIMP para Flatpak basta ejecutar los comandos que aparecen en la página oficial de GIMP:

flatpak install https://flathub.org/repo/appstream/org.gimp.GIMP.flatpakref 
flatpak run org.gimp.GIMP//stable

Ya en el pasado hice un post sobre Flatpak también relacionado con GIMP, sobra mencionar que debes tener Flatpak instalado en tu sistema y que lo puedes instalar desde el gestor de paquetes de Debian Stretch. Si es la primera vez que instalas o ejecutas un programa de Flatpak se instalará una máquina virtual de Flatpak ya que, si recuerdas los posts anteriores, Flatpak es un sistema que ofrece una forma de virtualización que permite ejecutar programas aislados del resto del sistema y, sobre todo, gracias al uso de máquinas virtuales o runtimes, permite usar librerías diferentes a las instaladas en el sistema sin que estas causen conflictos.

gimp-2.10

La versión de Flatpak es lo más cercano que tendremos a un ejecutable oficial de GIMP para Linux y sin duda es mejor y más sencillo que tener que compilarlo manualmente como lo hicimos alguna vez con la versión de desarrollo 2.9. Sin embargo, sabemos que me gusta tomar el camino más difícil así que decidí intentar compilar GIMP manualmente y crear un ejecutable nativo para Debian Stretch.

El proceso fue largo y difícil ya que GIMP 2.10 tiene como dependencias muchas librerías que no están en el repositorio estable de Debian; además, muchas, si no es que la mayoría, de esas librerías también tienen versiones mínimas requeridas que son superiores a las que usamos antes para compilar GIMP 2.9 por lo que las versiones que usamos para compilar GIMP 2.9 ya no sirven. Después de cazar versiones recientes de muchas librerías, sistemas de compilación como meson y todas sus dependencias, después de luchar para compilar librerías que requieren opciones que no son nada obvias y de instalarlas en rutas personalizadas ajustando las respectivas variables de entorno, finalmente fui capaz de compilar exitosamente el GIMP 2.10 en Debian Stretch y, aunque escribí una larga lista de instrucciones detalladas para compilarlo, no creo que valga la pena obligar a nadie a pasar por todo eso ahora que existe la versión oficial para Flatpak. Todo ese trabajo para compilar GIMP 2.10 manualmente aún puede ser de utilidad si quieres probar la versión de desarrollo más reciente… tengo planeado un post sobre eso.

Reto de la toja azul 2019

Si has seguido el blog por algún tiempo tal vez recuerdes el reto de la toja azul, un reto de programación de monstrochan para poner a prueba y/o mejorar tus habilidades como programador. El reto de la toja azul 2019 está vivo y el primer proyecto terminado es Huachi Bird, un clon de Flappy Bird mezclado con el tema de moda de los huachicoleros y el robo de combustible de Pemex.

Además de la versión web, el proyecto también cuenta con una versión para Android.

huachi-bird