Descomponer en factores primos

Iniciado por juanlulete, 7 Agosto 2012, 00:56 AM

0 Miembros y 2 Visitantes están viendo este tema.

juanlulete

Hola, estoy intentando hacer un programa que descomponga un número en factores primos. Aunque lo conseguí, va muy lento y no lo hace perfecto.

Yo quería que me descompusiera el número de un textbox, le diera un botón y me pusiera la descomposición en un label de este modo:

textbox = 60
label = 2^2·3·5


Yo lo hice con un listbox porque no pude hacerlo de otra forma.
Este es mi código:

Public Class Form1
    Function isPrime(ByVal iNum As Decimal) As Boolean
        If (iNum < 2D) Then isPrime = False : Exit Function
        If (iNum < 4D) Then isPrime = True : Exit Function
        If (iNum Mod 2D = 0D) Then isPrime = False : Exit Function
        Dim iMax As Decimal : iMax = CInt(Math.Sqrt(CDbl(iNum)))
        Dim i As Decimal
        For i = 3D To iMax Step 2D
            If (iNum Mod i = 0D) Then isPrime = False : Exit Function
        Next i
        isPrime = True
    End Function
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ListBox1.Items.Clear()
        Dim a As Decimal = TextBox1.Text
        Dim j As Decimal
        Dim y As Decimal = 1D
        Dim z As Decimal
        For j = y To a
            If isPrime(j) Then
                For z = 1D To 1000D
                    If a Mod j ^ z = 0D Then ListBox1.Items.Add(j)
                Next
            End If
        Next j
    End Sub
End Class


Por favor, ¿pueden ayudarme a mejorar o mejor cambiar mi código?

Keyen Night

#1
Yo publico uno hace tiempo, mejore el código como por un año investigando bastante me obsesiono por un tiempo este tema :xD y en verdad va bastante rápido, claro hay números que por alguna razón matemática que aun no entiendo tardan demasiado, como por ejemplo 444445555511122222 o de ese tipo.

http://foro.elhacker.net/net/aporte_factorizacion_a_maxima_velocidad_actualizado_21102011-t321927.0.html

Normalmente siempre se recorren los números de 0 a N para hallar si un número es primo, eso serían N operaciones para cualquier N, si N es 100 mil millones entonces 100 mil millones serán las operaciones necesarias, a eso se debe la demora, sin embargo hay muchos métodos para acortar el tiempo, todos los que pude descubrir están aplicados en ese ejemplo, en tu código aplicas varios, como comenzar desde el 3, porque se sabe que el 2 es primo y el 1 no, avanzar de 2 en 2, porque sabemos que ningún primo es par, además de estos hay otros importantes como por ejemplo ningun número que se presume compuesto tiene más de un factor primo que supere su raíz por el simple hecho de que si F1 es una factor de N y es mayor que la raíz de N, N no puede tener 2 F1 de factores por que superarían a N, en otras palabras 2*F1>N, otros varios están explicados en esa publicación, nada más estos 3 disminuyen la cantidad de operaciones en

RaízCuadrada(N-3/2) en vez de N operaciones.

Como sea al menos hasta ahora no existe un método para factorizar en primos números grandes de una manera rápida, si alguien lo logra o lo matan o la seguridad informática debe volver a plantearse desde el principio :xD
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

juanlulete

Según lo he visto esta muy bien pero mi programa (Tengo Visual Basic 2010 Express) me indica que no está "regex" determinado.

Derive 6.0
Solo por si quieres mejorar tu programa y también mejorar otras cosas de matemáticas este programa es increíble. Tiene el mejor sistema de factorizar que haya visto nunca, resuelve todo lo que quieras de mates: sumatorios, productorios, ecuaciones, derivadas, integrales, funciones... y no solo eso resuelve con todos los dígitos que te de la gana (un millón de dígitos)

Aquí te paso el programa portable: (Copia todo lo que esté entre comillas)
"https://rapidshare.com/files/4288239705/Derive 6 - Evaluación.rar"

Si lograras descompilar el programa conseguirías muchas formulas y muy buenas.
Muchas gracias.

Keyen Night

La tomare mucho en cuenta si la llegase a necesitar, voy a descargarla ahora, Gracias por compartirla ;) hay una página WolframAlpha que también resuelve cualquier cosa, ofrece una API pero es paga :-\

Para usar Regex debes importar System.Text.RegularExpressions.

Mi código será siempre más lento, porque está en .Net y porque así como he agregado muchas cosas también faltaran otras, pero es solo practica lo que buscaba era entender la teoría de los problemas y las ventajas de factorizar un número que se supone compuesto en sus primos ;D.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

juanlulete

Perdona pero no entiendo como utilizar lo de regex, ¿me lo podrías explicar?

Keyen Night

Regex es la clase en .Net que controla las expresiones regulares, que son un lenguaje de programación descriptivo para capturar patrones en textos, Es un tema muy extenso, por medio de instrucciones que describen patrones un motor de búsqueda realiza las operaciones necesarias para capturar en el texto que desees si el patrón existe o no.

http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
http://www.elguille.info/regexp/indice.aspx
http://msdn.microsoft.com/es-es/library/hs600312%28v=vs.80%29.aspx
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...