去年年初的时候,我曾经发布过某专业课期末作业研究过程中带来的一个有趣的副产品:汉字的字义网络图。不过,当时我是直接调用的 Mathematica 的相关函数,函数几乎不能调整参数,并且也无法处理边上权重不同的情况。最近在研究引力斥力绘图算法,突然想到把当时的数据重新画一张图。于是就有了汉字地图第二版(点击小图看大图):
算法
如此保证选举公正性能成吗?
一个小镇上即将进行大选,候选人有 m ≥ 3 个,选民一共有 n 人。选举时,每个选民在选票上写下一个候选人的名字,然后由计算机根据某种选举机制算出大选的获胜者来。如果把 n 个选民的选票依次记为 x1, x2, …, xn 的话,那么选举机制的算法其实就是一个映射到 {1, 2, …, m} 的函数 f(x1, x2, …, xn) 。
为了保证选举程序的公平性,让每个人手中的选票都能发挥作用,政府提出了“差异性原则”:如果每个人的选票都变了,那么竞选的获胜者也应当改变。也就是说,如果对于所有的 i 都有 xi ≠ yi ,那么必有 f(x1, x2, …, xn) ≠ f(y1, y2, …, yn) 。选票系统的算法虽然不是透明的,但政府保证,这个算法满足差异性原则。
差异性原则真的能够保证,每个选民的选票都有足够的权力吗?不是。差异性原则看似很强,但实际情况则是,它不但不能保证每张选票都能影响选举结果,甚至还无法避免有选民独裁选举结果的现象发生。更不可思议的是,事实上独裁现象是必然会发生的——独裁是差异性原则的必然推论!下面我们将证明,对于任意一种满足差异性原则的选票算法,我们都能找到这样一个选民,他的选票独裁了选举结果,获胜者是谁完全由他的选票决定,与其他人的选票无关。
趣题:只允许加倍操作的水桶倒水问题
今天的题目来自这里。有三个水桶,它们里面分别装了 a 升的水、 b 升的水和 c 升的水(其中 a 、 b 、 c 都是正整数,桶本身没有容量限制)。你可以把水从一个桶倒进另一个桶,但必须保证让后者的水量刚好变成原来的两倍。证明,不管 a 、 b 、 c 是多少,你总能让其中某一个水桶变空。
例如,假设初始时 (a, b, c) = (3, 2, 1) ,那么你可以先把 (3, 2, 1) 变成 (1, 4, 1) ,再把它变成 (2, 4, 0) ,从而把第三个水桶变空。
趣题:旋转桌子避免灯泡全亮
网友 @ipondering 分享了一个非常精彩的数学趣题集,里面有很多我之前从没见过的趣题,其中有些问题的题目和解答都相当漂亮。近段时间里,我打算从中选一些最精彩的题目来讲讲。今天的题目是该趣题集中的第二题,原题背景涉及到 King Arthur 和 Merlin 的故事,我就舍去简化了。
某个国王手下有 n 个大臣。国王定期主持国家会议,届时 n 个大臣将会间隔均匀地坐在圆桌上。每个座位前都有一盏照明灯,只有所有的灯都亮了,会议才能开始进行。如果有些灯没亮,国王会下达指令,让指定位置上的大臣按下座位前的灯的开关,把没亮的灯都打开。例如,当 n = 100 时,圆桌上会坐着 100 个大臣。不妨将座位从 1 到 n 顺序编号,假设其中编号为 3 、 28 、 97 的座位前没有亮灯。于是,国王下令这三个位置上的大臣按下各自面前的开关,把这三盏灯打开,这样才能开始会议议程。
在这 n 个大臣中,有一个奸臣。这次会议的议题恰好就是商讨对这个奸臣的惩治办法。奸臣知道自己难逃一劫,但他希望能够无限制地拖延会议。他可以在所有大臣就座前精心设置各个照明灯的初始状态,并在国王每次下达指令之后(但在大臣执行命令之前)把圆桌旋转到一个合适的位置,让大臣们按下错误的开关。
对于哪些 n ,奸臣可以始终保证灯不会全亮,从而无限制地拖延会议?对于哪些 n ,国王可以根据局势巧妙地构造指令,使得有限轮指令之后所有灯必然全亮?
在会议结束前,奸臣仍然是 n 个大臣中的一员。国王每次只能下达形如“座位编号为 a1, a2, a3, … 的大臣改变各自面前的灯的状态”的指令。奸臣可以任意旋转圆桌,改变灯与大臣的对应关系。当然,他也可以选择不旋转圆桌。即使桌子被旋转过,所有大臣也必须严格遵守国王的指令。
八皇后问题算什么,来看看无穷皇后问题吧
当 1848 年国际象棋玩家 Max Bezzel 提出八皇后问题(eight queens puzzle)时,他恐怕怎么也想不到,100 多年以后,这个问题竟然成为了编程学习中最重要的必修课之一。八皇后问题听上去非常简单:把八个皇后放在国际象棋棋盘上,使得这八个皇后互相之间不攻击(国际象棋棋盘是一个 8×8 的方阵,皇后则可以朝横竖斜八个方向中的任意一个方向走任意多步)。虽然这个问题一共有 92 个解,但要想徒手找出一个解来也并不容易。下图就是其中一个解:
八皇后问题有很多变种,不过再怎么也不会比下面这个变种版本更帅:请你设计一种方案,在一个无穷大的棋盘的每一行每一列里都放置一个皇后,使得所有皇后互相之间都不攻击。具体地说,假设这个棋盘的左下角在原点处,从下到上有无穷多行,从左到右有无穷多列,你需要找出一个全体正整数的排列方式 a1, a2, a3, … ,使得当你把第一个皇后放在第一行的第 a1 列,把第二个皇后放在第二行的第 a2 列,等等,那么任意两个皇后之间都不会互相攻击。