Goldbach’s conjecture is one of the oldest and best-known unsolved problems in the number theory of mathematics. Every even integer greater than 2 can be expressed as the sum of two primes.
Examples:
Input : n = 44
Output : 3 + 41 (both are primes)
Input : n = 56
Output : 3 + 53 (both are primes)
Approach: 1
- Find the prime numbers using Sieve of Sundaram
- Check if the entered number is an even number greater than 2 or not, if no return.
- If yes, then one by one subtract a prime from N and then check if the difference is also a prime. If yes, then express it as a sum.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
const int MAX = 10000;
vector < int > primes;
void sieveSundaram()
{
bool marked[MAX/2 + 100] = {0};
for ( int i=1; i<=( sqrt (MAX)-1)/2; i++)
for ( int j=(i*(i+1))<<1; j<=MAX/2; j=j+2*i+1)
marked[j] = true ;
primes.push_back(2);
for ( int i=1; i<=MAX/2; i++)
if (marked[i] == false )
primes.push_back(2*i + 1);
}
void findPrimes( int n)
{
if (n<=2 || n%2 != 0)
{
cout << "Invalid Input \n" ;
return ;
}
for ( int i=0 ; primes[i] <= n/2; i++)
{
int diff = n - primes[i];
if (binary_search(primes.begin(), primes.end(), diff))
{
cout << primes[i] << " + " << diff << " = "
<< n << endl;
return ;
}
}
}
int main()
{
sieveSundaram();
findPrimes(4);
findPrimes(38);
findPrimes(100);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int MAX = 10000 ;
static ArrayList<Integer> primes = new ArrayList<Integer>();
static void sieveSundaram()
{
boolean [] marked = new boolean [MAX / 2 + 100 ];
for ( int i = 1 ; i <= (Math.sqrt(MAX) - 1 ) / 2 ; i++)
for ( int j = (i * (i + 1 )) << 1 ; j <= MAX / 2 ; j = j + 2 * i + 1 )
marked[j] = true ;
primes.add( 2 );
for ( int i = 1 ; i <= MAX / 2 ; i++)
if (marked[i] == false )
primes.add( 2 * i + 1 );
}
static void findPrimes( int n)
{
if (n <= 2 || n % 2 != 0 )
{
System.out.println( "Invalid Input " );
return ;
}
for ( int i = 0 ; primes.get(i) <= n / 2 ; i++)
{
int diff = n - primes.get(i);
if (primes.contains(diff))
{
System.out.println(primes.get(i) +
" + " + diff + " = " + n);
return ;
}
}
}
public static void main (String[] args)
{
sieveSundaram();
findPrimes( 4 );
findPrimes( 38 );
findPrimes( 100 );
}
}
|
Python3
import math
MAX = 10000 ;
primes = [];
def sieveSundaram():
marked = [ False ] * ( int ( MAX / 2 ) + 100 );
for i in range ( 1 , int ((math.sqrt( MAX ) - 1 ) / 2 ) + 1 ):
for j in range ((i * (i + 1 )) << 1 ,
int ( MAX / 2 ) + 1 , 2 * i + 1 ):
marked[j] = True ;
primes.append( 2 );
for i in range ( 1 , int ( MAX / 2 ) + 1 ):
if (marked[i] = = False ):
primes.append( 2 * i + 1 );
def findPrimes(n):
if (n < = 2 or n % 2 ! = 0 ):
print ( "Invalid Input" );
return ;
i = 0 ;
while (primes[i] < = n / / 2 ):
diff = n - primes[i];
if diff in primes:
print (primes[i], "+" , diff, "=" , n);
return ;
i + = 1 ;
sieveSundaram();
findPrimes( 4 );
findPrimes( 38 );
findPrimes( 100 );
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int MAX = 10000;
static List< int > primes = new List< int >();
static void sieveSundaram()
{
Boolean[] marked = new Boolean[MAX / 2 + 100];
for ( int i = 1; i <= (Math.Sqrt(MAX) - 1) / 2; i++)
for ( int j = (i * (i + 1)) << 1; j <= MAX / 2; j = j + 2 * i + 1)
marked[j] = true ;
primes.Add(2);
for ( int i = 1; i <= MAX / 2; i++)
if (marked[i] == false )
primes.Add(2 * i + 1);
}
static void findPrimes( int n)
{
if (n <= 2 || n % 2 != 0)
{
Console.WriteLine( "Invalid Input " );
return ;
}
for ( int i = 0 ; primes[i] <= n / 2; i++)
{
int diff = n - primes[i];
if (primes.Contains(diff))
{
Console.WriteLine(primes[i] +
" + " + diff + " = " + n);
return ;
}
}
}
public static void Main (String[] args)
{
sieveSundaram();
findPrimes(4);
findPrimes(38);
findPrimes(100);
}
}
|
PHP
<?php
$MAX = 10000;
$primes = array ();
function sieveSundaram()
{
global $MAX , $primes ;
$marked = array_fill (0, (int)( $MAX / 2) +
100, false);
for ( $i = 1; $i <= (sqrt( $MAX ) - 1) / 2; $i ++)
for ( $j = ( $i * ( $i + 1)) << 1;
$j <= $MAX / 2; $j = $j + 2 * $i + 1)
$marked [ $j ] = true;
array_push ( $primes , 2);
for ( $i = 1; $i <= $MAX / 2; $i ++)
if ( $marked [ $i ] == false)
array_push ( $primes , 2 * $i + 1);
}
function findPrimes( $n )
{
global $MAX , $primes ;
if ( $n <= 2 || $n % 2 != 0)
{
print ( "Invalid Input \n" );
return ;
}
for ( $i = 0; $primes [ $i ] <= $n / 2; $i ++)
{
$diff = $n - $primes [ $i ];
if (in_array( $diff , $primes ))
{
print ( $primes [ $i ] . " + " .
$diff . " = " . $n . "\n" );
return ;
}
}
}
sieveSundaram();
findPrimes(4);
findPrimes(38);
findPrimes(100);
?>
|
Javascript
<script>
let MAX = 10000;
let primes = new Array();
function sieveSundaram()
{
let marked = new Array(parseInt(MAX / 2) + 100).fill( false );
for (let i = 1; i <= (Math.sqrt(MAX) - 1) / 2; i++)
for (let j = (i * (i + 1)) << 1;
j <= MAX / 2; j = j + 2 * i + 1)
marked[j] = true ;
primes.push(2);
for (let i = 1; i <= MAX / 2; i++)
if (marked[i] == false )
primes.push(2 * i + 1);
}
function findPrimes(n)
{
if (n <= 2 || n % 2 != 0)
{
document.write( "Invalid Input <br>" );
return ;
}
for (let i = 0; primes[i] <= n / 2; i++)
{
let diff = n - primes[i];
if (primes.includes(diff))
{
document.write(primes[i] + " + " + diff + " = " + n + "<br>" );
return ;
}
}
}
sieveSundaram();
findPrimes(4);
findPrimes(38);
findPrimes(100);
</script>
|
Output
2 + 2 = 4
7 + 31 = 38
3 + 97 = 100
Time Complexity: O(n log n)
Auxiliary Space: O(MAX)
A Goldbach number is a positive integer that can be expressed as the sum of two odd primes. Since four is the only even number greater than two that requires the even prime 2 in order to be written as the sum of two primes, another form of the statement of Goldbach’s conjecture is that all even integers greater than 4 are Goldbach numbers.
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.
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 geeks!
Last Updated :
13 Sep, 2023
Like Article
Save Article