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
Anuncio
Colapsar
No hay ningún anuncio todavía.
Software para crear números primos
Colapsar
X
-
Respuesta de visistanteRe: 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.
- 2 gracias
Dejar un comentario:
-
Re: Software para crear números primos
Escrito por u_maligno Ver mensajeNo 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
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.
- 1 gracias
Dejar un comentario:
-
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:
-
Respuesta de visistanteRe: Software para crear números primos
Por acá más o menos lo mismo:
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
- - - 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.
- 2 gracias
Dejar un comentario:
-
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
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
Archivos adjuntos
Contenido relacionado
Colapsar
Dejar un comentario: