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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] 4 Ir Abajo Respuesta Imprimir
Autor Tema: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo  (Leído 17,435 veces)
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #20 en: 9 Julio 2010, 15:43 pm »

Tienes, razon, cualquier numero mayor que 5 acabado en 5 no es primo debido a que ya seria divisible por 5 (Recordemos que los multiplos de 5 son todos los numeros acabados en 5 y en 0)

Tampoco creas que augmenta mucho la velocidad, debido a que simplemente ha de hacer un Mod 3 antes que el Mod 5 para comprobar que acaba en 5...
Ademas, no se me ocurre una forma de comprobar que acabase en 5 sin ralentizar el proceso...

Citar
Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.
No, gracias ;)


« Última modificación: 9 Julio 2010, 15:45 pm por Karcrack » En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #21 en: 9 Julio 2010, 16:13 pm »

Ok, gracias por contestar :P

EDITO:
Hice esta funcion, no es la mas rapida, pero es una forma diferente de hacerlo:
Código
  1. Public Function Check_Prime_Number(ByVal lNumber As Long) As Boolean
  2.    Const sPrimeDigit            As String = "1379"
  3.    Dim sLastDigit               As String * 1
  4.    Dim sNumber                  As String
  5.    Dim x                        As Long
  6.  
  7.    If (lNumber > 2) Then
  8.        sNumber = Str$(lNumber)
  9.        sLastDigit = Right$(sNumber, 1)
  10.        If InStr(sPrimeDigit, sLastDigit) > 0 Then
  11.            For x = 3 To Sqr(lNumber) Step 2
  12.                If (lNumber Mod x) = 0 Then Exit Function
  13.            Next
  14.            Check_Prime_Number = True
  15.        End If
  16.    End If
  17. End Function

Funcion Karcrack   : 3030 ms
Funcion *PsYkE1* : 3840 ms
Funcion Cobein      : 4260 ms

Decirme vuestra opinion! ;)


« Última modificación: 9 Julio 2010, 17:11 pm por *PsYkE1* » En línea

Dreamaker

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #22 en: 9 Julio 2010, 17:37 pm »

Apropósito si que me quedó una duda, como se fijan el tiempo que tarda en resolverlo exactamente cada función? (Como puso recién *PsYkE1*, eso me serviría para ver cuan eficientes son mis aplicaciones
« Última modificación: 9 Julio 2010, 17:38 pm por Dreamaker » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #23 en: 9 Julio 2010, 18:35 pm »

@PsYkE1: Debes comprobar la velocidad con el proyecto compilado, si no no es de fiar... por ejemplo, el codigo de Cobein era un poco mas rapido que el mio cuando lo prove...

Para hacer tu codigo mas rapido deberias hacer la comprobacion trabajando con los bits... voy a ver si puedo hacer algo sin pasarlo a String... que eso consume mucho

MOD:
Tu codigo falla con el 2 y el 5, que son primos y devuelve False ;)

MOD2:
Acabo de hacer los Test de Velocidad:
  • Karcrack: 1320ms
  • Cobein: 1330ms
  • Psyke: 2360ms
He hecho la prueba con un ciclo desde el 3 a 10^6  :D

Código:
Option Explicit
Private n       As Long

Private Sub Form_Load()
    Dim x       As Long
   
    Timer1.Interval = 10
   
    Timer1.Enabled = True
    For x = 3 To 10 ^ 6
        Call IsItPrime(x)
        DoEvents
    Next x
    Timer1.Enabled = False
    MsgBox n * 10 & " ms" & " KARCRACK"
    n = 0
   
    Timer1.Enabled = True
    For x = 3 To 10 ^ 6
        Call CheckPrimality(x)
        DoEvents
    Next x
    Timer1.Enabled = False
    MsgBox n * 10 & " ms" & " COBEIN"
    n = 0
   
    Timer1.Enabled = True
    For x = 3 To 10 ^ 6
        Call Check_Prime_Number(x)
        DoEvents
    Next x
    Timer1.Enabled = False
    MsgBox n * 10 & " ms" & " Psyke"
    n = 0
End Sub

Public Function Check_Prime_Number(ByVal lNumber As Long) As Boolean
    Const sPrimeDigit            As String = "1379"
    Dim sLastDigit               As String * 1
    Dim sNumber                  As String
    Dim x                        As Long
 
    If (lNumber > 2) Then
        sNumber = Str$(lNumber)
        sLastDigit = Right$(sNumber, 1)
        If InStr(sPrimeDigit, sLastDigit) > 0 Then
            For x = 3 To Sqr(lNumber) Step 2
                If (lNumber Mod x) = 0 Then Exit Function
            Next
            Check_Prime_Number = True
        End If
    End If
