Autor
|
Tema: [RETO] Funcion iFactorize() - Factorizacion de numeros enteros (Leído 11,748 veces)
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
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 numeroPara medir el tiempo necesario se utilizará este codigo: 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+Infohttp://en.wikipedia.org/wiki/Integer_factorization http://es.wikipedia.org/wiki/Factorizaci%C3%B3n_de_enteros Suerte, espero que participeis muchos
|
|
|
En línea
|
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
v0.1: Mi funcion tarda: 17,462 msec (Probado compilado, en un procesador de ***** ) 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 v0.2:Public Function iFactorize(ByVal n As Long) As Collection Dim cTmp As New Collection Dim i As Long If n = 0 Then GoTo Ret If n = 1 Then cTmp.Add 1: GoTo Ret While (n And 1) = 0 cTmp.Add 2 n = n / 2 Wend i = 3 While (i <= (n ^ 0.5)) If (n Mod i) = 0 Then cTmp.Add i n = n / i End If i = i + 2 Wend If n > 1 Then cTmp.Add n Ret: Set iFactorize = cTmp End Function
|
|
« Última modificación: 18 Julio 2010, 23:53 pm por Karcrack »
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.089
|
Ok, me apunto, pero tiene que ser con Collections a la fuerza¿? DoEvents¡!
|
|
« Última modificación: 17 Julio 2010, 20:15 pm por *PsYkE1* »
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
Compilado!¡ 8,817 ms Proc: 2.2Ghz One Core!¡... no es una collection xP Public Function FactorizadorBlackZeroX(ByVal vNumber As Long) As String Dim i As Long If vNumber < 0 Then Exit Function For i = 2 To Sqr(vNumber) If vNumber Mod i = 0 Then FactorizadorBlackZeroX = FactorizadorBlackZeroX(vNumber / i) & "," & i Exit Function End If Next i FactorizadorBlackZeroX = vNumber End Function
Source Test: Option Explicit Private tmr As CTiming Private Sub Form_Load() Dim x As Long Dim vItem As Variant Const limit = 5000 Dim TestResults$ Set tmr = New CTiming tmr.Reset For x = 0 To limit Call FactorizadorBlackZeroX(x) Next x TestResults$ = "FactorizadorBlackZeroX " & tmr.sElapsed tmr.Reset For x = 0 To limit Call iFactorize2(x) Next x Call MsgBox(TestResults$ & vbCrLf & "iFactorize2: " & tmr.sElapsed) End Sub
Sangriento Infierno Lunar!¡.
|
|
« Última modificación: 18 Julio 2010, 22:30 pm por BlackZeroX »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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 pm por BlackZeroX »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
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
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. 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
|
The Dark Shadow is my passion.
|
|
|
FFernandez
Desconectado
Mensajes: 128
|
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 pm por FFernandez »
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
Compilado: FactorizadorBlackZeroX: 9.826 msec iFactorize: 11.000 msec FactorizadorFFernandez: 8.848 msec Option Explicit Private tmr As CTiming Private Sub Form_Load() Dim x As Long Dim vItem As Variant Const limit = 5000 Dim TestResults$(2) Set tmr = New CTiming tmr.Reset For x = 0 To limit Call FactorizadorBlackZeroX(x) Next x TestResults$(0) = tmr.sElapsed tmr.Reset For x = 0 To limit Call iFactorize(x) Next x TestResults$(1) = tmr.sElapsed tmr.Reset For x = 0 To limit Call FactorizadorFFernandez(x) Next x TestResults$(2) = tmr.sElapsed MsgBox "FactorizadorBlackZeroX: " & TestResults$(0) & vbCrLf & _ "iFactorize: " & TestResults$(1) & vbCrLf & _ "FactorizadorFFernandez: " & TestResults$(2) End Sub 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 Public Function FactorizadorFFernandez(ByVal vNumber As Long) As String Dim i As Long If vNumber <= 0 Then Exit Function If vNumber Mod 2 = 0 Then FactorizadorFFernandez = FactorizadorFFernandez(vNumber / 2) & "," & 2 Exit Function End If For i = 3 To Sqr(vNumber) Step 2 If vNumber Mod i = 0 Then FactorizadorFFernandez = FactorizadorFFernandez(vNumber / i) & "," & i Exit Function End If Next i FactorizadorFFernandez = vNumber End Function Public Function FactorizadorBlackZeroX(ByVal vNumber As Long) As String Dim i As Long If vNumber < 0 Then Exit Function For i = 2 To Sqr(vNumber) If vNumber Mod i = 0 Then FactorizadorBlackZeroX = FactorizadorBlackZeroX(vNumber / i) & "," & i Exit Function End If Next i FactorizadorBlackZeroX = vNumber End Function
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
Vuestras funciones no cumplen el requisito de devolver Collections! Asi que yo gano ( )
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
mantisa,numeros reales,enteros caracter
Programación C/C++
|
mxsoun
|
1
|
3,110
|
5 Septiembre 2011, 19:25 pm
por Eternal Idol
|
|
|
[RETO] + Funcion Extraer Numeros de Cadenas! [Cpp/C]
« 1 2 3 4 »
Programación C/C++
|
x64core
|
39
|
36,468
|
8 Enero 2012, 00:58 am
por Eternal Idol
|
|
|
[RETO] + Funcion Extraer Numeros de Cadenas!
« 1 2 ... 5 6 »
Programación Visual Basic
|
x64core
|
55
|
29,326
|
9 Enero 2012, 10:26 am
por Psyke1
|
|
|
Código fuente para sumar números enteros aleatorios
Programación C/C++
|
UmbraNoche
|
5
|
13,298
|
4 Abril 2012, 00:41 am
por do-while
|
|
|
Necesito ayuda, validación de números enteros
Programación C/C++
|
DarkSorcerer
|
3
|
4,944
|
25 Noviembre 2013, 20:37 pm
por do-while
|
|