Anuncio

Colapsar
No hay ningún anuncio todavía.

Software para crear números primos

Colapsar
X
 
  • Filtro
  • Hora
  • Mostrar
Borrar todo
nuevos mensajes

  • u_maligno
    ha respondido
    Re: Software para crear números primos

    Ok, gracias a los dos. Yo como veía que Maq77 iba descartando cada vez más múltiplos de primos (2,3,5..) pensé que igual sería mejor usar directamente la criba de Eratostenes Pero vaya no sabía que había ese problema con números grandes, la verdad que ni idea de Visual Basic, ni casi de programación en general (hice algo de Pascal hace años pero ya ni me acuerdo )

    Salu2

    Dejar un comentario:


  • Avatar del visitante
    Respuesta de visistante
    Re: Software para crear números primos

    Revisa información de "El Guille" "Visual Basic" aritmética con números grandes en google, el encontró la manera de trabajar con números de cualquier cantidad de cifras, yo multipliqúe con su programa dos números de 400 cifras cada uno, y lo modifiqué para que me diera el factorial de practicamente cualquier "n".

    De verdad que no tiene desperdicio:

    http://www.elguille.info/NET/dotnet/...andes1.htm#vb6


    http://www.elguille.info/NET/dotnet/...rosGrandes.htm


    Se puede modificar y adaptar para la búsqueda de números primos muy grandes.

    Saludos.
    Última edición por Maq77; 23/10/2018, 02:41:54. Motivo: Agregar Información

    Dejar un comentario:


  • Richard R Richard
    ha respondido
    Re: Software para crear números primos

    Escrito por u_maligno Ver mensaje
    No entiendo mucho de programación, pero no sería más eficiente usar la criba de Eratóstenes? https://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes
    Quizá para un número bajo de primos si sea más eficiente, pues requiere que precargues los naturales para ir desechando los divisibles En cambio el programa que hice casi no tiene limite en la cantidad de cifras que debe tener el número primo.
    Yo construí el algoritmo explorando todos los naturales, pero la opción de maq77, acelera el proceso ya que evita un par de loops y preguntas, además tiene un numero de corte lógico, que acelera la búsqueda. Ya veré que puedo mejorar del código.
    Si los números naturales se los guarda en variables numéricas o variant, llegara el punto donde se exceda el limite admitido por la variable mucho mas rápido, que si es un string, que puede contener cifras para el primo...luego se convierte en un problema de eficiencia ya que el siguiente primo tarda por lo general mas tiempo que el anterior.

    Incluso hilando fino algunos cálculos de mi programa deben hacerse de otro modo, pues usan variables numéricas. Las divisiones y multiplicaciones deben hacerse entre strings de datos
    Última edición por Richard R Richard; 23/10/2018, 00:30:52.

    Dejar un comentario:


  • u_maligno
    ha respondido
    Re: Software para crear números primos

    No entiendo mucho de programación, pero no sería más eficiente usar la criba de Eratóstenes? https://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes

    Salu2

    Dejar un comentario:


  • Avatar del visitante
    Respuesta de visistante
    Re: Software para crear números primos

    Por acá más o menos lo mismo:

    Haz clic en la imagen para ampliar

Nombre:	CalculaPrimos.png
Vitas:	1
Tamaño:	14,9 KB
ID:	304276

    El Código

    Código:
    '****************************************************************************************
    '* PROYECTO      : CALCULA PRIMOS
    '* CONTENIDO     : PERMITE CALCULAR NÚMEROS PRIMOS
    '* VERSION       : 1.1
    '* AUTORES       : MIGUEL QUINTEIRO PIÑERO / MIGUEL QUINTEIRO FERNANDEZ
    '* INICIO        : 16 DE JUNIO DE 2013
    '* ACTUALIZACION : 16 DE JUNIO DE 2013
    '****************************************************************************************
    Option Explicit
    
    Dim miNumero As Currency
    Dim miRaizEntera As Currency
    Dim miResto As Integer
    Dim miPrueba As Currency
    Dim miDivisor As Currency
    Dim miIndice As Long
    
    Private Sub cmdCalculaPrimo_Click()
        lstPrimos.Clear
        lstPrimos.AddItem 2
        lstPrimos.AddItem 3
        miNumero = Val(txtMeta)
        For miPrueba = 3 To miNumero Step 2
            miRaizEntera = Int(Sqr(miPrueba))
            For miIndice = 1 To (lstPrimos.ListCount - 1)
                lstPrimos.ListIndex = miIndice
                miDivisor = Val(lstPrimos.Text)
                If miDivisor > miRaizEntera Then
                    lstPrimos.AddItem miPrueba
                    miIndice = lstPrimos.ListCount - 1
                Else
                    miResto = miPrueba Mod miDivisor
                    If miResto = 0 Then
                        miIndice = lstPrimos.ListCount - 1
                    End If
                End If
            Next miIndice
        Next miPrueba
    End Sub
    Saludos.

    - - - Actualizado - - -

    El programa detecta primos bastante rápido ya que evita la mayor cantidad de cuentas innecesarias.

    El ciclo de busqueda solo recorre a los números impares, y solo los divide entre los primos menores a la raiz cuadrada del buscado.

    Sigo buscando la forma de optimizarlo aun más.

    Saludos.

    - - - Actualizado - - -

    Para posibles optimizaciones al programa estaba pensando en incluir dos funciones que realicen las siguientes tareas:

    a) Detectar si el número a estudiar termina en 5: Al principio haría más lento al programa, pero a la larga sería bueno descartar a estos valores muy grandes finalizados en "5" sin dividirlos entre todos los primos anteriores a su raiz cuadrada.

    b) Suma de los dígitos del número a estudiar para ver si es multiplo de 3: De la misma forma que antes, para valores pequeños haría mas lento el programa, pero para valores muy grandes creo que sería menos costoso computacionalmente sumar los dígitos internos del valor que tratar de descartarlo por la vía de las divisiones sucesivas.

    Esto con la finalidad de poder trabajar con números realmente grandes, en periodos cada vez más cortos.

    Saludos.

    Dejar un comentario:


  • Richard R Richard
    ha empezado un hilo Otros Software para crear números primos

    Software para crear números primos

    Hola aqui les dejo el codigo de un pequeño programa, que crea todos los números primos que deseen, esta basado en visual basic 6 y solo lleva un un formulario con estos controles

    Haz clic en la imagen para ampliar

