The Goldbach conjecture is the claim that every double integer greater than 2 can be written as the sum of two prime numbers. It is one of the biggest mathematical problems that cannot be proved.
In the original Goldbach hypothesis, Goldbach claims that every integer greater than 2 can be written as the sum of 3 prime numbers. This claim was put forward with the assumption that the number 1 is the prime number. But now 1 is not a prime number. This claim, which we treat as a Goldbach conjecture, consists of Euler's correction that “every double integer greater than 2 can be written as the sum of two prime numbers".
For example; 4,6,8,10 and 12 numbers can be write as 2 prime number pairs.
4 = 2 + 2
6 = 3 + 3
8 = 3 + 5
10 = 5 + 5
This example C code, which allows a double integer greater than 2 to be written as two prime numbers. E.g. 124620;
124620 = 19 + 124601
#include <stdio.h>
//Function declerations
int is_prime(int n);
void goldbach(int g);
int main(){
int number = 0;
while(1){
printf("Enter even number:");
scanf("%d",&number);
if(number>2 && number%2==0){
goldbach(number);
}
else{
printf("Incorrect number!\n");
}
printf("\n");
}
return 0;
}
//Check is prime number?
int is_prime(int n){
int flag = 1;
for (int j = 2; j < n/2; j++)
{
if((n%j) == 0){
return flag-1;
}
}
return flag;
}
//Goldbach solution of a double integer greater than 2
void goldbach(int g){
int i = 2;
for (int j = g-i; j > 2; j--)
{
if(is_prime(i) == 1 && is_prime(j) == 1)
{
printf("%d = %d + %d\n",g,i,j);
break;
}
i++;
}
}
All two prime pairs. E.g. 16;
16 = 3 + 13
16 = 5 + 11
16 = 11 + 5
16 = 13 + 3
#include <stdio.h>
//Buffer for primes
int primes[100000] = {2};
int j = 0;
//Function declerations
int is_prime(int n);
void goldbach(int g);
int main(){
int number = 0;
while(1){
printf("Enter even number:");
scanf("%d",&number);
if(number>2 && number%2==0){
goldbach(number);
}
else{
printf("Incorrect number!\n");
}
printf("\n");
}
return 0;
}
//Check is prime?
int is_prime(int n){
int flag = 1;
for (int j = 2; j < n/2; j++)
{
if((n%j) == 0){
return flag-1;
}
}
return flag;
}
//Goldbach solutions of a double integer greater than 2.
void goldbach(int g){
int flag = 0;
if(primes[j]<g){
for (int i = primes[j]+1; i < g; i++)
{
if(is_prime(i) == 1){
j++;
primes[j] = i;
}
}
}
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j; k++)
{
if(primes[i] + primes[k] == g){
printf("%d = %d + %d\n",g,primes[i],primes[k]);
break;
}
}
}
}
Top comments (4)
Your code probably does its job (haven't tried it) but I suggest some refactorings:
You can easily avoid the global variables
primes
andj
by declaring them insidemain
. Yes, you will have to pass additional arguments togoldbach
but that's fine.It is hard to understand what the meaning of
j
is. You should use a more expressive name likelast_prime_index
.In
is_prime
you declare another variablej
which shadows the globalj
. This can easily cause errors.In
is_prime
, instead ofj < n/2
, you should check ifj <= sqrt(n)
. This will make your code much more performant for larger numbers.In
is_prime
, instead of declaring aflag
, you could simply return 0 or 1.In
goldbach
, theflag
variable is not used.The
goldbach
function does two different things, calculation and output. It could be split into two separate functions.You should check if
j < 100000
before incrementing it.include
int is_prime(int);
void f(int);
int main()
{
int n;
scanf("%d",&n);
f(n);
}
int is_prime(int a)
{
int i;
for(i=2;i*i<=a;i++)
{
if(a%i==0)
return(0);
if(i*i>a)
return(1);
}
}
void f(int n)
{
int a,b,i,j;
for(i=2;i<=n;i++)
{
a=i;
if(is_prime(a))
{
b=n-a;
}
if(is_prime(b))
{
printf("%d=%d+%d",n,a,b);
break;
}
}
}
this code work with the number 4 and 6
Why the first code doesn't work with the number 4 ?