Program for Goldbach’s Conjecture (Two Primes with given Sum)
Last Updated :
13 Sep, 2023
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.
Share your thoughts in the comments
Please Login to comment...