Check if a number can be represented as a sum of a Prime Number and a Perfect Square
Last Updated :
17 Mar, 2023
Given a positive integer N, the task is to check if N can be represented as a sum of a Prime Number and a Perfect Square or not. If it is possible to represent N in required form, then print "Yes". Otherwise, print "No".
Examples:
Input: N = 27
Output: Yes
Explanation: 27 can be expressed as sum of 2 (prime) and 25 (perfect square).
Input: N = 64
Output: No
Naive Approach: The simplest approach to solve the given problem is to store all perfect squares which are less than or equal to N in an array. For every perfect square in the array, say X, check if (N - X) is a prime number or not. If found to be true, then print "Yes". Otherwise, print "No".
Algorithm:
- Create a function isPrime(n) that accepts an integer n as input and returns true if the supplied number is prime, otherwise false.
- Inside the isPrime(n) :
- If the given number n is less than or equal to 1, return false as it is not a prime number.
- Return true if the given number n is a prime number and is less than or equal to 3.
- If the number n is not a prime number and is divisible by 2 or 3, return false.
- Repeat this process for each 6th number in the range [5, sqrt(N)]. Return false if n is discovered to be non-prime. Otherwise, return true.
- Create a function sumOfPrimeSquare(n) that takes an integer n as input and returns nothing.
- Inside sumOfPrimeSquare(n) function.
- Initialize the integer variable i to 0
- Create squares ArrayList to hold all perfect squares with a size smaller than N.
- Place the ideal square in the squares ArrayList while i * i < n.
- Set a boolean variable flag's initial value to false.
- Go through each perfect square in the squares ArrayList iteratively:
- Put the perfect square difference from n in the difference variable.
- Update the flag to true and exit the loop if the difference is prime.
- Print "Yes" if N is the product of a prime number and a perfect square. Print "No" if not.
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to check if a
// number is prime or not
bool isPrime(int n)
{
// Base Cases
if (n <= 1)
return false;
if (n <= 3)
return true;
// Check if n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false;
// Iterate over every 6 number
// from the range [5, sqrt(N)]
for (int i = 5; i * i <= n;
i = i + 6) {
// If n is found to be non-prime
if (n % i == 0
|| n % (i + 2) == 0) {
return false;
}
}
// Otherwise, return true
return true;
}
// Function to check if a number can
// be represented as the sum of a prime
// number and a perfect square or not
void sumOfPrimeSquare(int n)
{
int i = 0;
// Stores all perfect
// squares less than N
vector<int> squares;
while (i * i < n) {
// Store the perfect square
// in the array
squares.push_back(i * i);
i++;
}
bool flag = false;
// Iterate over all perfect squares
for (i = 0; i < squares.size(); i++) {
// Store the difference of
// perfect square from n
int difference = n - squares[i];
// If difference is prime
if (isPrime(difference)) {
// Update flag
flag = true;
// Break out of the loop
break;
}
}
// If N is the sum of a prime
// number and a perfect square
if (flag) {
cout << "Yes";
}
else
cout << "No";
}
// Driver Code
int main()
{
int N = 27;
sumOfPrimeSquare(N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to check if a
// number is prime or not
static boolean isPrime(int n)
{
// Base Cases
if (n <= 1)
return false;
if (n <= 3)
return true;
// Check if n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false;
// Iterate over every 6 number
// from the range [5, sqrt(N)]
for(int i = 5; i * i <= n;
i = i + 6)
{
// If n is found to be non-prime
if (n % i == 0 || n % (i + 2) == 0)
{
return false;
}
}
// Otherwise, return true
return true;
}
// Function to check if a number can
// be represented as the sum of a prime
// number and a perfect square or not
static void sumOfPrimeSquare(int n)
{
int i = 0;
// Stores all perfect
// squares less than N
ArrayList<Integer> squares = new ArrayList<Integer>();
while (i * i < n)
{
// Store the perfect square
// in the array
squares.add(i * i);
i++;
}
boolean flag = false;
// Iterate over all perfect squares
for(i = 0; i < squares.size(); i++)
{
// Store the difference of
// perfect square from n
int difference = n - squares.get(i);
// If difference is prime
if (isPrime(difference))
{
// Update flag
flag = true;
// Break out of the loop
break;
}
}
// If N is the sum of a prime
// number and a perfect square
if (flag)
{
System.out.print("Yes");
}
else
System.out.print("No");
}
// Driver Code
public static void main(String[] args)
{
int N = 27;
sumOfPrimeSquare(N);
}
}
// This code is contributed by sanjoy_62
Python3
# Python3 program for the above approach
from math import sqrt
# Function to check if a
# number is prime or not
def isPrime(n):
# Base Cases
if (n <= 1):
return False
if (n <= 3):
return True
# Check if n is divisible by 2 or 3
if (n % 2 == 0 or n % 3 == 0):
return False
# Iterate over every 6 number
# from the range [5, sqrt(N)]
for i in range(5, int(sqrt(n)) + 1, 6):
# If n is found to be non-prime
if (n % i == 0 or n % (i + 2) == 0):
return False
# Otherwise, return true
return True
# Function to check if a number can
# be represented as the sum of a prime
# number and a perfect square or not
def sumOfPrimeSquare(n):
i = 0
# Stores all perfect
# squares less than N
squares = []
while (i * i < n):
# Store the perfect square
# in the array
squares.append(i * i)
i += 1
flag = False
# Iterate over all perfect squares
for i in range(len(squares)):
# Store the difference of
# perfect square from n
difference = n - squares[i]
# If difference is prime
if (isPrime(difference)):
# Update flag
flag = True
# Break out of the loop
break
# If N is the sum of a prime
# number and a perfect square
if (flag):
print("Yes")
else:
print("No")
# Driver Code
if __name__ == '__main__':
N = 27
sumOfPrimeSquare(N)
# This code is contributed by SURENDRA_GANGWAR
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG{
// Function to check if a
// number is prime or not
static bool isPrime(int n)
{
// Base Cases
if (n <= 1)
return false;
if (n <= 3)
return true;
// Check if n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false;
// Iterate over every 6 number
// from the range [5, sqrt(N)]
for (int i = 5; i * i <= n;
i = i + 6) {
// If n is found to be non-prime
if (n % i == 0
|| n % (i + 2) == 0) {
return false;
}
}
// Otherwise, return true
return true;
}
// Function to check if a number can
// be represented as the sum of a prime
// number and a perfect square or not
static void sumOfPrimeSquare(int n)
{
int i = 0;
// Stores all perfect
// squares less than N
List<int> squares = new List<int>();
while (i * i < n) {
// Store the perfect square
// in the array
squares.Add(i * i);
i++;
}
bool flag = false;
// Iterate over all perfect squares
for (i = 0; i < squares.Count; i++) {
// Store the difference of
// perfect square from n
int difference = n - squares[i];
// If difference is prime
if (isPrime(difference)) {
// Update flag
flag = true;
// Break out of the loop
break;
}
}
// If N is the sum of a prime
// number and a perfect square
if (flag) {
Console.Write("Yes");
}
else
Console.Write("No");
}
// Driver Code
public static void Main()
{
int N = 27;
sumOfPrimeSquare(N);
}
}
// This code is contributed by ipg2016107.
JavaScript
<script>
// Javascript program for the above approach
// Function to check if a
// number is prime or not
function isPrime(n)
{
// Base Cases
if (n <= 1)
return false;
if (n <= 3)
return true;
// Check if n is divisible by 2 or 3
if (n % 2 == 0 || n % 3 == 0)
return false;
// Iterate over every 6 number
// from the range [5, sqrt(N)]
for(let i = 5; i * i <= n;
i = i + 6)
{
// If n is found to be non-prime
if (n % i == 0 || n % (i + 2) == 0)
{
return false;
}
}
// Otherwise, return true
return true;
}
// Function to check if a number can
// be represented as the sum of a prime
// number and a perfect square or not
function sumOfPrimeSquare(n)
{
let i = 0;
// Stores all perfect
// squares less than N
let squares = [];
while (i * i < n)
{
// Store the perfect square
// in the array
squares.push(i * i);
i++;
}
let flag = false;
// Iterate over all perfect squares
for(i = 0; i < squares.length; i++)
{
// Store the difference of
// perfect square from n
let difference = n - squares[i];
// If difference is prime
if (isPrime(difference))
{
// Update flag
flag = true;
// Break out of the loop
break;
}
}
// If N is the sum of a prime
// number and a perfect square
if (flag)
{
document.write("Yes");
}
else
document.write("No");
}
// Driver Code
let N = 27;
sumOfPrimeSquare(N);
// This code is contributed by rishavmahato348
</script>
Time Complexity: O(N)
Auxiliary Space: O(?N)
Efficient Approach: The above approach can be optimized by storing all the prime numbers smaller than N in an array, using Sieve of Eratosthenes. If there exists any prime number, say X, check if (N - X) is a perfect square or not. If found to be true, then print "Yes". Otherwise, print "No".
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to store all prime
// numbers less than or equal to N
void SieveOfEratosthenes(bool prime[],
int n)
{
// Update prime[0] and
// prime[1] as false
prime[0] = false;
prime[1] = false;
// Iterate over the range [2, sqrt(N)]
for (int p = 2; p * p <= n; p++) {
// If p is a prime
if (prime[p] == true) {
// Update all multiples of p
// which are <= n as non-prime
for (int i = p * p; i <= n;
i += p) {
prime[i] = false;
}
}
}
}
// Function to check whether a number
// can be represented as the sum of a
// prime number and a perfect square
void sumOfPrimeSquare(int n)
{
bool flag = false;
// Stores all the prime numbers
// less than or equal to n
bool prime[n + 1];
memset(prime, true, sizeof(prime));
// Update the array prime[]
SieveOfEratosthenes(prime, n);
// Iterate over the range [0, n]
for (int i = 0; i <= n; i++) {
// If current number
// is non-prime
if (!prime[i])
continue;
// Update difference
int dif = n - i;
// If difference is a
// perfect square
if (ceil((double)sqrt(dif))
== floor((double)sqrt(dif))) {
// If true, update flag
// and break out of loop
flag = true;
break;
}
}
// If N can be expressed as sum
// of prime number and perfect square
if (flag) {
cout << "Yes";
}
else
cout << "No";
}
// Driver Code
int main()
{
int N = 27;
sumOfPrimeSquare(N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Function to store all prime
// numbers less than or equal to N
static void SieveOfEratosthenes(boolean prime[],
int n)
{
// Update prime[0] and
// prime[1] as false
prime[0] = false;
prime[1] = false;
// Iterate over the range [2, Math.sqrt(N)]
for(int p = 2; p * p <= n; p++)
{
// If p is a prime
if (prime[p] == true)
{
// Update all multiples of p
// which are <= n as non-prime
for(int i = p * p; i <= n; i += p)
{
prime[i] = false;
}
}
}
}
// Function to check whether a number
// can be represented as the sum of a
// prime number and a perfect square
static void sumOfPrimeSquare(int n)
{
boolean flag = false;
// Stores all the prime numbers
// less than or equal to n
boolean []prime = new boolean[n + 1];
for(int i = 0; i < prime.length; i++)
prime[i] = true;
// Update the array prime[]
SieveOfEratosthenes(prime, n);
// Iterate over the range [0, n]
for(int i = 0; i <= n; i++)
{
// If current number
// is non-prime
if (!prime[i])
continue;
// Update difference
int dif = n - i;
// If difference is a
// perfect square
if (Math.ceil((double)Math.sqrt(dif)) ==
Math.floor((double)Math.sqrt(dif)))
{
// If true, update flag
// and break out of loop
flag = true;
break;
}
}
// If N can be expressed as sum
// of prime number and perfect square
if (flag)
{
System.out.print("Yes");
}
else
System.out.print("No");
}
// Driver Code
public static void main(String[] args)
{
int N = 27;
sumOfPrimeSquare(N);
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program for the above approach
import math
# Function to store all prime
# numbers less than or equal to N
def SieveOfEratosthenes(prime, n):
# Update prime[0] and
# prime[1] as false
prime[0] = False
prime[1] = False
# Iterate over the range [2, sqrt(N)]
for p in range(2, int(n ** (1 / 2))):
# If p is a prime
if (prime[p] == True):
# Update all multiples of p
# which are <= n as non-prime
for i in range(p ** 2, n + 1, p):
prime[i] = False
# Function to check whether a number
# can be represented as the sum of a
# prime number and a perfect square
def sumOfPrimeSquare(n):
flag = False
# Stores all the prime numbers
# less than or equal to n
prime = [True] * (n + 1)
# Update the array prime[]
SieveOfEratosthenes(prime, n)
# Iterate over the range [0, n]
for i in range(n + 1):
# If current number
# is non-prime
if (not prime[i]):
continue
# Update difference
dif = n - i
# If difference is a
# perfect square
if (math.ceil(dif ** (1 / 2)) ==
math.floor(dif ** (1 / 2))):
# If true, update flag
# and break out of loop
flag = True
break
# If N can be expressed as sum
# of prime number and perfect square
if (flag):
print("Yes")
else:
print("No")
# Driver Code
if __name__ == "__main__":
N = 27
sumOfPrimeSquare(N)
# This code is contributed by AnkThon
C#
// C# program for the above approach
using System;
class GFG{
// Function to store all prime
// numbers less than or equal to N
static void SieveOfEratosthenes(bool[] prime, int n)
{
// Update prime[0] and
// prime[1] as false
prime[0] = false;
prime[1] = false;
// Iterate over the range [2, sqrt(N)]
for(int p = 2; p * p <= n; p++)
{
// If p is a prime
if (prime[p] == true)
{
// Update all multiples of p
// which are <= n as non-prime
for(int i = p * p; i <= n; i += p)
{
prime[i] = false;
}
}
}
}
// Function to check whether a number
// can be represented as the sum of a
// prime number and a perfect square
static void sumOfPrimeSquare(int n)
{
bool flag = false;
// Stores all the prime numbers
// less than or equal to n
bool[] prime = new bool[n + 1];
Array.Fill(prime, true);
// Update the array prime[]
SieveOfEratosthenes(prime, n);
// Iterate over the range [0, n]
for(int i = 0; i <= n; i++)
{
// If current number
// is non-prime
if (!prime[i])
continue;
// Update difference
int dif = n - i;
// If difference is a
// perfect square
if (Math.Ceiling((double)Math.Sqrt(dif)) ==
Math.Floor((double)Math.Sqrt(dif)))
{
// If true, update flag
// and break out of loop
flag = true;
break;
}
}
// If N can be expressed as sum
// of prime number and perfect square
if (flag)
{
Console.WriteLine("Yes");
}
else
Console.WriteLine("No");
}
// Driver Code
public static void Main()
{
int N = 27;
sumOfPrimeSquare(N);
}
}
// This code is contributed by ukasp
JavaScript
<script>
// Javascript program for the above approach
// Function to store all prime
// numbers less than or equal to N
function SieveOfEratosthenes(prime, n)
{
// Update prime[0] and
// prime[1] as false
prime[0] = false;
prime[1] = false;
// Iterate over the range [2, sqrt(N)]
for(let p = 2; p * p <= n; p++)
{
// If p is a prime
if (prime[p] == true)
{
// Update all multiples of p
// which are <= n as non-prime
for(let i = p * p; i <= n; i += p)
{
prime[i] = false;
}
}
}
}
// Function to check whether a number
// can be represented as the sum of a
// prime number and a perfect square
function sumOfPrimeSquare(n)
{
let flag = false;
// Stores all the prime numbers
// less than or equal to n
let prime = new Array(n + 1).fill(true);
// Update the array prime[]
SieveOfEratosthenes(prime, n);
// Iterate over the range [0, n]
for(let i = 0; i <= n; i++)
{
// If current number
// is non-prime
if (!prime[i])
continue;
// Update difference
let dif = n - i;
// If difference is a
// perfect square
if (Math.ceil(Math.sqrt(dif)) ==
Math.floor(Math.sqrt(dif)))
{
// If true, update flag
// and break out of loop
flag = true;
break;
}
}
// If N can be expressed as sum
// of prime number and perfect square
if (flag)
{
document.write("Yes");
}
else
document.write("No");
}
// Driver Code
let N = 27;
sumOfPrimeSquare(N);
// This code is contributed by subhammahato348
</script>
Time Complexity: O(N * log(log(N)))
Auxiliary Space: O(N)
Similar Reads
Check if a number can be written as a sum of 'k' prime numbers Given two numbers N and K. We need to find out if 'N' can be written as sum of 'K' prime numbers. Given N <= 10^9 Examples : Input : N = 10 K = 2 Output : Yes 10 can be written as 5 + 5 Input : N = 2 K = 2 Output : NoRecommended PracticePrimes sumTry It! The idea is to use Goldbach's conjecture w
8 min read
Check if a number can be expressed as product of a prime and a composite number Given a number N, the task is to check if N can be represented as the product of a prime and a composite number or not. If it can, then print Yes, otherwise No. Examples: Input: N = 52 Output: YesExplanation: 52 can be represented as the multiplication of 4 and 13, where 4 is a composite and 13 is a
12 min read
Count of ways to represent N as sum of a prime number and twice of a square Given an integer N, the task is to count the number of ways so that N can be written as the sum of a prime number and twice of a square, i.e. N = 2*A^{2} + P , where P can be any prime number and A is any positive integer. Note: N <= 10^{6} Examples: Input: N = 9 Output: 1 Explanation: 9 can be r
8 min read
Check whether a number can be represented as difference of two squares Given a number N, the task is to check if this number can be represented as the difference of two perfect squares or not. Examples: Input: N = 3 Output: Yes Explanation: 22 - 11 = 3 Input: N = 10 Output: No Approach: The idea is that all the numbers can be represented as the difference of two square
6 min read
Find smallest perfect square number A such that N + A is also a perfect square number Given a positive number N. The task is to find out the smallest perfect square number A such that N + A is also a perfect square number or return -1.Examples: Input: N = 3 Output: 1 Explanation: As 1 + 3 = 4 = 22 Input: N=1 Output: -1 Naive Approach: Traverse M from {1, 2, 3, 4, 5...} and check whet
9 min read
Find smallest perfect square number A such that N + A is also a perfect square number Given a positive number N. The task is to find out the smallest perfect square number A such that N + A is also a perfect square number or return -1.Examples: Input: N = 3 Output: 1 Explanation: As 1 + 3 = 4 = 22 Input: N=1 Output: -1 Naive Approach: Traverse M from {1, 2, 3, 4, 5...} and check whet
9 min read