Primos circulares menores que n

Encuentra todos los números primos circulares menores que el número n dado. Un número primo es un número primo circular si todas sus rotaciones posibles son números primos.

Ejemplos: 

79 is a circular prime.
as 79 and 97 are prime numbers.

But 23 is not a circular prime.
as 23 is prime but 32 is not a prime number. 

Algoritmo: 

-> Find prime numbers up to n using Sieve of Sundaram algorithm.
-> Now for every prime number from sieve method,
  one after another, we should check whether its all
  rotations are prime or not:
   -> If yes then print that prime number.
   -> If no then skip that prime number.

A continuación se muestra la implementación del algoritmo anterior:

C++

// C++ program to print primes smaller than n using
// Sieve of Sundaram.
#include <bits/stdc++.h>
using namespace std;
 
// Prototypes of the methods used
void SieveOfSundaram(bool marked[], int);
int Rotate(int);
int countDigits(int);
 
// Print all circular primes
void circularPrime(int n)
{
    // In general Sieve of Sundaram, produces primes smaller
    // than (2*x + 2) for a number given number x.
    // Since we want primes smaller than n, we reduce n to half
    int nNew = (n - 2) / 2;
 
    // This array is used to separate numbers of the form i+j+2ij
    // from others where 1 <= i <= j
    bool marked[nNew + 1];
 
    // Initialize all elements as not marked
    memset(marked, false, sizeof(marked));
 
    SieveOfSundaram(marked, nNew);
 
    // if n > 2 then 2 is also a circular prime
    cout << "2 ";
 
    // According to Sieve of sundaram If marked[i] is false
    // then 2*i + 1 is a prime number.
 
    // loop to check all  prime numbers and their rotations
    for (int i = 1; i <= nNew; i++) {
        // Skip this number if not prime
        if (marked[i] == true)
            continue;
 
        int num = 2 * i + 1;
        num = Rotate(num); // function for rotation of prime
 
        // now we check for rotations of this prime number
        // if new rotation is prime check next rotation,
        // till new rotation becomes the actual prime number
        // and if new rotation if not prime then break
        while (num != 2 * i + 1) {
            if (num % 2 == 0) // check for even
                break;
 
            // if rotated number is prime then rotate
            // for next
            if (marked[(num - 1) / 2] == false)
                num = Rotate(num);
            else
                break;
        }
 
        // if checked number is circular prime print it
        if (num == (2 * i + 1))
            cout << num << " ";
    }
}
 
// Sieve of Sundaram for generating prime number
void SieveOfSundaram(bool marked[], int nNew)
{
    // Main logic of Sundaram. Mark all numbers of the
    // form i + j + 2ij as true where 1 <= i <= j
    for (int i = 1; i <= nNew; i++)
        for (int j = i; (i + j + 2 * i * j) <= nNew; j++)
            marked[i + j + 2 * i * j] = true;
}
 
// Rotate function to right rotate the number
int Rotate(int n)
{
    int rem = n % 10; // find unit place number
    rem *= pow(10, countDigits(n)); // to put unit place
    // number as first digit.
    n /= 10; // remove unit digit
    n += rem; // add first digit to rest
    return n;
}
 
// Function to find total number of digits
int countDigits(int n)
{
    int digit = 0;
    while (n /= 10)
        digit++;
    return digit;
}
 
// Driver program to test above
int main(void)
{
    int n = 100;
    circularPrime(n);
    return 0;
}

Java

// Java program to print primes smaller
// than n using Sieve of Sundaram.
import java.util.Arrays;
class GFG {
 
