elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros  (Leído 7,773 veces)
Karcrack


Desconectado Desconectado

Mensajes: 2.419


Se siente observado ¬¬'


Ver Perfil
[RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« en: 17 Julio 2010, 14:30 »

Otro reto; A ver quien hace la funcion de factorizacion mas rapida :)

Se trata de crear una funcion que factorice cualquier numero entero positivo...

La funcion ha de devolver un Collection con todos los numeros primos que componen ese numero

Para medir el tiempo necesario se utilizará este codigo:
Código:
Private tmr     As CTiming

Private Sub Form_Load()
    Dim x       As Long
    Dim vItem   As Variant
   
    Set tmr = New CTiming
    tmr.Reset
   
    For x = 0 To 4096
        'Debug.Print x, ;
        'For Each vItem In iFactorize(x)
        '    Debug.Print vItem;
        'Next vItem
        'Debug.Print
        Call iFactorize(x)
    Next x
   
    MsgBox tmr.sElapsed
End Sub
cTiming.cls

+Info
Código:
http://en.wikipedia.org/wiki/Integer_factorization
http://es.wikipedia.org/wiki/Factorizaci%C3%B3n_de_enteros

Suerte, espero que participeis muchos :P


En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.419


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #1 en: 17 Julio 2010, 14:44 »

v0.1:
Mi funcion tarda: 17,462 msec (Probado compilado, en un procesador de ***** :xD)
Código:
Public Function iFactorize(ByVal n As Long) As Collection
    Dim cTmp    As New Collection
    Dim i       As Long
    Dim lSqrt   As Long
    
    If Not n > 0 Then GoTo Ret
    
    lSqrt = Sqr(n)

    For i = 2 To lSqrt
        If n Mod i = 0 Then
            Set cTmp = iFactorize(n / i)
            cTmp.Add i
            GoTo Ret
        End If
    Next i
    
    cTmp.Add n
    
Ret: Set iFactorize = cTmp
End Function
:D

v0.2:
Código
  1. Public Function iFactorize(ByVal n As Long) As Collection
  2.    Dim cTmp    As New Collection
  3.    Dim i       As Long
  4.  
  5.    If n = 0 Then GoTo Ret
  6.    If n = 1 Then cTmp.Add 1: GoTo Ret
  7.  
  8.    While (n And 1) = 0
  9.        cTmp.Add 2
  10.        n = n / 2
  11.    Wend
  12.  
  13.    i = 3
  14.    While (i <= (n ^ 0.5))
  15.        If (n Mod i) = 0 Then
  16.            cTmp.Add i
  17.            n = n / i
  18.        End If
  19.        i = i + 2
  20.    Wend
  21.  
  22.    If n > 1 Then cTmp.Add n
  23.  
  24. Ret: Set iFactorize = cTmp
  25. End Function


« Última modificación: 18 Julio 2010, 23:53 por Karcrack » En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #2 en: 17 Julio 2010, 19:37 »

Ok, me apunto, pero tiene que ser con Collections a la fuerza¿? :-\

DoEvents¡! :P
« Última modificación: 17 Julio 2010, 20:15 por *PsYkE1* » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.128


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #3 en: 17 Julio 2010, 21:55 »

Compilado!¡ 8,817 ms Proc: 2.2Ghz One Core!¡... no es una collection xP

Código
  1.  
  2. Public Function FactorizadorBlackZeroX(ByVal vNumber As Long) As String
  3. Dim i               As Long
  4.    If vNumber < 0 Then Exit Function
  5.    For i = 2 To Sqr(vNumber)
  6.        If vNumber Mod i = 0 Then
  7.            FactorizadorBlackZeroX = FactorizadorBlackZeroX(vNumber / i) & "," & i
  8.            Exit Function
  9.        End If
  10.    Next i
  11.    FactorizadorBlackZeroX = vNumber
  12. End Function
  13.  
  14.  

Source Test:

Código
  1.  
  2. Option Explicit
  3. Private tmr As CTiming
  4. Private Sub Form_Load()
  5. Dim x       As Long
  6. Dim vItem   As Variant
  7. Const limit = 5000
  8. Dim TestResults$
  9.  
  10.    Set tmr = New CTiming
  11.    tmr.Reset
  12.    For x = 0 To limit
  13.        Call FactorizadorBlackZeroX(x)
  14.    Next x
  15.    TestResults$ = "FactorizadorBlackZeroX " & tmr.sElapsed
  16.    tmr.Reset
  17.    For x = 0 To limit
  18.        Call iFactorize2(x)
  19.    Next x
  20.    Call MsgBox(TestResults$ & vbCrLf & "iFactorize2: " & tmr.sElapsed)
  21. End Sub
  22.  
  23.  

Sangriento Infierno Lunar!¡.
« Última modificación: 18 Julio 2010, 22:30 por BlackZeroX » En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.128


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #4 en: 17 Julio 2010, 21:59 »

Se me olvido preguntar la cosa es llegar el menor consumo de procesador?, se vale cualquier maña?...

Dulces Lunas!¡.
« Última modificación: 17 Julio 2010, 22:13 por BlackZeroX » En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
Karcrack


Desconectado Desconectado

Mensajes: 2.419


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #5 en: 18 Julio 2010, 14:04 »

La cosa es hacerlo mas rapido posible y hacerlo con COLLECTIONS!! que es la mejor forma de trabajar mas tarde que lo que retorna la funcion...

Tu codigo en mi procesador en el mejor de los casos tarda: 21,551 msec
En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.128


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #6 en: 18 Julio 2010, 21:19 »

.
Extraño a mi el tuyo me tardo 11.850 ms; creo qué alguien mas debería de hacer los test... Moderador!¡.

Dulces Lunas!¡.
En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
FFernandez

Desconectado Desconectado