Nombre:	form primo.png
Vitas:	1
Tamaño:	4,8 KB
ID:	315092

    el formulario debe ser a pantalla completa para poder graficar en él.
    Crea los números tratandolos como texto, y prueba que son primos, dividiéndolos por los primos anteriores, aquel que en todas las divisiones cree resto distinto de 0 serpa el siguiente primo.
    Los números creados son guardados en un archivo de texto plano, que debe crearse primero en la ubicación que se desea y solo colocar como dato el número 2, lo adjunto por las dudas y lo copian a la carpeta con la ruta que especifiquen.
    En 2 horas de trabajo logre tener los números primos hasta el millón, lógicamente el proceso se ralentiza cada vez más para números mayores.

    Código:
    Public Num As StringPublic Cant As Single
    Public Ban As Integer
    
    
    Private Sub Command1_Click()
    Dim Gap(100001) As Double
    Open Text1.Text For Input As #4
    ant = "1"
    While Not EOF(4)
        Line Input #4, primo
        Num = primo
        gaps = primo - ant
       Gap(CSng(gaps)) = Gap(CSng(gaps)) + 1
       ant = primo
    Wend
    Close #4
    For x = 2 To 100000 Step 2
    If Gap(x) > 0 Then
    ngap = x
    End If
    If Maxgap <= Gap(x) Then
    Maxgap = Gap(x)
    End If
    Next
    
    
    inix = 10000
    iniy = 10000
    gapant = Gap(2)
    a = 4
    Do Until a > ngap
    Line (inix + (a - 2) * 10000 / ngap, iniy - 10000 * gapant / Maxgap)-(inix + a * 10000 / ngap, iniy - 10000 * Gap(a) / Maxgap), &H0&
    Line (inix + (a - 2) * 10000 / ngap, iniy - 10000 * gapant * (a - 2) / 100000)-(inix + a * 10000 / ngap, iniy - 10000 * Gap(a) * a / 100000), &HFF&
    gapant = Gap(a)
    a = a + 2
    Loop
    
    
    End Sub
    
    
    Private Sub Command3_Click()
    Open Text1.Text For Input As #1
    While Not EOF(1)
        Line Input #1, primo
        Num = primo
        Numero.Text = Num
    Wend
    Close #1
    Cant = 0
    
    
    Do While Cant < CSng(cnt.Text)
        Ban = 0
        ln = Len(Num)
        
    ' leo un dato
        Open Text1.Text For Input As #2
        While Not EOF(2)
            Line Input #2, primo
            lp = Len(primo)
            
            If Divide(Num, primo) Then
                Ban = Ban + 1
                Close #2
                GoTo 1
            End If
        Wend
        Close #2
        If Ban = 0 And Num <> 2 Then
            Open Text1.Text For Append As #3  'Crear el archivo plano
            Print #3, Num
            
            
            Close #3
            If Cant / 10 = Int(Cant / 10) Then
            Numero.Text = Num
            Numero.Refresh
            End If
            Cant = Cant + 1
        End If
    1    a = 0
        Do Until a = ln
            x = Mid(Num, ln - a, 1)
            sig = CInt(x) + 1
            If sig = 10 Then
                If a = ln - 1 Then
                    Num = "10" & Right(Num, ln - 1)
                Else
                    Num = Left(Num, ln - a - 1) & "0" & Right(Num, a)
                End If
                a = a + 1
            Else
                If a = 0 Then
                    Num = Left(Num, ln - a - 1) & sig
                Else
                    Num = Left(Num, ln - a - 1) & sig & Right(Num, a)
                End If
                Exit Do
            End If
        Loop
    Loop
    MsgBox ("TERMINO")
    End Sub
    Public Function Divide(a, B) As Boolean
    ln = Len(a)
    lp = Len(B)
    If CSng(Left(a, 1)) < CSng(Left(B, 1)) Then
    uso = Len(B) + 1
    Else
    uso = Len(B)
    End If
    parte = Mid(a, 1, uso)
    n = 0
    Do Until n > Len(a) - uso
        E = Int(CSng(parte) / CSng(B))
        r = CSng(parte) - CSng(B) * E
        If n = Len(a) - uso Then
            If r = 0 Then
               Divide = True
               Exit Function
            Else
               Divide = False
               Exit Function
            End If
        End If
        parte = CStr(10 * r + CSng(Mid(a, n + uso + 1, 1)))
        n = n + 1
    Loop
    End Function
    Tambien les dejo el adjunto del programa compilado ejecutable comprimido
    Archivos adjuntos

Contenido relacionado

Colapsar

Trabajando...
X