    // Print all circular primes
    static void circularPrime(int n)
    {
        // In general Sieve of Sundaram, produces
        // primes smaller than (2*x + 2) for a
        // number given number x.Since we want
        // primes smaller than n, we reduce n to half
        int nNew = (n - 2) / 2;
 
        // This array is used to separate numbers of the
        // form i+j+2ij from others where 1 <= i <= j
        boolean marked[] = new boolean[nNew + 1];
 
        // Initialize all elements as not marked
        Arrays.fill(marked, false);
 
        SieveOfSundaram(marked, nNew);
 
        // if n > 2 then 2 is also a circular prime
        System.out.print("2 ");
 
        // According to Sieve of sundaram If marked[i] is false
        // then 2*i + 1 is a prime number.
 
        // loop to check all prime numbers and their rotations
        for (int i = 1; i <= nNew; i++) {
            // Skip this number if not prime
            if (marked[i] == true)
                continue;
 
            int num = 2 * i + 1;
            num = Rotate(num); // function for rotation of prime
 
            // now we check for rotations of this prime number
            // if new rotation is prime check next rotation,
            // till new rotation becomes the actual prime number
            // and if new rotation if not prime then break
            while (num != 2 * i + 1) {
                if (num % 2 == 0) // check for even
                    break;
 
                // if rotated number is prime then rotate
                // for next
                if (marked[(num - 1) / 2] == false)
                    num = Rotate(num);
                else
                    break;
            }
 
            // if checked number is circular prime print it
            if (num == (2 * i + 1))
                System.out.print(num + " ");
        }
    }
 
    // Sieve of Sundaram for generating prime number
    static void SieveOfSundaram(boolean marked[], int nNew)
    {
        // Main logic of Sundaram. Mark all numbers of the
        // form i + j + 2ij as true where 1 <= i <= j
        for (int i = 1; i <= nNew; i++)
            for (int j = i; (i + j + 2 * i * j) <= nNew; j++)
                marked[i + j + 2 * i * j] = true;
    }
 
    // Function to find total number of digits
    static int countDigits(int n)
    {
        int digit = 0;
        while ((n /= 10) > 0)
            digit++;
        return digit;
    }
 
    // Rotate function to right rotate the number
    static int Rotate(int n)
    {
        int rem = n % 10; // find unit place number
        rem *= Math.pow(10, countDigits(n)); // to put unit place
        // number as first digit.
        n /= 10; // remove unit digit
        n += rem; // add first digit to rest
        return n;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int n = 100;
        circularPrime(n);
    }
}
// This code is contributed by Anant Agarwal.

Python3

# Python3 program to print primes smaller
# than n using Sieve of Sundaram.
 
