Nueva pregunta

Pregunta:

 
  1  
 
Fecha: 10-02-2019 16:37:06 (En Español)

Ayuda por favor[No resuelta]

Trato de imprimir los primeros 20 números primos esto es lo que llevo hasta al momento
<?php
$cont=0;

for($i=2;$i<=50;$i++)

{
for ($j=1; $j <=$i ; $j++) {
$cont=$cont+1;
}
}
if($cont<=2){
echo "<br>".$i;
}






?>

//no imprime nada si alguien me da una mano gracias
Etiquetas: MySQL - Pregunta Votos: 1 - Respuestas: 5 - Vistas: 14 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 10-02-2019 16:51:24 Hola

    Como recordatorio que un número primo es aquel que sólo tiene dos divisores, los cuales son la unidad, el 1, y el mismo número. Además el 1 tambien es considerado como un número primo.
    Te dejo un script para saber que numeros son primos, a partir de un rango de números.
    En el ejemplo es Desde el 1 hasta el 100

    <?php 
    $desde = 1; // Desde el numero 
    $hasta = 100;// Hasta el numero
    print 'Números primos del ';print $desde; print ' al '; print $hasta; 
    for ($i = $desde; $i <= $hasta; $i++) 
    { 
    $nDiv = 0; // Número de divisores 
    for ($n = 1; $n <= $i; $n++) // Desde 1 hasta el valor que tenga $i 
    { 
    if($i%$n == 0) // $n es un divisor de $i 
    { 
    $nDiv = $nDiv + 1; // Agregamos un divisor mas. 
    } 
    } 
    if($nDiv == 2 or $i == 1)// Si tiene 2 divisores o es 1 --> Es primo 
    { 
    print '<br>'; 
    print $i; 
    } 
    } 
    ?> 
    


    Resultado:

    Números primos del 1 al 100
    1
    2
    3
    5
    7
    11
    13
    17
    19
    23
    29
    31
    37
    41
    43
    47
    53
    59
    61
    67
    71
    73
    79
    83
    89
    97
    



    Espero que te sirva

    PD// pon un titulo descriptivo a tu pregunta por ej Como listar números primos

    Saludos
      Votos: 1 - Link respuesta
     
  • Fecha: 11-02-2019 09:07:59 Hola,
    La respuesta de Walter es buena pero tiene dos inconvenientes:
    1. La lista está mal pues 1 no es primo.
    2. Es sumamente ineficiente y lenta.

    El punto 1 es algo que puedes arreglar fácilmente y si el punto 2 no es inconveniente para ti entonces no hay más que hacer. Si el punto 2 es algo que te interese arreglar entonces contniua leyendo.

    En el caso del algoritmo anterior el tiempo de ejecución crece exponencialmente si aumentas el rango de valores. Para encontrar los números primos entre 1 y 100 le toma ~0.004 segundos pero para el caso de encontrar los primos entre 1 y 100,000 toma ~164 segundos

    Basado en la respuesta anterior hice algunos ajustes sencillos y el siguiente script, sin aplicar ninguna fórmula matemática, da la respuesta correcta y reduce el tiempo de ejecución a ~0.0002 segundos para los primos entre 1 y 100 y a ~2.5 segundos para encontrar los primos entre 1 y 100,000.
    He leído algoritmos matemáticos muy eficientes pero dado que no soy matemático pues únicamente puedo añadir condiciones de parado para disminuir la cantidad de veces que los ciclos se ejecutan e imprimir todo en un solo paso.

    OJO: Este algoritmo consume más memoria que el dado anteriormente así que con números muy grandes el proceso fallará. Se puede arreglar lo de la memoria y optimizar un poco más pero no tengo tiempo ahora mismo.

    Advertencia: Con un rango entre 1 y 1,000,000 te toca esperar varios minutos para que cualquiera de los algoritmos termine. Para el algoritmo anterior toma ~16811 segundos (casi 5 horas), para el algoritmo corregido son ~148 segundos (casi 3 minutos).

    <?php
    //Get prime numbers
    $from = 1;
    $to = 100000;
    
    $primes = [];
    
    for ($dividend = $from; $dividend <= $to; $dividend++) {
        $divisors = [];
        $divisorStart = 2;
        if ($primes) {
            foreach ($primes as $prime) {
                if ($dividend % $prime === 0) {
                    $divisors[] = $prime;
                    if (count($divisors) > 1) {
                        break;
                    }
                }
            }
            $divisorStart = $primes[count($primes) - 1];
        }
        if (count($divisors) < 1) {
            for ($divisor = $divisorStart; $divisor <= $dividend; $divisor++) {
                if ($dividend % $divisor === 0) {
                    $divisors[] = $divisor;
                    if (count($divisors) > 1) {
                        break;
                    }
                }
            }
        }
        if (count($divisors) === 1) {
            $primes[] = $dividend;
        }
    }
    
    echo implode('<br>', $primes) . PHP_EOL;
    


    Saludos!
      Votos: 1 - Link respuesta
     
  • Fecha: 12-02-2019 06:17:00 Mi grano de arena. Esta función sirve para números mayores que 3 (el número 1, por convenio no se considera primo ni compuesto. Los números 2 y 3 si son números primos):

    function esPrimo($numero) {
        if ($numero % 6 != 1 AND $numero % 6 != 5) {
            return FALSE;
        }
    
        $raiz = sqrt($numero);
        $i = 1;
        while ((6 * $i - 1) < $raiz) {
            if ($numero % (6 * $i - 1) == 0 OR $numero % (6 * $i + 1) == 0) {
                return FALSE;
            }
            $i++;
        }
        return TRUE;
    }
      Votos: 1 - Link respuesta
     
  • Fecha: 14-02-2019 05:35:10 Juan Vasquez tengo una duda en tu código.

    En el primer if, con ese AND, nunca entraría no? un mismo numero($numero) no puede dar dos restos diferentes si lo divides por el mismo numero, en tu caso 6. Según como está, se puede omitir y quitar código. Otra cosa sería si en vez del AND fuera un OR.
      Votos: 0 - Link respuesta
     
  • Fecha: 14-02-2019 16:56:35 Teketo Cero: tienes toda la razón, hay que sustituir el AND por OR. Gracias por la aclaración. El código arreglado es:

    function esPrimo($numero) {
        if ($numero % 6 != 1 OR $numero % 6 != 5) {
            return FALSE;
        }
    
        $raiz = sqrt($numero);
        $i = 1;
        while ((6 * $i - 1) < $raiz) {
            if ($numero % (6 * $i - 1) == 0 OR $numero % (6 * $i + 1) == 0) {
                return FALSE;
            }
            $i++;
        }
        return TRUE;
    }
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión