Teoría de números


Números primos

Cómo determinar si un número es primo. Matemáticos y aficionados han buscado una fórmula para saber si un número es primo; pero nadie ha obtenido aún esa fórmula matemática exacta y con una estructura algorítmica aceptable que resuelva esta pregunta para todos o un conjunto indefinido de números primos.

 

Un número es primo si no es múltiplo o divisible por otro número que no sea el mismo y la unidad.

 

Si queremos saber si un número es primo, podemos probar de dividir entre 1,2,3,4…. hasta el número, si ninguno de ellos lo divide, el número será primo. Pero esta no es la manera más eficiente de determinar si el número es primo. El problema es que tenemos que probar tantos números dependiendo de cuan grande es el número que investigamos.

 

Sabemos que si un número es divisible o múltiplo de otro, entonces cualquier producto de ese número también lo es. Por esto si dividimos por un número compuesto (que es el producto de al menos un primo), será divisible también por este primo, por eso:

Para saber si un número es primo basta con saber si es divisible entre algún primo hasta el número mismo. Pero tampoco es necesario evaluar todos los números primos hasta el número.

 

Cuando probamos en orden los números primos, los estamos descartando por orden, por lo tanto el siguiente primo a probar multiplicado por los anteriores no podrá obtener el número como resultado, por lo que como mínimo obtendremos el número con el siguiente primo a probar por el mismo, esto significa que la búsqueda termina con el primo que tenga el cuadrado más cercano al número sin superarlo, o lo que es lo mismo:

 

Para saber si un número es primo basta con probar si el número no es divisible por los primos hasta su raíz cuadrada.

 

Ejemplo

Determinar si el número 67 es primo

La raíz cuadrada de 67 es 8,1853… por lo que solo es necesario probar los números primos hasta 8. probamos con 2,3,5,7

 

67 no es divisible por 2, ya que su última cifra no es par

67 no es divisible por 3, ya que 6 + 7 = 13 no es múltiplo de 3

67 no es divisible por 5, ya que su última cifra no es 0 o 5

67 no es divisible por 7, puesto 67 : 7 = 9,5714....

 

67 no puede ser dividido por estos primos por tanto 67 es un número primo.

 

¿Existe una fórmula que me diga exactamente si un número es primo?

 

Sí, el teorema de Wilson: Un número n es primo si y solo si (n-1)! + 1 es múltiplo de n, pero computacionalmente no es eficiente para determinar si número muy grandes son números primos.Cómo determinar si un número es primo. Matemáticos y aficionados han buscado una fórmula para saber si un número es primo; pero nadie ha obtenido aún esa fórmula matemática exacta y con una estructura algorítmica aceptable que resuelva esta pregunta para todos o un conjunto indefinido de números primos. 

Teoría de números con Flutter

Presentamos algunos extractos de código para desarrollar una aplicación en flutter.

Iniciamos definiendo las rutas de las páginas del programa general.

La estructura de nuestro programa será la siguiente

Luego generamos el código siguiente, que corresponde a las funciones de la sección programs.

Iniciamos con todo el código referente al cálculo de números primos.

Determinar divisores o listas de divisores


Verificar si un número es automórfico

Lista de números pares según Goldbach

Finalmente la sección que nos mostrará la pantalla sobre números primos

La pantalla anterior, servirá como plantilla para generar las demás, haciendo los cambios correspondientes a texto, forma y/o funciones matemáticas.