# Print all circular primes
def circularPrime(n):
 
    # In general Sieve of Sundaram,
    # produces primes smaller than
    # (2*x + 2) for a number given
    # number x. Since we want primes
    # smaller than n, we reduce n to half
    nNew = (n - 2) // 2
  
    # This array is used to separate numbers
    # of the form i+j+2ij from others
    # where 1 <= i <= j
    marked = [False for i in range(nNew + 1)]
     
    SieveOfSundaram(marked, nNew)
  
    # If n > 2 then 2 is also a
    # circular prime
    print("2", end = ' ')
  
    # According to Sieve of sundaram
    # If marked[i] is false then
    # 2*i + 1 is a prime number.
  
    # Loop to check all  prime numbers
    # and their rotations
    for i in range(1, nNew + 1):
     
        # Skip this number if not prime
        if (marked[i] == True):
            continue;
  
        num = 2 * i + 1
         
        # Function for rotation of prime
        num = Rotate(num)
         
        # Now we check for rotations of this
        # prime number if new rotation is
        # prime check next rotation, till
        # new rotation becomes the actual
        # prime number and if new rotation
        # if not prime then break
        while (num != 2 * i + 1):
             
            # Check for even
            if (num % 2 == 0):
                break
  
            # If rotated number is prime
            # then rotate for next
            if (marked[(num - 1) // 2] == False):
                num = Rotate(num);
            else:
                break;
 
        # If checked number is circular
        # prime print it
        if (num == (2 * i + 1)):
            print(num, end = ' ')
 
# Sieve of Sundaram for generating
# prime number
def SieveOfSundaram(marked, nNew):
 
    # Main logic of Sundaram. Mark
    # all numbers of the form
    # i + j + 2ij as true where 1 <= i <= j
    for i in range(1, nNew + 1):
        j = i
        while (i + j + 2 * i * j) <= nNew:
            marked[i + j + 2 * i * j] = True
            j += 1
             
# Rotate function to right rotate
# the number
def Rotate(n):
     
    # Find unit place number
    rem = n % 10
     
    # To put unit place
    rem = rem * (10 ** (countDigits(n) - 1))
     
    # Number as first digit.
    n = n // 10 # Remove unit digit
    n += rem # Add first digit to rest
    return n
 
# Function to find total number of digits
def countDigits(n):
 
    digit = 0
     
    while n != 0:
        n = n // 10
        digit += 1
         
    return digit
 
# Driver code
if __name__=="__main__":
     
    n = 100
     
    circularPrime(n)
 
# This code is contributed by rutvik_56

C#

// C# program to print primes smaller
// than n using Sieve of Sundaram.
using System;
 
class GFG {
 
    // Print all circular primes
    static void circularPrime(int n)
    {
        // In general Sieve of Sundaram, produces
        // primes smaller than (2*x + 2) for a
        // number given number x.Since we want
        // primes smaller than n, we reduce n to half
        int nNew = (n - 2) / 2;
 
        // This array is used to separate numbers of the
        // form i+j+2ij from others where 1 <= i <= j
        bool[] marked = new bool[nNew + 1];
 
        // Initialize all elements as not marked
        // Arrays.fill(marked, false);
 
        SieveOfSundaram(marked, nNew);
 
        // if n > 2 then 2 is also a circular prime
        Console.Write("2 ");
 
        // According to Sieve of sundaram If
        // marked[i] is false then 2*i + 1 is a
        // prime number.
 
        // loop to check all prime numbers
        // and their rotations
        for (int i = 1; i <= nNew; i++) {
             
            // Skip this number if not prime
            if (marked[i] == true)
                continue;
 
            int num = 2 * i + 1;
             
            // function for rotation of prime
            num = Rotate(num);
 
            // now we check for rotations of this prime number
            // if new rotation is prime check next rotation,
            // till new rotation becomes the actual prime number
            // and if new rotation if not prime then break
            while (num != 2 * i + 1) {
                if (num % 2 == 0) // check for even
                    break;
 
                // if rotated number is prime
                // then rotate for next
                if (marked[(num - 1) / 2] == false)
                    num = Rotate(num);
                else
                    break;
            }
 
            // if checked number is circular prime print it
            if (num == (2 * i + 1))
                Console.Write(num + " ");
        }
    }
 
    // Sieve of Sundaram for generating prime number
    static void SieveOfSundaram(bool[] marked, int nNew)
    {
        // Main logic of Sundaram. Mark all numbers of the
        // form i + j + 2ij as true where 1 <= i <= j
        for (int i = 1; i <= nNew; i++)
            for (int j = i; (i + j + 2 * i * j) <= nNew; j++)
                marked[i + j + 2 * i * j] = true;
    }
 
    // Function to find total number of digits
    static int countDigits(int n)
    {
        int digit = 0;
        while ((n /= 10) > 0)
            digit++;
        return digit;
    }
 
    // Rotate function to right rotate the number
    static int Rotate(int n)
    {
        // find unit place number
        int rem = n % 10;
         
        // to put unit place
        rem *= (int)Math.Pow(10, countDigits(n));
         
        // number as first digit.
        n /= 10; // remove unit digit
        n += rem; // add first digit to rest
        return n;
    }
 
    // Driver code
    public static void Main()
    {
        int n = 100;
        circularPrime(n);
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// PHP program to print primes smaller than
// n using Sieve of Sundaram.
 
// Print all circular primes
function circularPrime($n)
{
    // In general Sieve of Sundaram, produces
    // primes smaller than (2*x + 2) for a number
    // given number x. Since we want primes smaller
    // than n, we reduce n to half
    $nNew = (int)(($n - 2) / 2);
 
    // This array is used to separate numbers of
    // the form i+j+2ij from others where 1 <= i <= j
    $marked = array_fill(0, $nNew + 1, false);
 
    SieveOfSundaram($marked, $nNew);
 
    // if n > 2 then 2 is also a circular prime
    print("2 ");
 
    // According to Sieve of sundaram If marked[i]
    // is false then 2*i + 1 is a prime number.
 
    // loop to check all prime numbers
    // and their rotations
    for ($i = 1; $i <= $nNew; $i++)
    {
        // Skip this number if not prime
        if ($marked[$i] == true)
            continue;
 
        $num = 2 * $i + 1;
        $num = Rotate($num); // function for rotation of prime
 
        // now we check for rotations of this
        // prime number if new rotation is prime
        // check next rotation, till new rotation
        // becomes the actual prime number and if
        // new rotation if not prime then break
        while ($num != 2 * $i + 1)
        {
            if ($num % 2 == 0) // check for even
                break;
 
            // if rotated number is prime then
            // rotate for next
            if ($marked[(int)(($num - 1) / 2)] == false)
                $num = Rotate($num);
            else
                break;
        }
 
        // if checked number is circular
        // prime print it
        if ($num == (2 * $i + 1))
            print($num." ");
    }
}
 
// Sieve of Sundaram for generating prime number
function SieveOfSundaram(&$marked, $nNew)
{
    // Main logic of Sundaram. Mark all numbers of the
    // form i + j + 2ij as true where 1 <= i <= j
    for ($i = 1; $i <= $nNew; $i++)
        for ($j = $i;
            ($i + $j + 2 * $i * $j) <= $nNew; $j++)
            $marked[$i + $j + 2 * $i * $j] = true;
}
 
// Rotate function to right rotate the number
function Rotate($n)
{
    $rem = $n % 10; // find unit place number
    $rem *= pow(10, countDigits($n)); // to put unit place
    // number as first digit.
    $n = (int)($n / 10); // remove unit digit
    $n += $rem; // add first digit to rest
    return $n;
}
 
// Function to find total number of digits
function countDigits($n)
{
    $digit = 0;
    $n = (int)($n / 10);
    while ($n)
    {
        $digit++;
        $n = (int)($n / 10);
    }
    return $digit;
}
 
// Driver Code
$n = 100;
circularPrime($n);
 
// This code is contributed by mits
?>

Javascript

<script>
 
// Javascript program to print
// primes smaller
// than n using Sieve of Sundaram.
// Print all circular primes
function circularPrime(n)
{
    // In general Sieve of Sundaram, produces
    // primes smaller than (2*x + 2) for a
    // number given number x.Since we want
    // primes smaller than n, we reduce n to half
    var nNew = (n - 2) / 2;
     
    // This array is used to
    // separate numbers of the
    // form i+j+2ij from others
    // where 1 <= i <= j
    marked = Array.from({length: nNew + 1},
            (_, i) => false);
     
     
    SieveOfSundaram(marked, nNew);
     
    // if n > 2 then 2 is also a circular prime
    document.write("2 ");
     
    // According to Sieve of sundaram
    // If marked[i] is false
    // then 2*i + 1 is a prime number.
     
    // loop to check all prime numbers
    // and their rotations
    for (i = 1; i <= nNew; i++) {
        // Skip this number if not prime
        if (marked[i] == true)
            continue;
     
        var num = 2 * i + 1;
        // function for rotation of prime
        num = Rotate(num);
     
        // now we check for rotations of
        // this prime number
        // if new rotation is prime check
        // next rotation,
        // till new rotation becomes
        // the actual prime number
        // and if new rotation if
        // not prime then break
        while (num != 2 * i + 1) {
            if (num % 2 == 0) // check for even
                break;
     
            // if rotated number is prime then rotate
            // for next
            if (marked[parseInt((num - 1) / 2)] == false)
                num = Rotate(num);
            else
                break;
        }
     
        // if checked number is circular prime print it
        if (num == (2 * i + 1))
            document.write(num + " ");
        }
}
 
// Sieve of Sundaram for generating prime number
function SieveOfSundaram(marked , nNew)
{
    // Main logic of Sundaram. Mark all numbers of the
// form i + j + 2ij as true where 1 <= i <= j
    for (i = 1; i <= nNew; i++)
        for (j = i; (i + j + 2 * i * j) <= nNew; j++)
            marked[i + j + 2 * i * j] = true;
}
 
// Function to find total number of digits
function countDigits(n)
{
    var digit = 0;
    while ((n = parseInt(n/10)) > 0)
        digit++;
    return digit;
}
 
// Rotate function to right rotate the number
function Rotate(n)
{
    // find unit place number
    var rem = n % 10;
    // to put unit place
    rem *= Math.pow(10, countDigits(n));
    // number as first digit.
    n = parseInt(n/10) // remove unit digit
    n += rem; // add first digit to rest
        return n;
}
 
// Driver code
var n = 100;
circularPrime(n);
 
// This code is contributed by Amit Katiyar
 
</script>

Producción: 

2 3 5 7 11 13 17 31 37 71 73 79 97

Este artículo es una contribución de Shivam Pradhan (anuj_charm) . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *