Предположение о гипотезе Гольдбаха (с)
Мой профессор попросил меня составить программу для проверки гипотезы Гольдбаха. Мне интересно, должен ли я считать 1 как простое число. Это мой код, который печатает первую комбинацию простых чисел:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n, i, j, k, l;
char prime, prime1;
do //check if n is even and greater than 2
{
printf("Give me an even natural number greater than 2:\n\n>");
scanf("%d", &n);
}
while (n % 2 != 0 && n >= 2);
for (i = 1; i < n ; i++)
{
prime = 1;
for (k = 2; k < i; k++)
if (i % k == 0)
prime = 0;
if (prime)
{
for (j = 1; j < n; j++)
{
prime1 = 1;
for (l = 2; l < j; l++)
if (j % l == 0)
prime1 = 0;
if (prime1)
if (i + j == n)
{
printf("\n\n%d and %d are the first two prime numbers that add up to %d.\n", i, j, n);
return 0;
}
}
}
}
}
Я проверил интернет, и почти все говорят, что 1 не простое число. Что я должен делать? Сохранить программу как есть или изменить так, чтобы она не рассматривалась как 1 как простое число? И как мне это сделать?:П
2 ответа
Вы можете рассмотреть 1
простое число, как это сделал Гольдбах, или нет, как это принято чаще, оно практически не имеет значения в отношении гипотезы.
принимая во внимание 1
как простое число имеет такой эффект:
- есть решение для
2
:1 + 1
, - первая пара для
4
является1 + 3
вместо2 + 2
- первое решение для более четных чисел может включать
1
если значение представляет собой простое число плюс один, но никакое известное четное число больше 2 не может быть выражено только какp + 1
,
Обратите внимание, что в вашем коде есть проблемы:
Вы не проверяете возвращаемое значение
scanf()
поэтому ввод строки, не являющейся числом, приведет к неопределенному поведению (в первый разn
неинициализирован) или бесконечный цикл какn
больше не изменяется.тест
while (n % 2 != 0 && n >= 2);
неверно: должно быть:while (n <= 2 || n % 2 != 0);
первый цикл может повторяться вдвое длиннее с тестом
i <= n / 2
второй цикл может пройти намного меньше с тестом
k * k <= i
вы можете выйти из второго цикла, когда вы обнаружите, что
i
не простоенет необходимости в третьем цикле, вам просто нужно проверить,
n - i
простоетакие же улучшения возможны для второго основного теста, лучше перенести это в отдельную функцию.
у вас должно быть сообщение и
return
утверждение для удаленной возможности найти контрпример к гипотезе Гольдбаха;-)
Вот улучшенная версия:
#include <stdio.h>
#define PRIME_MASK ((1ULL << 2) | (1ULL << 3) | (1ULL << 5) | (1ULL << 7) |\
(1ULL << 11) | (1ULL << 13) | (1ULL << 17) | (1ULL << 19) | \
(1ULL << 23) | (1ULL << 29) | (1ULL << 31) | (1ULL << 37) | \
(1ULL << 41) | (1ULL << 43) | (1ULL << 47) | (1ULL << 53) | \
(1ULL << 59) | (1ULL << 61))
int isprime(unsigned long long n) {
if (n <= 63)
return (PRIME_MASK >> n) & 1;
if (n % 2 == 0)
return 0;
for (unsigned long long k = 3; k * k <= n; k += 2) {
if (n % k == 0)
return 0;
}
return 1;
}
int main(void) {
unsigned long long n, i;
int r;
for (;;) {
printf("Give me an even natural number greater than 2:\n>");
r = scanf("%llu", &n);
if (r == 1) {
if (n % 2 == 0 && n > 2)
break;
} else
if (r == EOF) { /* premature end of file */
return 1;
} else {
scanf("%*[^\n]%*c"); /* flush pending line */
}
}
#ifdef ONE_IS_PRIME
i = 1; /* start this loop at 1 if you want to assume 1 is prime */
#else
i = (n == 4) ? 2 : 3;
#endif
for (; i <= n / 2; i += 2) {
if (isprime(i) && isprime(n - i)) {
printf("%llu = %llu + %llu\n", n, i, n - i);
return 0;
}
}
printf("Goldbach was wrong!\n"
" %llu cannot be written as the sum of two primes\n", n);
return 0;
}
ВЫ МОЖЕТЕ Рассмотреть 1 как простое число, поскольку Гольдбах тоже считал его главным в своем письме Леонхарду Эйлеру. Но это было время, когда 1 считалось простым. Позднее оно было заброшено, и, следовательно, это третье пересмотренное предположение Гольдбаха. Кроме того, поскольку сегодня мы считаем, что 1 не является ни простым, ни составным, даже если вы не считаете 1 простым числом, гипотеза все еще остается верной, она хорошо проверена до 4*10^18 (повторно проверена до 4*10^17).
Если вы имеете дело с профессором, вам лучше спросить его, чего он хочет.