Desarrollo de la aplicación para C#

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Aplicaciones_Matemáticas
{
    public partial class Form1 : Form
    {
        int indica = 0;

        public Form1()
        {
            InitializeComponent();
        }

        void Form1Load(object sender, EventArgs e)
        {
            dataGridView1.AutoResizeColumns();
            dataGridView1.RowHeadersVisible = false;
        }
        private void númeroPerfectoToolStripMenuItem_Click(object sender, EventArgs e)
        {

            indica = 1;
            limpiarControles(this);
            label1.Visible = true;
            label2.Visible = true;
            label1.Text = "Comprobar para un Número";
            label2.Text = "Número: ";
            textBox1.ForeColor = Color.Blue;
            textBox1.TextAlign = HorizontalAlignment.Center;
            textBox1.Font = new Font("Lucida Bright", 11);
            textBox1.Multiline = true;
            textBox1.AcceptsReturn = true;
            textBox1.AcceptsTab = true;
            textBox1.WordWrap = true;
            this.textBox1.Text = "Un número perfecto es aquel \r\n" +
            "cuyos divisores (excepto el mismo) \r\n" +
            "sumados dan como resultado \r\n" +
            "el número. Ejemplo: 6 = 3 + 2 + 1 \r\n" +
            "Comprueba a  la derecha 33550336";
            string[] currentColumn = new string[5];
            int j = 6;
            int cont = 0;
            while (cont < 4) {
                string cadena = numPerfect(j).Cad;
                int valor = numPerfect(j).Num;
                if (valor > 0) {
                    // Agregamos datos
                    currentColumn[cont] = valor.ToString();
                    cont = cont + 1;
                }
                j = j + 1;
            }
            cargarGrid(currentColumn);
        }

 

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Aplicaciones_Matemáticas
{
    public partial class Form1 : Form
    {
        int indica = 0;

        public Form1()
        {
            InitializeComponent();
        }

        void Form1Load(object sender, EventArgs e)
        {
            dataGridView1.AutoResizeColumns();
            dataGridView1.RowHeadersVisible = false;
        }
        private void númeroPerfectoToolStripMenuItem_Click(object sender, EventArgs e)
        {


        private void númerosPrimosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            indica = 2;
            limpiarControles(this);
            label1.Visible = true;
            label2.Visible = true;
            label1.Text = "Comprobar para un Número";
            label2.Text = "Número: ";
            textBox1.ForeColor = Color.Blue;
            textBox1.TextAlign = HorizontalAlignment.Center;
            textBox1.Font = new Font("Lucida Bright", 11);
            textBox1.Multiline = true;
            textBox1.AcceptsReturn = true;
            textBox1.AcceptsTab = true;
            textBox1.WordWrap = true;
            this.textBox1.Text = "Un número primo es aquel \r\n" +
            "que tiene exactamente dos \r\n" +
            "divisores: el uno y el mismo \r\n" +
            "número. Ejemplo: 2, sus divisores son \r\n" +
            "1 y 2 solamente";
            string[] currentColumn = new string[100];
            int j = 3;
            int cont = 1;
            currentColumn[0] = "2";
            while (cont < 100) {
                long valor = numPrimo(j);
                if (valor > 0) {
                    // Agregamos datos
                    currentColumn[cont] = valor.ToString();
                    cont = cont + 1;
                }
                j = j + 1;
            }
            cargarGrid(currentColumn);
        }

        private void númerosAutomórficosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            indica = 3;
            limpiarControles(this);
            label1.Visible = true;
            label2.Visible = true;
            label1.Text = "Comprobar para un Número";
            label2.Text = "Número: ";
            textBox1.ForeColor = Color.Blue;
            textBox1.TextAlign = HorizontalAlignment.Center;
            textBox1.Font = new Font("Lucida Bright", 11);
            textBox1.Multiline = true;
            textBox1.AcceptsReturn = true;
            textBox1.AcceptsTab = true;
            textBox1.WordWrap = true;
            this.textBox1.Text = "Un número automórfico es aquel \r\n" +
            "cuya potencia al cuadrado \r\n" +
            "contiene el mismo número en\r\n" +
            "su  o sus últimas cifras. \r\n" +
            "Por ejemplo: 5, 6, 25, 76, 376, 625...\r\n" +
            "Comprueba 90625 y 109376";

            string[] currentColumn = new string[7];
            int j = 6;
            int cont = 1;
            currentColumn[0] = "5";
            while (cont < 7) {
                int valor = numAutomorf(j);
                if (valor > 0) {
                    // Agregamos datos
                    currentColumn[cont] = valor.ToString();
                    cont = cont + 1;
                }
                j = j + 1;
            }
            cargarGrid(currentColumn);
        }
        
        void MersenneToolStripMenuItemClick(object sender, EventArgs e)
        {
            indica = 4;
            limpiarControles(this);
            label1.Visible = true;
            label2.Visible = true;
            label1.Text = "Comprobar para un Número";
            label2.Text = "Número: ";
            textBox1.ForeColor = Color.Blue;
            textBox1.TextAlign = HorizontalAlignment.Center;
            textBox1.Font = new Font("Lucida Bright", 11);
            textBox1.Multiline = true;
            textBox1.AcceptsReturn = true;
            textBox1.AcceptsTab = true;
            textBox1.WordWrap = true;
            this.textBox1.Text = "Un número de Mersenne es aquel de la\r\n" +
            "forma 2^n-1. Si n es primo y el resultado\r\n" +
            "es número primo. Entonces es un número\r\n" +
            "primo de Mersenne. Por ejemplo: 3, 7, 31, 127,..." +
            "Comprueba para n=19 y n=31.";

            string[] currentColumn = new string[8];
            int j = 2;
            int cont = 1;
            currentColumn[0] = "3";
            while (cont < 8) {
                long valor = numMersenne(j);
                if (valor > 0) {
                    // Agregamos datos
                    currentColumn[cont] = valor.ToString();
                    cont = cont + 1;
                }
                j = j + 1;
            }
            cargarGrid(currentColumn);
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        /**********************************************/

        private void limpiarControles(Control parent)
        {
            foreach (Control c in parent.Controls) {
                if (c is TextBox) {
                    c.Text = "";
                }
                if (c is Label) {
                    c.Text = "";
                }

                if (c.Controls.Count > 0) {
                    limpiarControles(c);
                }
            }
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();
            dataGridView1.Refresh();
        }

        void cargarGrid(string[] curcol)
        {
            //Llenar grid           
            dataGridView1.Rows.Clear();
            dataGridView1.Refresh();
            DataGridViewCellStyle style =
                dataGridView1.ColumnHeadersDefaultCellStyle;
            style.BackColor = Color.Navy;
            style.ForeColor = Color.White;
            style.Font = new Font("Tahoma", 9);
            dataGridView1.DefaultCellStyle.Font = new Font("Tahoma", 8);
            dataGridView1.DefaultCellStyle.ForeColor = Color.Blue;
            dataGridView1.DefaultCellStyle.BackColor = Color.Beige;
            dataGridView1.DefaultCellStyle.SelectionForeColor = Color.Yellow;
            dataGridView1.DefaultCellStyle.SelectionBackColor = Color.Black;
            dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            for (int i = 0; i < 10; i++) {
                string column = string.Format("C{0}", i + 1);
                dataGridView1.Columns.Add(column, column);
                dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                dataGridView1.AutoSizeRowsMode =
                            DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView1.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                dataGridView1.Columns[dataGridView1.Columns.Count - 1].AutoSizeMode =                                    DataGridViewAutoSizeColumnMode.Fill;
            if (indica == 1)
                dataGridView1.Rows.Add(curcol);
            if (indica == 2) {
                int i = 0;
                for (int j = 0; j < 10; j++) {
                    dataGridView1.Rows.Add();
                    for (int k = 0; k < 10; k++) {
                        dataGridView1.Rows[j].Cells[k].Value = curcol[i];
                        i = i + 1;
                    }
                }
            }
            if (indica == 3)
                dataGridView1.Rows.Add(curcol);     
            if (indica == 4)
                dataGridView1.Rows.Add(curcol);
            foreach (DataGridViewRow row in dataGridView1.Rows) {
                if (row.Index % 2 == 0) {
                    row.DefaultCellStyle.BackColor = Color.LightGray;
                } else
                    row.DefaultCellStyle.BackColor = Color.Ivory;
            }       
            dataGridView1.Refresh();
        }

        public NumPerfClass numPerfect(int num)
        {
            NumPerfClass datos = new NumPerfClass();
            int sumdiv = 1;
            string cadenasum = (this.textBox2.Text).Trim() + " = 1 + ";
            for (int i = 2; i <= num / 2; i++) {
                if (num % i == 0) {
                    sumdiv = sumdiv + i;
                    if (i < num / 2)
                        cadenasum = cadenasum + i.ToString() + " + ";
                    else
                        cadenasum = cadenasum + i.ToString();
                }
            }
            datos.Cad = cadenasum;
            if (sumdiv == num)
                datos.Num = num;
            else
                datos.Num = -1;
            return datos;
        }

        private void textBox2_Leave(object sender, EventArgs e)
        {
            if (indica == 1) {
                int number = Int32.Parse(this.textBox2.Text);

                int valor = numPerfect(number).Num;
                string cadenasum = numPerfect(number).Cad;
                if (valor == number) {
                    this.label3.Text = "El número es Pefecto";
                    this.label4.Text = cadenasum;
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            switch (indica) {
                case 1:
                    int number = Int32.Parse(this.textBox2.Text);

                    int valor = numPerfect(number).Num;
                    string cadenasum = numPerfect(number).Cad;
                    if (valor == number) {
                        this.label3.Text = "El número es Perfecto";
                        this.label4.Text = cadenasum;
                    } else {
                        this.label3.Text = "El número NO es Perfecto";
                    }
                    break;
                case 2:
                    number = Int32.Parse(this.textBox2.Text);
                    long val = numPrimo(number);
                    if (val > 0)
                        this.label3.Text = "El número es Primo";
                    else
                        this.label3.Text = "El número no es Primo";
                    break;
                case 3:
                    number = Int32.Parse(this.textBox2.Text);
                    valor = numAutomorf(number);
                    if (valor > 0)
                        this.label3.Text = "El número es Automórfico";
                    else
                        this.label3.Text = "El número no es Automórfico";
                    break;
                case 4:
                    number = Int32.Parse(this.textBox2.Text);
                    long val1 = numMersenne(number);
                    if (val1 > 0)
                        this.label3.Text = "El número "+val1.ToString()+" es primo de Mersenne";
                    else
                        this.label3.Text = "El número "+number.ToString()+" no genera un primo de Mersenne";
                    break;
            }
        }

        public long numPrimo(long num)
        {
            if (num % 2 == 0)
                return -1;
            else {
                int i = 3;
                while (i <= System.Math.Sqrt(num)) {
                    if (num % i == 0) {
                        i = Convert.ToInt32(System.Math.Sqrt(num)) + 1;
                        return -1;
                    } else
                        i = i + 2;
                }
                return num;
            }
        }
        
        public long numMersenne(int num)
        {
            long valor = numPrimo(num);
            long pot = -1;
            if (valor > 0)
            {
                pot = Convert.ToInt64(Math.Pow(2, num)-1);
                valor = Convert.ToInt32(numPrimo(pot));
                if (valor > 0)
                    return pot;
                  else
                    return -1;}
              else
                return -1;
        }

        public int numAutomorf(int num)
        { 
            int numcif = 0;
            int cifin = 0;
            int num2 = num * num;
            int result = num2 / 10;
            double aux = 0;
            while (result > 0) {
                result = result / 10;
                numcif = numcif + 1;
            }     
            while (cifin != num && numcif > 0) {
                aux = Math.Truncate(num2 / (Math.Pow(10, numcif))) * Math.Pow(10, numcif);
                cifin = num2 - Convert.ToInt32(aux);
                numcif = numcif - 1;
            }
            if (cifin == num)
                return cifin;
            else
                return -1;
        }
    }
}

Aplicaciones Matemáticas, una aplicación desarrollada en C# para comprobar algunas propiedades numéricas.