Anuncio

Colapsar
No hay ningún anuncio todavía.

Software para crear números primos

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

  • Otros 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

  • #2
    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.

    Comentario


    • #3
      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

      Comentario


      • #4
        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, 01:30:52.

        Comentario


        • #5
          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, 03:41:54. Motivo: Agregar Información

          Comentario


          • #6
            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

            Comentario


            • #7
              Re: Software para crear números primos

              He corregido el codigo, en base a las premisas de maq77, logre los primos hasta el millon en 5 minutos..... una hora 55 minutos menos que antes

              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
                      If lp * 2 - 1 > ln Then
                          Close #2
                          GoTo 2
                      End If
                  Wend
                  Close #2
              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)
                      If x = 2 And ln = 1 Then
                      sig = CInt(x) + 1
                      ElseIf A = 0 Then
                      sig = CInt(x) + 2
                      Else
                      sig = CInt(x) + 1
                      End If
                      If sig = 11 Or sig = 10 Then
                          If ln = 1 Then
                          Num = 11
                          Else
                              If A = ln - 1 Then
                                  Num = "10" & Right(Num, ln - 1)
                              Else
                                  Num = Left(Num, ln - A - 1) & Right(CStr(sig), 1) & Right(Num, A)
                              End If
                              
                          End If
                          A = A + 1
                      Else
                          If A = 0 Then
                              Num = Left(Num, ln - A - 1) & sig
                          Else
                              Num = Left(Num, ln - A - 1) & Right(CStr(sig), 1) & Right(Num, A)
                          End If
                          Exit Do
                      End If
                  Loop
              Loop
              MsgBox ("TERMINO")
              End Sub
              
              
              Public Function Divide(C, D) As Boolean
              ln = Len(C)
              lp = Len(D)
              If CSng(Left(C, 1)) < CSng(Left(D, 1)) Then
              uso = Len(D) + 1
              Else
              uso = Len(D)
              End If
              parte = Mid(C, 1, uso)
              n = 0
              Do Until n > Len(C) - uso
                  E = Int(CSng(parte) / CSng(D))
                  r = CSng(parte) - CSng(D) * E
                  If n = Len(C) - 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(C, n + uso + 1, 1)))
                  n = n + 1
              Loop
              End Function

              Coloque limite los cálculos en vez de debajo de la raíz de Num , como en este soft el numero es un string de texto , lo hice limitando la longitud de los numeros que estan por arriba de la raiz de Num
              y cargando siempre impares en el algoritmo de detección
              Última edición por Richard R Richard; 26/10/2018, 05:34:08.

              Comentario


              • #8
                Re: Software para crear números primos

                Hola Richard, podrías comprobar una cosa? La conjetura de Legendre afirma que existe al menos un primo entre n^2 y (n+1)^2 (entre cuadrados consecutivos vaya), no te voy a pedir que compruebes esto ya que si aún es conjetura será porque nadie a conseguido encontrar un contraejemplo pero, podrías ver si se cumple también entre (x^2 + x)/2 y ((x+1)^2 + (x+1))/2 (entre sumatoria de naturales en vez de cuadrados)?

                Si no es mucho lío eh, es para darle algo de vidilla al programa (vale, y por curiosidad morbosa )

                Salu2

                Comentario


                • #9
                  Re: Software para crear números primos

                  Bueno , también hay otras conjeturas con que siempre hay un primo entre n y 2n inclusive, y entre 2n y 3n...algo mas difícil que no hay gaps de tamaño n hasta mas allá de n^2...

                  Se les ocurre alguna mas, para validar/ refutar empíricamente?

                  Lo que tengo que hacer esjar correr el programa al menos hasta el100000000 o 1000000000 para tener números y tiempos de pc dentro de lo posibles normales, cuando tenga la tabla de primos se las comparto
                  Última edición por Richard R Richard; 26/10/2018, 11:51:20.

                  Comentario


                  • #10
                    Re: Software para crear números primos

                    Al parecer eso ya no es conjetura sino postulado https://es.wikipedia.org/wiki/Postulado_de_Bertrand Pero ahora me haces dudar, no acabo de entender por qué la de Legendre (o incluso la que puse yo) sigue siendo conjetura si crece más rápidamente.. xD

                    Supongo que lo interesante sería encontrar alguna que se pudiera refutar, y no las que ya se han comprobado hasta números gigantescos jeje

                    Salu2

                    Perdón, me lié entre postulado y teorema. Ni caso a lo primero que dije

                    Segundo perdón, en realidad no me lié, releyendo veo que al final sí es teorema. Así que ya no entiendo nada xD
                    Última edición por u_maligno; 26/10/2018, 15:07:41.

                    Comentario


                    • #11
                      Re: Software para crear números primos

                      Escrito por Richard R Richard Ver mensaje
                      He corregido el codigo, en base a las premisas de maq77, logre los primos hasta el millon en 5 minutos..... una hora 55 minutos menos que antes

                      ....

                      Coloque limite los cálculos en vez de debajo de la raíz de Num , como en este soft el numero es un string de texto , lo hice limitando la longitud de los numeros que estan por arriba de la raiz de Num y cargando siempre impares en el algoritmo de detección

                      ¡Qué bueno haberte servido para algo!

                      Por acá dos enlaces en los que se tienen ejemplos de códigos en diversos lenguajes de programación para el estudio y determinación de los numeros primos.

                      La parte del código en VBA es aplicable perfectamente en VB6

                      https://rosettacode.org/wiki/Category:Prime_Numbers

                      https://rosettacode.org/wiki/Primali...l_division#VBA


                      También existen en línea bibliotecas de archivos con una gran cantidad de números primos, por ejemplo en:

                      https://numerosprimos.org/numeros-pr...e-1-a-1000000/

                      Ya podemos encontrar el listado de los números primos menores al 1.000.000


                      Es por eso que yo había enfocado el esfuerzo en encontrar un "Mejor Algoritmo" y no en un listado como tal, que ya hay muchos, es más encarar el asunto desde el punto de vista de "P Vs NP", y buscar un algoritmo que realmente baje el grado de complejidad de la tarea de determinar cual número es primo y cual no lo es.

                      Al final, todos los métodos y algoritmos terminan siendo solo una Criba, algunas más sofisticadas y eficientes que otras, la idea es inventar o descubrir cual es la mejor de todas, la que consume menos recursos computacionales y de tiempo.

                      Comentario


                      • #12
                        Re: Software para crear números primos

                        Escrito por u_maligno Ver mensaje
                        Al parecer eso ya no es conjetura sino postulado https://es.wikipedia.org/wiki/Postulado_de_Bertrand ...
                        No, no es un postulado, se le conoce con el nombre incorrecto de "postulado de Bertrand" por motivos históricos: Bertrand lo "postuló" en 1845, (hoy diríamos con más propiedad "lo conjeturó") y no fue capaz de demostrarlo. Su nombre matemáticamente correcto es "Teorema de Bertrand–Chebyshev" como yo lo nombré aquí: http://forum.lawebdefisica.com/threa...900#post185900

                        Este teorema fue demostrado por Chebyshev en 1850.

                        Saludos.
                        Última edición por Alriga; 26/10/2018, 16:50:40. Motivo: Lapsus numérico
                        "Das ist nicht nur nicht richtig, es ist nicht einmal falsch! "

                        Comentario


                        • #13
                          Re: Software para crear números primos

                          Gracias Alriga, justo hace un rato volví a editar, en el mismo enlace que puse lo pone pero me confundí por el título. Voy a leer un poco más sobre el tema a ver si me aclaro, porque ahora mismo no entiendo que eso no demuestre también la conjetura de Legendre (algo se me debe de estar escapando )

                          Salu2

                          - - - Actualizado - - -

                          Vale, ya lo entiendo. En realidad n^2 - (n+1)^2 es siempre menor que n^2 - 2n^2 para n > 2. xD
                          Última edición por u_maligno; 26/10/2018, 16:00:26.

                          Comentario


                          • #14
                            Re: Software para crear números primos

                            Escrito por Alriga Ver mensaje
                            Este teorema fue demostrado por Chebyshev en 1950.
                            En realidad, fue demostrado en 1852: Chebyshov murió en 1894.

                            Comentario


                            • #15
                              Re: Software para crear números primos

                              Por aca otra función que me da los números primos por debajo del 1.000.000 en menos de 10 segundos.

                              Código:
                              '****************************************************************************************
                              '* PROYECTO      : NUMEROS PRIMOS
                              '* CONTENIDO     : FUNCIONES GLOBALES
                              '* VERSION       : 1.1
                              '* AUTORES       : MIGUEL QUINTEIRO PIÑERO
                              '* INICIO        : 26 DE JULIO DE 2017
                              '* ACTUALIZACION : 26 DE JULIO DE 2017
                              '****************************************************************************************
                              
                              Module Funciones
                                  ' Función para determinar si un número es o no primo
                                  Public Function Primo(ByVal pN As Long) As Boolean
                                      Dim i As Long
                                      Primo = True
                                      If (pN = 1) Or ((pN / 2) = Int(pN / 2)) Then
                                          Primo = False
                                      Else
                                          For i = 3 To Math.Sqrt(pN) Step 2
                                              If (pN / i) = Int(pN / i) Then
                                                  Primo = False
                                                  i = pN
                                              End If
                                          Next
                                      End If
                                  End Function
                              End Module
                              Trabaja de manera ligeramente diferente a la antes vista en el sentido que no almacena los primos anteriores para luego utilizarlos, simplemente asigna como primo a cualquier número a comprobar, luego verifica que el número sea 1 o un multiplo exacto del 2, en cuyo caso dice que no es primo y termina, y si no verifica si tiene algun factor exacto entre los números impares inferiores a su raiz cuadrada, si lo tiene cambia a que el numero no es primo. Si logra terminar todos los ciclos sin encontrar factores exactos termina quedándose como un número primo.

                              Encuentra y señala a los 78.497 números primos por debajo del 1.000.000 en 5 segundos más o menos

                              Haz clic en la imagen para ampliar

Nombre:	NPrimos1000000.jpg
Vitas:	1
Tamaño:	61,1 KB
ID:	304284

                              Saludos.

                              Comentario

                              Contenido relacionado

                              Colapsar

                              Trabajando...
                              X