Skip to content
Related Articles

Related Articles

Improve Article
Save Article
Like Article

Next smallest prime palindrome

  • Difficulty Level : Expert
  • Last Updated : 10 May, 2021

Given a positive integer N where 1 \leq N \leq 10^{9}  . The task is to find the smallest prime palindrome greater than or equal to N.
Examples: 
 

Input: 8
Output: 11

Input: 7000000000
Output: 10000500001

Approach: 
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

The Naive approach is to loop from N + 1 until we found the next smallest prime palindrome greater than or equal to N.
Efficient Approach: 
Let’s say P = R is a the next smallest prime-palindrome greater than or equal to N
Now since R is a palindrome, the first half of the digits of R can be used to determine R up to two possibilities. Let k be the first half of the digits in R. For eg. if k = 123, then R = 12321 or R = 123321.
Thus, we iterate through each k upto 105 and create the associated palindrome R, and check whether R is a prime or not. 
Also, we will handle the odd and even palindromes separately, and break them when we found our result.
Below is the implementation of above approach: 
 

C++




// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long int
 
// Function to check whether
// a number is prime
bool isPrime(ll n)
{
    if (n < 2) return false;
     
    for (ll i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
 
// function to generate next
// smallest prime palindrome
ll nextPrimePalindrome(ll N)
{
for (ll k = 1; k < 1000000; k++)
{
     
    // Check for odd-length palindromes
    string s = to_string(k);
    string z(s.begin(), s.end());
    reverse(z.begin(), z.end());
 
    // eg. s = '1234' to x = int('1234321')
    ll x = stoll(s + z.substr(1));
 
    if (x >= N and isPrime(x)) return x;
 
    // Check for even-length palindromes
    s = to_string(k);
    z = string(s.begin(), s.end());
    reverse(z.begin(), z.end());
 
    // eg. s = '1234' to x = int('12344321')
    x = stoll(s + z);
 
    if (x >= N and isPrime(x)) return x;
}
}
 
// Driver Code
int main()
{
    ll N = 7000000000;
     
    // Function call to print answer
    cout << nextPrimePalindrome(N) << endl;
     
    return 0;
}
 
// This code is contributed by
// sanjeev2552

Java




// Java implementation of above approach
class GFG
{
 
// Function to check whether
// a number is prime
static boolean isPrime(long n)
{
    if (n < 2) return false;
     
    for (long i = 2; i <= Math.sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
 
// reverse the String
static String reverse(String s)
{
    String s1 = "";
    for(int i = s.length() - 1; i >= 0; i--)
        s1 += s.charAt(i);
     
    return s1;
}
 
// function to generate next
// smalongest prime palindrome
static long nextPrimePalindrome(long N)
{
    for (long k = 1; k < 1000000l; k++)
    {
         
        // Check for odd-length palindromes
        String s = ""+k;
        String z;
        z = reverse(s);
     
        // eg. s = '1234' to x = int('1234321')
        long x = Long.parseLong(s + z.substring(1, z.length()));
     
        if (x >= N && isPrime(x))
            return x;
     
        // Check for even-length palindromes
        s = ""+(k);
        z = s;
        z = reverse(z);
     
        // eg. s = '1234' to x = int('12344321')
        x = Long.parseLong(s + z);
     
        if (x >= N && isPrime(x)) return x;
    }
    return -1;
}
 
// Driver Code
public static void main(String args[])
{
    long N = 7000000000l;
     
    // Function calong to print answer
    System.out.println( nextPrimePalindrome(N) );
}
}
 
// This code is contributed by Arnab Kundu

Python3




# Python3 implementation of above approach
import math
 
# Function to check whether a number is prime
def is_prime(n):
    return n > 1 and all(n % d for d in range(2, int(math.sqrt(n)) + 1))
 
# function to generate next smallest prime palindrome
def NextprimePalindrome(N):
 
    for k in range(1, 10**6):
 
        # Check for odd-length palindromes
        s = str(k)
        x = int(s + s[-2::-1])  # eg. s = '1234' to x = int('1234321')
 
        if x >= N and is_prime(x):
            return x
 
        # Check for even-length palindromes
        s = str(k)
        x = int(s + s[-1::-1])  # eg. s = '1234' to x = int('12344321')
 
        if x >= N and is_prime(x):
            return x
 
# Driver code
N = 7000000000
 
# Function call to print answer
print(NextprimePalindrome(N))
 
# This code is written by
# Sanjit_Prasad

C#




// C# implementation of above approach
using System;
 
class GFG
{
 
// Function to check whether
// a number is prime
static bool isPrime(long n)
{
    if (n < 2) return false;
     
    for (long i = 2; i <= Math.Sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
 
// reverse the String
static String reverse(String s)
{
    String s1 = "";
    for(int i = s.Length - 1; i >= 0; i--)
        s1 += s[i];
     
    return s1;
}
 
// function to generate next
// smalongest prime palindrome
static long nextPrimePalindrome(long N)
{
    for (long k = 1; k < 1000000; k++)
    {
         
        // Check for odd-length palindromes
        String s = ""+k;
        String z;
        z = reverse(s);
     
        // eg. s = '1234' to x = int('1234321')
        long x = long.Parse(s + z.Substring(1, z.Length - 1));
     
        if (x >= N && isPrime(x))
            return x;
     
        // Check for even-length palindromes
        s = ""+(k);
        z = s;
        z = reverse(z);
     
        // eg. s = '1234' to x = int('12344321')
        x = long.Parse(s + z);
     
        if (x >= N && isPrime(x)) return x;
    }
    return -1;
}
 
// Driver Code
public static void Main(String []args)
{
    long N = 7000000000;
     
    // Function calong to print answer
    Console.WriteLine( nextPrimePalindrome(N) );
}
}
 
// This code is contributed by PrinciRaj1992

Javascript




<script>
 
// Javascript  implementation of above approach
 
// Function to check whether
// a number is prime
function isPrime( n)
{
    if (n < 2) return false;
     
    for (var i = 2; i <= Math.sqrt(n); i++)
    {
        if (n % i == 0) return false;
    }
    return true;
}
 
// function to generate next
// smallest prime palindrome
 
function reverse( s)
{
    var s1 = "";
    for(var i = s.length - 1; i >= 0; i--)
        s1 += s[i];
     
    return s1;
}
 
function nextPrimePalindrome( N)
{
for (var k = 1; k < 1000000; k++)
{
     
    // Check for odd-length palindromes
    var s = ""+k;
    var z;
    z=reverse(s);
 
    // eg. s = '1234' to x = int('1234321')
    var x = Number(s + z.substring(1,z.length));
 
    if (x >= N && isPrime(x)) return x;
 
    // Check for even-length palindromes
    s =  ""+k;
    z = s;
     z=reverse(z);
 
    // eg. s = '1234' to x = int('12344321')
    x = Number(s + z);
 
    if (x >= N && isPrime(x)) return x;
}
}
 
var N = 7000000000;
// Function call to find maximum value
document.write(nextPrimePalindrome(N) + "<br>");
 
// This code is contributed by SoumikMondal
 
</script>
Output: 
10000500001

 

Time Complexity: O(N*sqrt(N)) where N is upper limit and the sqrt(N) term comes from checking if a candidate is prime.
 




My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!