网友过招老杨:Gauss和Poincare数学问题的另类解法

大家应该还记得前几天我们的一篇文章:用SQL解一道有趣的数学题:Gauss和Poincare ,错过的朋友请先回顾。感谢网友的反馈,发来新的解法一则。

如网友所言:这个解法并没有颠覆性原解法,只是在一些数学逻辑上稍微有些不同,体现在SQL建模上的少许不同。

问题提出

这是一个流传已久的故事:

Gauss和Poincare在天堂相遇了,上帝说:你们都是人间最伟大的数学家,那我来出道题考考你们谁更聪明。我在左手写一个大于1小于100的数,在右手同样写一个大于1小于100的数,然后把他们的和写在Gauss手上,把积写在Poincare手上,看看你们能不能猜出这两个数字是几。

Gauss看了手上的数字,说:“我不知道这两个数字是几,可我保证Poincare也不知道。”

Poincare看了手上的数字,说:“我原来的确不知道那两个数字是几,可我现在知道了。”

Gauss说:“那我也知道了。”

问题:那两个数字是几?

网友新解

先看SQL逻辑和结果:

SQL> WITH T_NUM AS 2 (SELECT ROWNUM + 1 NUM FROM DUAL CONNECT BY LEVEL < 99) 3 SELECT A, B 4 FROM 5 ( 6 SELECT A, B,TOTAL,MUL,MUL_M, 7 COUNT(DECODE(MUL_M, 1, 1)) OVER (PARTITION BY TOTAL) MUL_N 8 FROM 9 ( 10 SELECT A, B,TOTAL,MUL,MUL_M 11 FROM 12 ( 13 SELECT 14 A, 15 B, 16 MUL, 17 TOTAL, 18 COUNT(TOTAL) OVER (PARTITION BY MUL) MUL_M 19 FROM 20 ( 21 SELECT 22 A, 23 B, 24 A + B TOTAL, 25 A * B MUL 26 FROM 27 (SELECT A.NUM A, 28 B.NUM B 29 FROM T_NUM A, T_NUM B 30 WHERE A.NUM+B.NUM-2 in( 31 SELECT NUM 32 FROM 33 ( 34 SELECT A.NUM * B.NUM NUM FROM T_NUM A, T_NUM B 35 WHERE A.NUM <= B.NUM 36 AND A.NUM > 1 37 AND B.NUM > 1 38 ) 39 WHERE MOD(NUM,2)=1 AND NUM < 99 40 ) 41 AND A.NUM < B.NUM 42 ) 43 ) 44 ) 45 WHERE MUL_M=1 46 ) 47 ) 48 WHERE MUL_N = 1; A B ---------- ---------- 4 13

剖析说明如下

高斯知道两数之和,不知道两数之积,但却可以肯定的说庞加莱不知道两数是什么。这说明两数之和决定了其对应的两数之积不可能分解为两个素因子。而根据哥德巴赫猜想(没错,就是陈景润做出了至今最好成绩中国人耳熟人详的那个猜想):任一大于2的偶数都可以写成两个素数之和。

这也就是说高斯看到的那个两数之和肯定不是偶数,一定是一个奇数。而一个奇数要写成两个素数的和,一定要包含2这个最小的素数,所以两数之和只要是2+奇合数的形式就一定不能表示成两个素数之和的形式。

分析下最内层的SQL:

21 SELECT 22 A, 23 B, 24 A + B TOTAL, 25 A * B MUL 26 FROM 27 (SELECT A.NUM A, 28 B.NUM B 29 FROM T_NUM A, T_NUM B 30 WHERE A.NUM+B.NUM-2 in( 31 SELECT NUM 32 FROM 33 ( 34 SELECT A.NUM * B.NUM NUM FROM T_NUM A, T_NUM B 35 WHERE A.NUM <= B.NUM 36 AND A.NUM > 1 37 AND B.NUM > 1 38 ) 39 WHERE MOD(NUM,2)=1 AND NUM < 99 40 ) 41 AND A.NUM < B.NUM 42 )