Mensajes: 69



Ver Perfil
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #7 en: 18 Julio 2010, 22:14 »

Hola BlackZeroX




                         Soy nuevo y sé poco.

                         Perdona, solo he modificado un poco tu codigo.......


Public Function FactorizadorBlackZeroX(ByVal vNumber As Long) As String
Dim i As Long
Dim TmpArray() As Long

If vNumber < 0 Then Exit Function

If vNumber Mod 2= 0 Then
     FactorizadorBlackZeroX = FactorizadorBlackZeroX(vNumber / 2) & "," & 2
     Exit Function
End If



For i = 3 To Sqr(vNumber) step 2


       If vNumber Mod i = 0 Then
           FactorizadorBlackZeroX = FactorizadorBlackZeroX(vNumber / i) & "," & i
           Exit Function
       End If

Next i


FactorizadorBlackZeroX = vNumber

End Function



                 Espero que sirva...................

                               Un saludo a los dos
« Última modificación: 18 Julio 2010, 22:20 por FFernandez » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.128


I'Love...!¡.


Ver Perfil WWW
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #8 en: 18 Julio 2010, 22:46 »


Compilado:

FactorizadorBlackZeroX: 9.826 msec
iFactorize: 11.000 msec
FactorizadorFFernandez: 8.848 msec

Código
  1.  
  2. Option Explicit
  3. Private tmr As CTiming
  4. Private Sub Form_Load()
  5. Dim x       As Long
  6. Dim vItem   As Variant
  7. Const limit = 5000
  8. Dim TestResults$(2)
  9.  
  10.    Set tmr = New CTiming
  11.    tmr.Reset
  12.    For x = 0 To limit
  13.        Call FactorizadorBlackZeroX(x)
  14.    Next x
  15.    TestResults$(0) = tmr.sElapsed
  16.    tmr.Reset
  17.    For x = 0 To limit
  18.        Call iFactorize(x)
  19.    Next x
  20.    TestResults$(1) = tmr.sElapsed
  21.    tmr.Reset
  22.    For x = 0 To limit
  23.        Call FactorizadorFFernandez(x)
  24.    Next x
  25.    TestResults$(2) = tmr.sElapsed
  26.    MsgBox "FactorizadorBlackZeroX: " & TestResults$(0) & vbCrLf & _
  27.           "iFactorize: " & TestResults$(1) & vbCrLf & _
  28.           "FactorizadorFFernandez: " & TestResults$(2)
  29. End Sub
  30.  
  31. Public Function iFactorize(ByVal n As Long) As Collection
  32.    Dim cTmp    As New Collection
  33.    Dim i       As Long
  34.    Dim lSqrt   As Long
  35.  
  36.    If Not n > 0 Then GoTo Ret
  37.  
  38.    lSqrt = Sqr(n)
  39.  
  40.    For i = 2 To lSqrt
  41.        If n Mod i = 0 Then
  42.            Set cTmp = iFactorize(n / i)
  43.            cTmp.Add i
  44.            GoTo Ret
  45.        End If
  46.    Next i
  47.  
  48.    cTmp.Add n
  49.  
  50. Ret: Set iFactorize = cTmp
  51. End Function
  52.  
  53. Public Function FactorizadorFFernandez(ByVal vNumber As Long) As String
  54. Dim i As Long
  55.    If vNumber <= 0 Then Exit Function
  56.    If vNumber Mod 2 = 0 Then
  57.         FactorizadorFFernandez = FactorizadorFFernandez(vNumber / 2) & "," & 2
  58.         Exit Function
  59.    End If
  60.    For i = 3 To Sqr(vNumber) Step 2
  61.       If vNumber Mod i = 0 Then
  62.           FactorizadorFFernandez = FactorizadorFFernandez(vNumber / i) & "," & i
  63.           Exit Function
  64.       End If
  65.    Next i
  66.    FactorizadorFFernandez = vNumber
  67. End Function
  68.  
  69. Public Function FactorizadorBlackZeroX(ByVal vNumber As Long) As String
  70. Dim i               As Long
  71.    If vNumber < 0 Then Exit Function
  72.    For i = 2 To Sqr(vNumber)
  73.        If vNumber Mod i = 0 Then
  74.            FactorizadorBlackZeroX = FactorizadorBlackZeroX(vNumber / i) & "," & i
  75.            Exit Function
  76.        End If
  77.    Next i
  78.    FactorizadorBlackZeroX = vNumber
  79. End Function
  80.  
  81.  

En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
Karcrack


Desconectado Desconectado

Mensajes: 2.419


Se siente observado ¬¬'


Ver Perfil
Re: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros
« Respuesta #9 en: 18 Julio 2010, 23:09 »

Vuestras funciones no cumplen el requisito de devolver Collections! Asi que yo gano ::) (:P :rolleyes:)
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
mantisa,numeros reales,enteros caracter
Programación C/C++
mxsoun 1 1,734 Último mensaje 5 Septiembre 2011, 19:25
por Eternal Idol
[RETO] + Funcion Extraer Numeros de Cadenas! [Cpp/C] « 1 2 3 4 »
Programación C/C++
x64core 39 25,120 Último mensaje 8 Enero 2012, 00:58
por Eternal Idol
[RETO] + Funcion Extraer Numeros de Cadenas! « 1 2 ... 5 6 »
Programación Visual Basic
x64core 55 19,697 Último mensaje 9 Enero 2012, 10:26
por Psyke1
Código fuente para sumar números enteros aleatorios
Programación C/C++
UmbraNoche 5 9,075 Último mensaje 4 Abril 2012, 00:41
por do-while
Necesito ayuda, validación de números enteros
Programación C/C++
DarkSorcerer 3 2,894 Último mensaje 25 Noviembre 2013, 20:37
por do-while
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines