Timus Online Judge 网站上有这么一道题目:1356. Something Easier。这道题目的输入是一组  2 到 109 之间整数,对于每个输入的整数,要求用最少个数的素数的和来表示。这道题目的时间限制是 1 秒。

我们知道著名的哥德巴赫猜想是:任何一个充分大的偶数都可以表示为两个素数之和。

于是我们有以下的 C 语言程序:

// http://acm.timus.ru/problem.aspx?space=1&num=1356

#include

#include

#include

#include

// http://en.wikipedia.org/wiki/Prime_number_theorem

#define PRIME_MAX 10000

#define PRIME_COUNT 1229

typedef unsigned long long U8;

typedef char bool;

const bool true = 1;

const bool false = 0;

// http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

bool* getSieve(int max)

{

static bool sieve[(PRIME_MAX >> 1) + 1];

int i, j, imax = sqrt(max);

for (i = 3; i <= imax; i += 2)

if (!sieve[i >> 1])

for (j = i * i; j <= max; j += i << 1) sieve[j >> 1] = true;

return sieve;

}

int* getPrimes(int max)

{

static int primes[PRIME_COUNT + 1];

bool *sieve = getSieve(max);

int i, j = 0;

for (primes[j++] = 2, i = 3; i <= max; i += 2)

if (!sieve[i >> 1]) primes[j++] = i;

return primes;

}

U8 modMultiply(U8 a, U8 b, U8 m)

{

return a * b % m;

}

U8 modPow(U8 a, U8 b, U8 m)

{

U8 v = 1, p;

for (p = a % m; b > 0; b >>= 1, p = modMultiply(p, p, m))

if (b & 1) v = modMultiply(v, p, m);

return v;

}

bool witness(U8 a, U8 n)

{

U8 n1 = n - 1, s2 = n1 & -n1, x = modPow(a, n1 / s2, n);

if (x == 1 || x == n1) return false;

for (; s2 > 1; s2 >>= 1)

{

x = modMultiply(x, x, n);

if (x == 1) return true;

if (x == n1) return false;

}

return true;

}

U8 random(U8 high)

{

// http://www.cppreference.com/wiki/c/other/rand

return (U8)(high * (rand() / (double)RAND_MAX));

}

// http://en.wikipedia.org/wiki/Miller-Rabin_primality_test

// n, an integer to be tested for primality

// k, a parameter that determines the accuracy of the test

bool probablyPrime(U8 n, int k)

{

if (n == 2 || n == 3) return 1;

if (n < 2 || n % 2 == 0) return 0;

while (k-- > 0) if (witness(random(n - 3) + 2, n)) return false;

return true;

}

bool isPrime(int n)

{

return probablyPrime(n, 2);

}

int outEven(int primes[], int n)

{

int i, p, q;

for (i = 0; (p = primes[i]) != 0; i++)

if (isPrime(q = n - p))

return printf("%d %d", p, q);

return printf("error:%d", n);

}

int main(void)

{

int t, n, *primes = getPrimes(PRIME_MAX);

srand(time(NULL));

scanf("%d", &t);

while (t-- > 0)

{

scanf("%d", &n);

if (isPrime(n)) printf("%d", n);

else if ((n & 1) == 0) outEven(primes, n);

else if (isPrime(n - 2)) printf("2 %d", n - 2);

else printf("3 "), outEven(primes, n - 3);

puts("");

}

return 0;

}

根据哥德巴赫猜想,充分大的偶数 n = p + q,这里 p <= q 是素数。我们猜测当 n <= 109 时,p < 104。第 8 行就是定义 p 的最大值。

根据素数定理,我们知道 104 以内的素数有 1229 个。第 9 行就是定义程序中要用到的素数的个数。

第 17 到 26 行的 getSieve 函数用埃拉托斯特尼筛法筛选出素数。

第 28 到 36 行的 getPrimes 函数从筛中取出这些素数。

第 38 到 79 行的一系列函数最终是为了 probablyPrime 函数,用于检测素数。请参见我在2010年7月写的随笔:【算法】米勒-拉宾素性检验。

第 81 到 84 行的 isPrime 函数调用 probablyPrime 函数来检测素数。

第 86 到 93 行的 outEven 函数对大于 2 的偶数验证哥德巴赫猜想,即输出一对素数 p 和 q。

第 95 到 110 行是 main 函数。其中:

第 103 行处理 n 是素数的情况,直接输出该素数(包括素数 2,所以 outEven 函数处理的偶数肯定大于 2)。

第 104 行对大于 2 的偶数输出一对素数(通过调用 outEven 函数,强哥德巴赫猜想)。

第 105 行处理大于 5 的奇数能够分解为 2 和另外一个素数的和的情况(注意不要遗漏这个情形!)。

第 106 行处理大于 5 的奇数的其他情况,首先输出一个 3,然后调用 outEven 函数处理偶数 n - 3 (弱哥德巴赫猜想)。

上述程序在 Timus Online Judge 网站的运行时间是 0.015 秒。