这一层的意思是构造出所有的两数之和减2的结果是奇数且是合数的所有可能性。到了这一步,高斯看到的两数之和就可以肯定的说,庞加莱一定不知道这两个数是什么。

接下来的一步,实现庞加莱知道了两个数是什么。

10 SELECT A, B,TOTAL,MUL,MUL_M 11 FROM 12 ( 13 SELECT 14 A, 15 B, 16 MUL, 17 TOTAL, 18 COUNT(TOTAL) OVER (PARTITION BY MUL) MUL_M 19 FROM 20 ( 21 SELECT 22 A, 23 B, 24 A + B TOTAL, 25 A * B MUL 26 FROM 27 (SELECT A.NUM A, 28 B.NUM B 29 FROM T_NUM A, T_NUM B 30 WHERE A.NUM+B.NUM-2 in( 31 SELECT NUM 32 FROM 33 ( 34 SELECT A.NUM * B.NUM NUM FROM T_NUM A, T_NUM B 35 WHERE A.NUM <= B.NUM 36 AND A.NUM > 1 37 AND B.NUM > 1 38 ) 39 WHERE MOD(NUM,2)=1 AND NUM < 99 40 ) 41 AND A.NUM < B.NUM 42 ) 43 ) 44 ) 45 WHERE MUL_M=1

这一步根据两数之积分组后的两数之和只有一种可能性的,也就是MUL_M=1,于是庞加莱就知道了,这两个数是什么。

最后一步,在上一步两数之积只有一种可能性的情况下,两数之和只有一种可能性的,也就是MUL_N=1,于是高斯也知道了这两个数是什么。

注意这个结果是正确的,思路也非常巧妙。于是杨长老忍不住技痒,再次操刀,就有了以下的改变。

杨长老对答

杨长老评价:能利用数学知识和算法来进行解题非常难得。

提几个小的问题:

1.在构造数组的时候已经排除了A和B等于1的情况

WITH T_NUM AS

(SELECT ROWNUM + 1 NUM FROM DUAL CONNECT BY LEVEL < 99)

因此36行和37行的判断不需要:

AND A.NUM > 1

AND B.NUM > 1

2.通过数学算法可以过滤掉一部分数据,可惜SQL上实现过滤的方法比较复杂,反而造成了更多的嵌套,单次执行逻辑读接近5000,根据楼主的含义进行了一下改写,逻辑读可以降到230左右:

WITH T_NUM AS (SELECT ROWNUM + 1 NUM FROM DUAL CONNECT BY LEVEL < 99), T_ALL AS (SELECT A.NUM A, B.NUM B, A.NUM + B.NUM TOTAL, A.NUM * B.NUM MUL FROM T_NUM A, T_NUM B WHERE A.NUM <= B.NUM) SELECT A, B FROM ( SELECT A, B,TOTAL,MUL,MUL_M, COUNT(DECODE(MUL_M, 1, 1)) OVER (PARTITION BY TOTAL) MUL_N FROM ( SELECT A, B,TOTAL,MUL,MUL_M FROM ( SELECT A, B, MUL, TOTAL, COUNT(TOTAL) OVER (PARTITION BY MUL) MUL_M FROM ( SELECT * FROM T_ALL WHERE A != B AND TOTAL - 2 IN ( SELECT MUL FROM T_ALL WHERE MOD(A, 2) = 1 AND MOD(B, 2) = 1 AND MUL < 99 ) ) ) WHERE MUL_M=1 ) ) WHERE MUL_N = 1;

不仅要实现功能,还是关注性能,这是SQL开发的精髓所在。

大家可以体验一下杨长老的强大底蕴和功力,而云和恩墨SQL审核产品和服务正是致力于提升SQL性能,改善用户体验。

近期文章

删繁就简-云和恩墨的一道面试题解析

