Goldbach’s other conjecture
It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square.
9=7+2×1^2
15=7+2×2^2
21=3+2×3^2
25=7+2×3^2
27=19+2×2^2
33=31+2×1^2It turns out that the conjecture was false.
What is the smallest odd composite that cannot be written as the sum of a prime and twice a square?
哥德巴赫的另一个猜想
克里斯蒂安·哥德巴赫曾经猜想,每个奇合数都可以写成一个素数和一个平方的两倍之和。
9=7+2×1^2
15=7+2×2^2
21=3+2×3^2
25=7+2×3^2
27=19+2×2^2
33=31+2×1^2最终这个猜想被推翻了。
不能写成一个素数和一个平方的两倍之和的最小奇合数是多少?
这个题目,通过枚举来实现,枚举每个数,去减去比他小的素数,然后再通过二分来找余数的是否可以构成2 * i^2,最终这样可以找到不满足这个条件的第一个数;
1.线性筛,将质数筛出来
2.二分找平方和的两倍
3.枚举,减去比他小的素数,再二分查找;
下面的代码实现:
#include <stdio.h> #define MAX_N 100000 int prime[MAX_N + 5]; int func(int x) { return 2 * x * x; } int find(int a, int x) {//二分查找当前是有平方和两倍的数 int l = 1, r = x, mid; while (r >= l) { mid = (l + r) >> 1; if (func(mid) == a) return 1; else if (func(mid) < a) l = mid + 1; else r = mid - 1; } return 0; } int is_gede_number(int x) {// int a, i = 1; a = prime[i]; while (a < x && i <= prime[0]) { if (find(x - a, x)) return 1;//满足题目条件返回1 a = prime[++i]; } return 0; } int main() { for (int i = 2; i <= MAX_N; i++) {//线性筛 if (!prime[i]) prime[++prime[0]] = i; if (prime[i] && (i & 1) && !is_gede_number(i)) {//为合数,为奇数,并且不满足题目条件,if条件语句才成立 printf("%d\n", i); break; } for (int j = 1; i * prime[j] <= MAX_N; j++) { prime[i * prime[j]] = 1; if (i % prime[j] == 0) break; } } return 0; }
线性筛在我文章欧拉计划第七题里面有讲述;
最终答案:5777