哥德巴赫猜想 php,哥德巴赫猜想的程序验证相关推荐

  1. .验证哥德巴赫猜想,哥德巴赫猜想的内容是:任何一个大于2的偶数都能写成写成两个素数和的形式。 设计一个函数 int isPrime(int n)判断n是否为素数,如果n是素数,函数返回值1,否则返

    .验证哥德巴赫猜想,哥德巴赫猜想的内容是:任何一个大于2的偶数都能写成写成两个素数和的形式. 设计一个函数 int isPrime(int n)判断n是否为素数,如果n是素数,函数返回值1,否则返回0 ...

  2. 在大城市打拼的你,是想留下还是想攒够了钱回家?

    很多人在算一笔经济账,说攒够了钱回家可能能买一套房子,但是人脉和资源是回不去的,你觉得呢?你是想回家还是想留下呢? 转:https://wenda.toutiao.com/#question/6355 ...

  3. OFFTIME for Android 断线时间 手机想都别想

    如今很多App都是力争吸引人的目光,恨不得让人每分每秒都扑在手机上.但是我要介绍的这款OFFTIME for Android,却能让你不胜其烦,时时刻刻都有卸载掉它的冲动,甚至还-无法卸载. OFFT ...

  4. 我想爱,想吃,还想在一瞬间变成天上半明半暗的云。

    好像很久没写东西了,想写点什么,那就随便聊聊吧. 在活着的二十几载里如果没有重大变故好像很少能够想起来之前到底做了什么事情,甚至生离死别似乎也没有了太多的记忆.感觉时间飘飘忽忽莫名其妙就飞走了,抬手一 ...

  5. 想活,想痛痛快快的活

    周末进行了几次有趣的对话,在音乐的陪伴下. 忙,累,挫折,迷茫,不安,寂寞--所有的负面的情绪,都看得到,但是还是看到灰暗眼哞后面的闪光的生命力--想活,活很久,痛痛快快的活--即使生命如此多的不完美 ...

  6. 制药工程专业可以跨考计算机,我是学音乐大三学生想考研,想考别的专业请问能考什么专业比较好考...

    我是学音乐大三学生想考研,想考别的专业请问能考什么专业比较好考以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 我是学音乐 ...

  7. 哥德巴赫猜想 php,哥德巴赫猜想得到彻底解决

    特大错误,引起巨大矛盾,"整数与小数"存在就是自相矛盾,这一重大攻关课题解答: 1742年6月7日,当时还是中学教师的哥德巴赫,写信给当时侨居俄国彼得堡的数学家欧拉一封信,问道:& ...

  8. 欢庆1024之:程序猿不是你想黑,想黑就能黑!

    为什么程序猿们每天能想出这么多段子,却没有人说他们幽默呢?看完这篇文章或许你就明白了. 无论你是首席架构师.代码魔术师.工程师忍者还是软件匠手,都无法改变你是程序猿这个事实.面对即将到来的春节,或许你 ...

  9. 不想工作就想创业?我劝你看完这档综艺再决定

    文|螳螂观察 作者|图霖 新年还没到,部分打工人已经在提前"过冬"了. 近日,阿里.爱奇艺等大厂裁员的新闻接连冲上热搜.不少以为捧着"大厂铁饭碗"的打工人,突然 ...

  10. 总是想逃避不想去面对(又是发牢骚的一天)

    如果你也是有梦想喜欢ACM的道友,可以加一下我,我们一起努力. 我觉得我认识的最强的山理工的去划水了,问个题,讨论个题,也没人回复. 一道题卡3天也根本做不出来,没人讨论,因为网上题解写的不清楚,就没 ...

最新文章

  1. python趋势稳定检验Kwiatkowski-Phillips-Schmidt-Shin
  2. 网络安全界永恒不变的10大安全法则
  3. SQLServer-sysobjects-type
  4. 【PL/SQL】学习笔记 (7)光标的属性,一个会话中打开光标数的限制
  5. 【leetcode-83】剑指 Offer 18-2 删除排序链表中的重复元素
  6. Yii2 behavior运用
  7. ASP.NET WebAPI 中的参数绑定
  8. python中控制代码块逻辑关系_一、Python基础知识
  9. 中国连接系统市场趋势报告、技术动态创新及市场预测
  10. 开始上手docker
  11. 计算机模拟学,深度学习是让计算机模拟
  12. video.h5.player.js视频播放器
  13. 13个提炼卖点的角度,让你的产品大卖!
  14. NBA球队也使用Salesforce?
  15. javascript指定日期增加自然月份(有闰年2月判断)
  16. 比较IC卡、ID卡、M1卡、CPU卡它们之间有什么区别
  17. H5游戏定制,分享专业的TOM游戏制作企业营销平台
  18. 详细设计的工具——PAD图
  19. 剑指offe-机器人的运动范围
  20. js动态加载table,打印table里的内容以及解决打印后的问题

热门文章

  1. 如何划分安全域及网络如何改造
  2. ISCC2017 Misc write up附件题目文件
  3. 数据结构(Java)-排序算法-插入排序
  4. mysql按月查询统计(统计近12个月的项目个数)
  5. uc视频解析去水印原理分析及源码,集齐四大参数,兑换UC视频播放地址
  6. 取消 “是否把IE8设置为默认浏览器提示 提示
  7. 动手学深度学习笔记3.1+3.2+3.3
  8. 软件设计(中线提取)
  9. 银行半结构化面试题目汇总
  10. CSFB(电路域回落)与VoLTE(4G语音承载)