Saturday, January 11, 2025
Google search engine
HomeData Modelling & AICheck whether N is a Dihedral Prime Number or not

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. The Sieves of Eratosthenes can be calculated in n*logn*logn time. Run a primality test for the number and its different orientations. If the number passes the primality tests, check if any digits belong to the exclusion set [3, 4, 6, 7, 9]. The return is true if the number passes both tests.

Below is the implementation of the above approach: 

C++




// 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;
}


Java




// Java implementation of the above approach
import java.util.*;
 
class GFG
{
 
    static boolean[] isPrime = new boolean[(int) (1e5) + 5];
 
    // Function to return the reverse
    // of a number
    static 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
    static 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
    static void sieve()
    {
        Arrays.fill(isPrime, true);
 
        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
    static boolean 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
    public static void main(String[] args)
    {
        sieve();
 
        int n = 18181;
        if (isDihedralPrime(n))
        {
            System.out.println("Yes");
        }
        else
        {
            System.out.println("No");
        }
    }
}
 
// This code is contributed by Rajput-Ji


Python3




# 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")


C#




// C# implementation of the above approach
using System;
     
class GFG
{
    static Boolean[] isPrime = new Boolean[(int) (1e5) + 5];
 
    // Function to return the reverse
    // of a number
    static 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
    static 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
    static void sieve()
    {
        for(int k = 0; k < isPrime.Length; k++)
            isPrime[k] = true;
 
        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
    static Boolean 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
    public static void Main(String[] args)
    {
        sieve();
 
        int n = 18181;
        if (isDihedralPrime(n))
        {
            Console.WriteLine("Yes");
        }
        else
        {
            Console.WriteLine("No");
        }
    }
}
 
// This code is contributed by Rajput-Ji


PHP




<?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
?>


Javascript




<script>
// Javascript implementation of the above approach
let isPrime = new Array(25000).fill(true);
 
// Function to return the reverse
// of a number
function reverse(n)
{
    let temp = n;
    let sum = 0;
    while (temp > 0)
    {
        rem = temp % 10;
        sum = sum * 10 + rem;
        temp = Math.floor(temp / 10);
    }
    return sum;
}
 
// Function to generate mirror reflection
// of a number
function mirror(n)
{
    let temp = n;
    let sum = 0;
    while (temp > 0)
    {
        let rem = temp % 10;
        if (rem == 2)
            rem = 5;
        else if (rem == 5)
            rem = 2;
        sum = sum * 10 + rem;
        temp = Math.floor(temp / 10);
    }
    return sum;
}
 
// Function to initialize prime number sieve
function sieve()
{
    isPrime[0] = isPrime[1] = false;
 
    for (let i = 2; i <= Math.floor(1e4); i++)
    {
        for (let j = 2; i * j <= Math.floor(1e4); j++)
        {
            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 (!isPrime[n] ||
        !isPrime[mirror(n)] ||
        !isPrime[reverse(n)] ||
        !isPrime[reverse(mirror(n))])
        return false;
 
    let temp = n;
 
    while (temp > 0)
    {
        rem = temp % 10;
        if (rem == 3 || rem == 4 ||
            rem == 6 || rem == 7 || rem == 9)
            return false;
             
        temp = Math.floor(temp / 10);
    }
 
    return true;
}
 
// Driver code
sieve();
 
let n = 18181;
if (isDihedralPrime(n))
    document.write( "Yes");
else
    document.write( "No");
 
// This code is contributed by Saurabh Jaiswal
</script>


Output: 

Yes

 

Time Complexity: O(n * log(log n))

Auxiliary Space: O(105)

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Dominic Rubhabha-Wardslaus
Dominic Rubhabha-Wardslaushttp://wardslaus.com
infosec,malicious & dos attacks generator, boot rom exploit philanthropist , wild hacker , game developer,
RELATED ARTICLES

Most Popular

Recent Comments