Ver Mensaje Individual
  #39  
Antiguo 22-10-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Victor Luis,

Cita:
Empezado por Victor Luis
...este tiempo es constante en cada búsqueda del limite de 2.147.483.615 y por qué usan esta cantidad...
Cita:
Empezado por Victor Luis
...no encuentro las funciones...Erase para inicializar un array...los Exponentes...redondear...archivos...
Cita:
Empezado por Victor Luis
...estoy analizando un método de Factorización para evaluar si un numero grande es primo o no...
Te comento:

1- El tiempo de generación de números primos nunca es constante en ningún algoritmo, varia en función de la carga del computador a nivel de recursos, pero en general se mantiene con pocas variaciones. El limite de 2.147.483.615 esta fijado en función de la clase TBits, la cual tiene como tamaño máximo dicho límite, algo similar ocurre con los arrays en Delphi y C#.

2- En lo referente a las funciones equivalentes entre VB6 y Delphi 7 te sugiero revisar este link:
Cita:
Delphi Basics : http://www.delphibasics.co.uk/
3- Los métodos de factorización y primalidad no son adecuados para ser incluidos en un generador de números primos, dado que los tiempos se incrementarían notablemente, como ejemplo de un método de primalidad incluyo el de Miller-Rabin realizado en C# por tener el tipo BigInteger el cual facilita el uso de números enteros de gran tamaño, adecuado para su uso en algoritmos de números primos:
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Security.Cryptography;
using System.Windows.Forms;

namespace MillerRabin
{
    class Program
    {

        static bool IsProbablePrime(BigInteger source)
        {
            int certainty = 10;
            if (source == 2 || source == 3)
                return true;
            if (source < 2 || source % 2 == 0)
                return false;

            BigInteger d = source - 1;
            int s = 0;

            while (d % 2 == 0)
            {
                d /= 2;
                s += 1;
            }

            RandomNumberGenerator rng = RandomNumberGenerator.Create();
            byte[] bytes = new byte[source.ToByteArray().LongLength];
            BigInteger a;

            for (int i = 0; i < certainty; i++)
            {
                do
                {
                    rng.GetBytes(bytes);
                    a = new BigInteger(bytes);
                }
                while (a < 2 || a >= source - 2);

                BigInteger x = BigInteger.ModPow(a, d, source);
                if (x == 1 || x == source - 1)
                    continue;

                for (int r = 1; r < s; r++)
                {
                    x = BigInteger.ModPow(x, 2, source);
                    if (x == 1)
                        return false;
                    if (x == source - 1)
                        break;
                }

                if (x != source - 1)
                    return false;
            }

            return true;
        }

        static void Main(string[] args)
        {
            
            BigInteger Number;
            String AuxNumber;

            do
            {
               AuxNumber = Microsoft.VisualBasic.Interaction.InputBox("Número a Verificar Primalidad", 
                                                                       "Test de Primalidad MillerRabin", "");
               BigInteger.TryParse(AuxNumber, out Number);
               if (IsProbablePrime(Number))
                   MessageBox.Show("Es un Número Primo", "Test de Primalidad MillerRabin", 
                                   MessageBoxButtons.OK, MessageBoxIcon.Information);
               else if (AuxNumber != "")
                   MessageBox.Show("Es un Número Compuesto", "Test de Primalidad MillerRabin", 
                                   MessageBoxButtons.OK, MessageBoxIcon.Information);
            } while (AuxNumber != "");
            
        }
    }
}
El código anterior en C#, permite verificar la primalidad de un número por medio del algoritmo Miller-Rabin aplicado 10 veces por cada Primo Probable, a fin de garantizar su confiabilidad. Estoy revisando librerías que me permitan manejar grandes números enteros para trasladar el código a Delphi.

Pregunto: ¿Podrías explicar como manejas números enteros de 18 y 24 dígitos en VB6?

Espero sea útil

Nelson.

Última edición por Casimiro Noteví fecha: 23-10-2013 a las 10:40:10.
Responder Con Cita