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?
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
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.
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.
Perdona pero no entiendo como utilizar lo de regex, ¿me lo podrías explicar?
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