Check whether N is a Dihedral Prime Number or not

Given an integer N, the task is to check if N is a Dihedral prime number or not. A Dihedral prime is a prime number that can be read as itself or as another prime number when read in a seven-segment display, regardless of different orientation and surface.

Examples:

Input: N = 108881
Output: Yes

Input: N = 789
Output: No

Approach: Pre-calculate Prime number sieve for primality testing. Sieve of Eratosthenes can be calculated in n*logn*logn time. Run a primality test for the number and its different orientations. If the number pass the primality tests, check if any digits belong to the exclusion set [3, 4, 6, 7, 9]. Return true if the number passes both tests.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
  
bool isPrime[int(1e5) + 5];
  
// Function to return the reverse
// of a number
int reverse(int n)
{
    int temp = n;
    int sum = 0;
    while (temp > 0) {
        int rem = temp % 10;
        sum = sum * 10 + rem;
        temp /= 10;
    }
    return sum;
}
  
// Function to generate mirror reflection
// of a number
int mirror(int n)
{
    int temp = n;
    int sum = 0;
    while (temp > 0) {
        int rem = temp % 10;
        if (rem == 2)
            rem = 5;
        else if (rem == 5)
            rem = 2;
        sum = sum * 10 + rem;
        temp /= 10;
    }
    return sum;
}
  
// Function to initialize prime number sieve
bool sieve()
{
    memset(isPrime, true, sizeof isPrime);
  
    isPrime[0] = isPrime[1] = false;
  
    for (int i = 2; i <= int(1e5); i++) {
        for (int j = 2; i * j <= int(1e5); j++) {
            isPrime[i * j] = false;
        }
    }
}
  
// Function that returns true if n is
// Dihedral Prime number
bool isDihedralPrime(int n)
{
    // Check if the orientations of n 
    // is also prime
    if (!isPrime[n]
        || !isPrime[mirror(n)]
        || !isPrime[reverse(n)]
        || !isPrime[reverse(mirror(n))])
        return false;
  
    int temp = n;
  
    while (temp > 0) {
        int rem = temp % 10;
        if (rem == 3 || rem == 4 || rem == 6
            || rem == 7 || rem == 9)
            return false;
        temp /= 10;
    }
  
    return true;
}
  
// Driver code
int main()
{
    sieve();
  
    int n = 18181;
    if (isDihedralPrime(n))
        cout << "Yes";
    else
        cout << "No";
  
    return 0;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python implementation of the above approach
isPrime = (int(1e5)+5)*[True]
  
# Function to return the reverse
# of a number
def reverse(n):
    temp = n
    sum = 0
    while temp>0:
        rem = temp % 10
        sum = sum * 10 + rem
        temp//= 10
  
    return sum
  
# Function to generate mirror reflection
# of a number
def mirror(n):
    temp = n
    sum = 0
    while temp>0:
        rem = temp % 10
        if rem == 2:
            rem = 5
        elif rem == 5:
            rem = 2
        sum = sum * 10 + rem
        temp//= 10
  
    return sum
  
# Function to initialize prime number sieve
def sieve():
  
    isPrime[0] = isPrime[1] = False
  
    for i in range(2, int(1e5)+1):
        j = 2
        while i * j<= int(1e5):
            isPrime[i * j] = False
            j+= 1
  
  
# Function that returns true if n is
# Dihedral Prime number
def isDihedralPrime(n):
      
    # Check if the orientations of n is also prime
    if (not isPrime[n]) or (not isPrime[mirror(n)]) \
        or (not isPrime[reverse(n)]) \
        or (not isPrime[reverse(mirror(n))]):
        return False
  
    temp = n
  
    while temp>0:
        rem = temp % 10;
        if rem == 3 or rem == 4 or \
            rem == 6 or rem == 7 or rem == 9:
            return False
        temp//= 10
  
    return True
  
# Driver code
if __name__ == '__main__':
  
    sieve()
      
    n = 18181
    if isDihedralPrime(n):
        print("Yes")
    else :
        print("No")

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the above approach 
$isPrime = array_fill(0, 25000 , true); 
  
// Function to return the reverse 
// of a number 
function reverse($n
    $temp = $n
    $sum = 0; 
    while ($temp > 0)
    
        $rem = $temp % 10; 
        $sum = $sum * 10 + $rem
        $temp = floor($temp / 10); 
    
    return $sum
  
// Function to generate mirror reflection 
// of a number 
function mirror($n
    $temp = $n
    $sum = 0; 
    while ($temp > 0) 
    
        $rem = $temp % 10; 
        if ($rem == 2) 
            $rem = 5; 
        else if ($rem == 5) 
            $rem = 2; 
        $sum = $sum * 10 + $rem
        $temp = floor($temp / 10); 
    
    return $sum
  
// Function to initialize prime number sieve 
function sieve() 
    $GLOBALS['isPrime'][0] = $GLOBALS['isPrime'][1] = false; 
  
    for ($i = 2; $i <= floor(1e4); $i++) 
    
        for ($j = 2; $i * $j <= floor(1e4); $j++) 
        
            $GLOBALS['isPrime'][$i * $j] = false; 
        
    
  
// Function that returns true if n is 
// Dihedral Prime number 
function isDihedralPrime($n
    // Check if the orientations of n 
    // is also prime 
    if (!$GLOBALS['isPrime'][$n] || 
        !$GLOBALS['isPrime'][mirror($n)] ||
        !$GLOBALS['isPrime'][reverse($n)] || 
        !$GLOBALS['isPrime'][reverse(mirror($n))]) 
        return false; 
  
    $temp = $n
  
    while ($temp > 0) 
    
        $rem = $temp % 10; 
        if ($rem == 3 || $rem == 4 || 
            $rem == 6 || $rem == 7 || $rem == 9) 
            return false; 
              
        $temp = floor($temp / 10); 
    
  
    return true; 
  
// Driver code 
sieve(); 
  
$n = 18181; 
if (isDihedralPrime($n)) 
    echo "Yes"
else
    echo "No"
  
// This code is contributed by Ryuga 
?>

chevron_right


Output:

Yes


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : AnkitRai01