Find all circular primes less than given number n. A prime number is a Circular Prime Number if all of its possible rotations are itself prime numbers.
Examples :
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.
Algorithm:
-> 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.
Below is the implementation of the above algorithm :
C++
#include <bits/stdc++.h>
using namespace std;
void SieveOfSundaram( bool marked[], int );
int Rotate( int );
int countDigits( int );
void circularPrime( int n)
{
int nNew = (n - 2) / 2;
bool marked[nNew + 1];
memset (marked, false , sizeof (marked));
SieveOfSundaram(marked, nNew);
cout << "2 " ;
for ( int i = 1; i <= nNew; i++) {
if (marked[i] == true )
continue ;
int num = 2 * i + 1;
num = Rotate(num);
while (num != 2 * i + 1) {
if (num % 2 == 0)
break ;
if (marked[(num - 1) / 2] == false )
num = Rotate(num);
else
break ;
}
if (num == (2 * i + 1))
cout << num << " " ;
}
}
void SieveOfSundaram( bool marked[], int nNew)
{
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 ;
}
int Rotate( int n)
{
int rem = n % 10;
rem *= pow (10, countDigits(n));
n /= 10;
n += rem;
return n;
}
int countDigits( int n)
{
int digit = 0;
while (n /= 10)
digit++;
return digit;
}
int main( void )
{
int n = 100;
circularPrime(n);
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
static void circularPrime( int n)
{
int nNew = (n - 2 ) / 2 ;
boolean marked[] = new boolean [nNew + 1 ];
Arrays.fill(marked, false );
SieveOfSundaram(marked, nNew);
System.out.print( "2 " );
for ( int i = 1 ; i <= nNew; i++) {
if (marked[i] == true )
continue ;
int num = 2 * i + 1 ;
num = Rotate(num);
while (num != 2 * i + 1 ) {
if (num % 2 == 0 )
break ;
if (marked[(num - 1 ) / 2 ] == false )
num = Rotate(num);
else
break ;
}
if (num == ( 2 * i + 1 ))
System.out.print(num + " " );
}
}
static void SieveOfSundaram( boolean marked[], int nNew)
{
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 ;
}
static int countDigits( int n)
{
int digit = 0 ;
while ((n /= 10 ) > 0 )
digit++;
return digit;
}
static int Rotate( int n)
{
int rem = n % 10 ;
rem *= Math.pow( 10 , countDigits(n));
n /= 10 ;
n += rem;
return n;
}
public static void main(String[] args)
{
int n = 100 ;
circularPrime(n);
}
}
|
Python3
def circularPrime(n):
nNew = (n - 2 ) / / 2
marked = [ False for i in range (nNew + 1 )]
SieveOfSundaram(marked, nNew)
print ( "2" , end = ' ' )
for i in range ( 1 , nNew + 1 ):
if (marked[i] = = True ):
continue ;
num = 2 * i + 1
num = Rotate(num)
while (num ! = 2 * i + 1 ):
if (num % 2 = = 0 ):
break
if (marked[(num - 1 ) / / 2 ] = = False ):
num = Rotate(num);
else :
break ;
if (num = = ( 2 * i + 1 )):
print (num, end = ' ' )
def SieveOfSundaram(marked, nNew):
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
def Rotate(n):
rem = n % 10
rem = rem * ( 10 * * (countDigits(n) - 1 ))
n = n / / 10
n + = rem
return n
def countDigits(n):
digit = 0
while n ! = 0 :
n = n / / 10
digit + = 1
return digit
if __name__ = = "__main__" :
n = 100
circularPrime(n)
|
C#
using System;
class GFG {
static void circularPrime( int n)
{
int nNew = (n - 2) / 2;
bool [] marked = new bool [nNew + 1];
SieveOfSundaram(marked, nNew);
Console.Write( "2 " );
for ( int i = 1; i <= nNew; i++) {
if (marked[i] == true )
continue ;
int num = 2 * i + 1;
num = Rotate(num);
while (num != 2 * i + 1) {
if (num % 2 == 0)
break ;
if (marked[(num - 1) / 2] == false )
num = Rotate(num);
else
break ;
}
if (num == (2 * i + 1))
Console.Write(num + " " );
}
}
static void SieveOfSundaram( bool [] marked, int nNew)
{
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 ;
}
static int countDigits( int n)
{
int digit = 0;
while ((n /= 10) > 0)
digit++;
return digit;
}
static int Rotate( int n)
{
int rem = n % 10;
rem *= ( int )Math.Pow(10, countDigits(n));
n /= 10;
n += rem;
return n;
}
public static void Main()
{
int n = 100;
circularPrime(n);
}
}
|
Javascript
<script>
function circularPrime(n)
{
var nNew = (n - 2) / 2;
marked = Array.from({length: nNew + 1},
(_, i) => false );
SieveOfSundaram(marked, nNew);
document.write( "2 " );
for (i = 1; i <= nNew; i++) {
if (marked[i] == true )
continue ;
var num = 2 * i + 1;
num = Rotate(num);
while (num != 2 * i + 1) {
if (num % 2 == 0)
break ;
if (marked[parseInt((num - 1) / 2)] == false )
num = Rotate(num);
else
break ;
}
if (num == (2 * i + 1))
document.write(num + " " );
}
}
function SieveOfSundaram(marked , nNew)
{
for (i = 1; i <= nNew; i++)
for (j = i; (i + j + 2 * i * j) <= nNew; j++)
marked[i + j + 2 * i * j] = true ;
}
function countDigits(n)
{
var digit = 0;
while ((n = parseInt(n/10)) > 0)
digit++;
return digit;
}
function Rotate(n)
{
var rem = n % 10;
rem *= Math.pow(10, countDigits(n));
n = parseInt(n/10)
n += rem;
return n;
}
var n = 100;
circularPrime(n);
</script>
|
PHP
<?php
function circularPrime( $n )
{
$nNew = (int)(( $n - 2) / 2);
$marked = array_fill (0, $nNew + 1, false);
SieveOfSundaram( $marked , $nNew );
print ( "2 " );
for ( $i = 1; $i <= $nNew ; $i ++)
{
if ( $marked [ $i ] == true)
continue ;
$num = 2 * $i + 1;
$num = Rotate( $num );
while ( $num != 2 * $i + 1)
{
if ( $num % 2 == 0)
break ;
if ( $marked [(int)(( $num - 1) / 2)] == false)
$num = Rotate( $num );
else
break ;
}
if ( $num == (2 * $i + 1))
print ( $num . " " );
}
}
function SieveOfSundaram(& $marked , $nNew )
{
for ( $i = 1; $i <= $nNew ; $i ++)
for ( $j = $i ;
( $i + $j + 2 * $i * $j ) <= $nNew ; $j ++)
$marked [ $i + $j + 2 * $i * $j ] = true;
}
function Rotate( $n )
{
$rem = $n % 10;
$rem *= pow(10, countDigits( $n ));
$n = (int)( $n / 10);
$n += $rem ;
return $n ;
}
function countDigits( $n )
{
$digit = 0;
$n = (int)( $n / 10);
while ( $n )
{
$digit ++;
$n = (int)( $n / 10);
}
return $digit ;
}
$n = 100;
circularPrime( $n );
?>
|
Output:
2 3 5 7 11 13 17 31 37 71 73 79 97
Approach 2:
Step-by-step approach:
- Generate all primes up to n using the Sieve of Eratosthenes algorithm.
- For each prime p, check if it is a circular prime by rotating its digits and checking if the resulting numbers are also prime.
- If all rotations of p are prime, then p is a circular prime.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void generatePrimes( int n, vector< int >& primes) {
vector< bool > isPrime(n+1, true );
isPrime[0] = isPrime[1] = false ;
for ( int i = 2; i <= sqrt (n); i++) {
if (isPrime[i]) {
for ( int j = i*i; j <= n; j += i) {
isPrime[j] = false ;
}
}
}
for ( int i = 2; i <= n; i++) {
if (isPrime[i]) {
primes.push_back(i);
}
}
}
bool isCircularPrime( int n, const vector< int >& primes) {
string num = to_string(n);
for ( int i = 0; i < num.size(); i++) {
rotate(num.begin(), num.begin()+1, num.end());
int rotatedNum = stoi(num);
if (!binary_search(primes.begin(), primes.end(), rotatedNum)) {
return false ;
}
}
return true ;
}
void circularPrimes( int n) {
vector< int > primes;
generatePrimes(n, primes);
for ( int i = 0; i < primes.size(); i++) {
if (isCircularPrime(primes[i], primes)) {
cout << primes[i] << " " ;
}
}
}
int main( void ) {
int n = 100;
circularPrimes(n);
return 0;
}
|
Java
import java.util.ArrayList;
import java.util.List;
public class CircularPrimes {
static void generatePrimes( int n, List<Integer> primes) {
boolean [] isPrime = new boolean [n + 1 ];
for ( int i = 0 ; i <= n; i++) {
isPrime[i] = true ;
}
isPrime[ 0 ] = isPrime[ 1 ] = false ;
for ( int i = 2 ; i <= Math.sqrt(n); i++) {
if (isPrime[i]) {
for ( int j = i * i; j <= n; j += i) {
isPrime[j] = false ;
}
}
}
for ( int i = 2 ; i <= n; i++) {
if (isPrime[i]) {
primes.add(i);
}
}
}
static boolean isCircularPrime( int n, List<Integer> primes) {
String num = Integer.toString(n);
for ( int i = 0 ; i < num.length(); i++) {
num = num.substring( 1 ) + num.charAt( 0 );
int rotatedNum = Integer.parseInt(num);
if (!primes.contains(rotatedNum)) {
return false ;
}
}
return true ;
}
static void circularPrimes( int n) {
List<Integer> primes = new ArrayList<>();
generatePrimes(n, primes);
for ( int prime : primes) {
if (isCircularPrime(prime, primes)) {
System.out.print(prime + " " );
}
}
}
public static void main(String[] args) {
int n = 100 ;
circularPrimes(n);
}
}
|
Python3
import math
def generate_primes(n):
is_prime = [ True ] * (n + 1 )
is_prime[ 0 ] = is_prime[ 1 ] = False
for i in range ( 2 , int (math.sqrt(n)) + 1 ):
if is_prime[i]:
for j in range (i * i, n + 1 , i):
is_prime[j] = False
primes = []
for i in range ( 2 , n + 1 ):
if is_prime[i]:
primes.append(i)
return primes
def is_circular_prime(n, primes):
num = str (n)
for i in range ( len (num)):
num = num[ 1 :] + num[ 0 ]
rotated_num = int (num)
if rotated_num not in primes:
return False
return True
def circular_primes(n):
primes = generate_primes(n)
for p in primes:
if is_circular_prime(p, primes):
print (p, end = " " )
if __name__ = = '__main__' :
n = 100
circular_primes(n)
|
Output2 3 5 7 11 13 17 31 37 71 73 79 97
Time Complexity: O(n log log n), where n is the input number. This is because the Sieve of Sundaram algorithm used.
Auxiliary Space: O(n log log n).
This article is contributed by Shivam Pradhan (anuj_charm). If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.