用SQL解一道数学题:Gauss和Poincare

新年贺礼:云和恩墨大讲堂期刊发行

2015 Oracle 十大热门文章精选

Oracle 12c ASM 防火防盗新特性揭秘

DBA入门之路:学习与进阶之经验谈

DBA入门之路:关于日常工作的建议

数据驱动,成就未来。整合业界顶尖的技术与合作伙伴资源,围绕数据及相关领域,提供解决方案和专业服务。

业务架构

电子渠道(网络销售)分析系统、数据治理

IT基础架构

分布式存储解决方案

数据架构

Oracle DB2 MySQL NoSQL

专项服务:架构/安全/容灾/优化/整合/升级/迁移

运维服务:运维服务 代维服务

人才培养:个人认证 企业内训

软件产品:SQL审核、监控、数据恢复

应用架构

应用软件和中间件:数据建模 | SQL审核和优化 | 中间件服务

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-01-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

微信课堂:化解控制文件归档日志查询缓慢及ASM执行计划一则

在我们的技术讨论群『云和恩墨大讲堂』中,还有日常的微信互动中,经常有朋友会提出一些有趣的小问题,在空闲的时候,我希望能够记录下来,和大家做一点小分享,以点滴的知...

904
来自专栏杨建荣的学习笔记

通过addm分析io问题(r2笔记64天)

昨晚在做测试环境数据迁移的时候,遇到了io的问题,本来预计2,3个小时完成的数据导入工作最后竟然耗了7个多小时。在数据的导入中,使用了10个并行的sessio...

2606
来自专栏黄希彤的专栏

Discuz! 论坛使用云数据库可能遭遇随机的“The table XXX is full”异常

一个Discuz! 论坛在腾讯云已经良好工作了很久,不久前突然随机出现以下错误:从字面意思上看,就是数据表“common_visit”满了写不进去,最可能的就是...

2940
来自专栏数据和云

数据恢复:ORA-600 2662 错误的SCN增进应对

正文: 在损失了日志,进行基于损坏的恢复时,可能会因为_allow_resetlogs_corruption参数的使用而收到ORA-600 2662的错误报告。...

30111
来自专栏SAP最佳业务实践

想学FM系列(8)-SAP FM模块:主数据(6)-主数据细分

3.1.5 主数据的细分 FM模块还提供了对账户分配要素主数据的细分支持,将账户分配要素的主数据,按照企业需要的规则来细分段,每一段的单独编码都有着相应的含意,...

3539
来自专栏杨建荣的学习笔记

关于MySQL学习大纲(r5笔记第26天)

首先需要自我反省,因为自己圈内朋友中MySQL大牛太多,自己就先班门弄斧了,莫见怪:) 前段时间很荣幸通过了YEP(Young Expert Program)的...

4068
来自专栏社区的朋友们

Amazon Aurora 深度探索(三)

本文从数据库内核技术实现的角度对 Aurora 做了一定的推测。接着对 Aurora 用技术构建起的强大云数据库服务能力进行探索。

3641
来自专栏机器人网

一文带你全面了解发电机!

一、发电机的种类和功能特点 发电机是指受到机械动力的作用时产生电的设备。在这种转换过程中,机械动力来自于各种各样的其他形式的能源,如风能、水能、热能、太阳能等。...

3105
来自专栏大魏分享(微信公众号:david-share)

Ansible如何管理你的云:AWS、Openstack?你的运维也可以很帅!

一、云时代的运维 本文是我和李尧老师一起实验。李尧是红帽高级培训讲师,目前负责红帽中国区员工内部技术培训与认证。 物理机时代的运维,由于设备数量较少,运维人员的...

4656
来自专栏杨建荣的学习笔记

了解一下SQL Server

说实话,我在大学的时候用了下SQL Server,自从工作以来一直没有接触过SQL Sever,越是不接触越是排斥,也是不了解越是排斥,所以花点时间了解下自...

3195

扫码关注云+社区