[SNIPPET+RETO] IsItPrime() - Comprobar si un numero es primo

Iniciado por Karcrack, 7 Julio 2010, 12:31 PM

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

Karcrack

Bueno, me hacia falta hacer una funcion de este tipo para un trabajito que estoy haciendo :silbar:... y he pensado que tal vez os seria util...
Código (vb) [Seleccionar]
Public Function IsItPrime(ByVal lNumber As Long) As Boolean
   Dim i       As Long
   
   If (lNumber > 2) And (lNumber Mod 2) Or (lNumber = 2) Then
       For i = 2 To (lNumber ^ 0.5)
           If (lNumber Mod i) = 0 Then
               GoTo Exit_
           End If
       Next i
       IsItPrime = True
   End If
Exit_:
End Function


Podriamos hacer un jueguecito... a ver quien lo hace mas rapido/corto :D Os apuntais?

MOD: Yo utilizo este codigo para comprobar lo optimizado que esta:
Option Explicit

Private n       As Long

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

Public Function IsItPrime(ByVal lNumber As Long) As Boolean
   Dim i       As Long
   
   If (lNumber > 2) And (lNumber Mod 2) Or (lNumber = 2) Then
       For i = 2 To (lNumber ^ 0.5)
           If (lNumber Mod i) = 0 Then
               GoTo Exit_
           End If
       Next i
       IsItPrime = True
   End If
Exit_:
End Function

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

cbug

If (lNumber > 2) And (lNumber Mod 2) Then

Al 2 lo evalúas?

Ahora en visual basic se puede modificar el long para que únicamente tome los enteros positivos?

Karcrack

#2
Cita de: cbug en  7 Julio 2010, 12:45 PM
If (lNumber > 2) And (lNumber Mod 2) Then

Al 2 lo evalúas?

Ahora en visual basic se puede modificar el long para que únicamente tome los enteros positivos?
Cierto, habia olvidado que el 2 tambien es primo :laugh: ;) (Ahora lo corrijo Correjido ;))

Se puede utilizar un Integer, aunque tambien acepta Negativos... Pero solo enteros :-\

cbug

CitarSe puede utilizar un Integer, aunque tambien acepta Negativos... Pero solo enteros

:-\ Claro, porque de acuerdo a la definición, los números primos son aquellos números naturales que...

Pero igual, tu código creo que es el más eficiente en cuanto a complejidad, no sé cómo se tratará el goto en vb realmente... sin embargo, creo que se parece mucho al de la criba de eratóstenes...

Saludos!

Dreamaker

Me quedó una duda, en el primer for lo haces hasta la raíz cuadrada del número para que sea más eficiente cierto? (Osea, tarde menos tiempo)

Está bien aunque es sencillo, y no comprueba si el 1 es primo o no (no digas nada) :xD

Karcrack

Cita de: cbug en  7 Julio 2010, 12:58 PM
CitarSe puede utilizar un Integer, aunque tambien acepta Negativos... Pero solo enteros

:-\ Claro, porque de acuerdo a la definición, los números primos son aquellos números naturales que...

Pero igual, tu código creo que es el más eficiente en cuanto a complejidad, no sé cómo se tratará el goto en vb realmente... sin embargo, creo que se parece mucho al de la criba de eratóstenes...

Saludos!
He pensado en usar la criba de Eratostenes pero es mas para generar una lista de primos, solo quiero comprobar si un número lo es :D


Cita de: Dreamaker en  7 Julio 2010, 13:00 PM
Me quedó una duda, en el primer for lo haces hasta la raíz cuadrada del número para que sea más eficiente cierto? (Osea, tarde menos tiempo)

Está bien aunque es sencillo, y no comprueba si el 1 es primo o no (no digas nada) :xD
No es necesario recorrer cada numero, con llegar a la raiz es suficiente :) No dire nada sobre el 1 :rolleyes: :xD

Psyke1

#6
Código (vb) [Seleccionar]

'0 ---> Invalido
'1 ---> No Primo
'2 ---> Primo
Option Explicit
Private Function Check_Prime_Number(ByVal lNumber As Long) As Byte
   Dim x            As Long
   If lNumber >= 2 Then
       Check_Prime_Number = 2
       For x = 2 To (lNumber ^ 0.5)
           If (lNumber Mod x) = 0 Then
               Check_Prime_Number = 1
               Exit For
           End If
       Next
   End If
End Function

Karcrack

@Psyke: Tu función es mucho mas lenta, ademas, no tiene en cuenta que el 2 es primo (como hacia la mia :rolleyes: :xD)
No es necesario que recorras todos los números, con llegar a la raiz es suficiente ;)

Psyke1

Ok, agradezco la correcion, lo no tuve en cuenta :P
Ahora lo corregi!

Salu2! ;)

cobein

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
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.