End Function

Private Function CheckPrimality(ByVal lNum As Long) As Boolean
    Dim i       As Long
    Dim lSqr    As Long
       
    If lNum Mod 2 = 0 Then GoTo Composite:

    lSqr = Sqr(lNum)

    i = 3
    Do Until i > lSqr
        If lNum Mod i = 0 Then GoTo Composite:
        i = i + 2
    Loop
   
Prime:
    CheckPrimality = True
    Exit Function
Composite:
    If lNum = 2 Then CheckPrimality = True
End Function

Public Function IsItPrime(ByVal lNumber As Long) As Boolean
    Dim i       As Long
 
    If (lNumber >= 2) And (lNumber And 1) Or (lNumber = 2) Then
        For i = 3 To Sqr(lNumber) Step 2
            If (lNumber Mod i) = 0 Then Exit Function
        Next i
        IsItPrime = True
    End If
End Function

Private Sub Timer1_Timer()
    n = n + 1
End Sub

S2 ;)
« Última modificación: 9 Julio 2010, 18:52 pm por Karcrack » En línea

raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #24 en: 9 Julio 2010, 19:39 pm »

Karcrack, seria mas exacto si usaras GetTickCount ;-D
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #25 en: 9 Julio 2010, 19:41 pm »

Karcrack, seria mas exacto si usaras GetTickCount ;-D
Simplemente queremos ver quien es mas rapido, tampoco necesitamos mas precision, si la necesitasemos usaria QueryPerformanceCounter ;)
En línea

cobein


Desconectado Desconectado

Mensajes: 759



Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #26 en: 9 Julio 2010, 20:10 pm »

Código:
Private Function CheckPrimality(ByVal lNum As Long) As Boolean
    Dim i       As Long

    If lNum < 10 Then
        If lNum = 2 Then CheckPrimality = True: Exit Function
        If lNum = 5 Then CheckPrimality = True: Exit Function
        If lNum = 1 Then Exit Function
    End If
    
    If Not (lNum And 1) = 1 Then Exit Function
    If (lNum And 5) = 5 Then Exit Function
    For i = 3 To Sqr(lNum) Step 2
        If lNum Mod i = 0 Then Exit Function
    Next
    CheckPrimality = True
End Function

Test project: http://uploading.com/files/c72amae6/Prime.rar/
No estoy seguro si la clase para testear la velocidad esta en la descarga, si no esta la pueden descargar de aca http://www.xbeat.net/vbspeed/download/CTiming.zip
« Última modificación: 9 Julio 2010, 20:23 pm por cobein » En línea

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #27 en: 9 Julio 2010, 20:29 pm »

uuuu vuela la ultima, es casi la mitad de la primera que posteaste al principio.

y si lo del timer para medir la velocidad mm no es de fiar mas que nada por el doevents mejor usar  GetTickCount o QueryPerformanceCounter.
En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #28 en: 9 Julio 2010, 20:52 pm »

Código
  1. Private Function CheckPrimality(ByVal lNum As Long) As Boolean
  2.    Dim i       As Long
  3.  
  4.    If lNum < 10 Then
  5.        If lNum = 2 Then CheckPrimality = True: Exit Function
  6.        If lNum = 5 Then CheckPrimality = True: Exit Function
  7.        If lNum = 1 Then Exit Function
  8.    End If
  9.  
  10.    If Not (lNum And 1) = 1 Then Exit Function
  11.    If (lNum And 5) = 5 Then Exit Function
  12.    For i = 3 To Sqr(lNum) Step 2
  13.        If lNum Mod i = 0 Then Exit Function
  14.    Next
  15.    CheckPrimality = True
  16. End Function
Interesante linea... con eso se puede comprobar si es multiple de 5? No acabo de entender como funciona... voy a jugar un poco con los Bits...

Pues eso, Cobein vence :P A no ser que alguien encuentre una forma de calcular la multiplicidad mas rapida que con Mod  :laugh: :laugh:

Felicidades, fue divertido :P Habran mas de estos seguro >:D :xD
« Última modificación: 9 Julio 2010, 20:54 pm por Karcrack » En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: [SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo
« Respuesta #29 en: 9 Julio 2010, 21:14 pm »

Ok, lo siento por las medidas, quizas hice algo mal sin darme cuenta...  :-\
Tengo curiosidad a ver como lo haces Karcrack  :), me gustan este tipo de retos, aprendo mucho y salen diferentes manera de hacer las cosas... :P

Salu2! ;)
En línea

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

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines