大学生校园那些事

哪些的排名不怎么样,但是数学专业很强的学校

数学是科学之母,自然科学之王,也是所有基础学科中理论发展最早最深刻的一个科目。所以,一般的重点院校都十分重视数学的教育,参照教育部学位中心2012年的学科评估,前几名的北京大学、复旦大学、山东大学、中科大、南开大学、清华大学、北京师范大学无一例外都是全国顶级的名校。但是即使是这样,我也可以列举一些学校排名不怎么样,但是数学学科还算比较强的。 大学排名根... 阅读全文

数学是科学之母,自然科学之王,也是所有基础学科中理论发展最早最深刻的一个科目。所以,一般的重点院校都十分重视数学的教育,参照教育部学位中心2012年的学科评估,前几名的北京大学、复旦大学、山东大学、中科大、南开大学、清华大学、北京师范大学无一例外都是全国顶级的名校。但是即使是这样,我也可以列举一些学校排名不怎么样,但是数学学科还算比较强的。

 

大学排名根据上海交通大学ARWU两岸四地大学排名(世界三大大学排名之一,评价科学性高于武书连等争议性排名),数学学科评估根据教育部学位中心2012年学科评估结果(教育部出品,最具有权威性)。

 

1. 首都师范大学:非985211,ARWU排名没有进入中国大陆前60,数学得分77分,与上海交大、华东师大并列13名;统计学排名第15名,当之无愧的专业突出。其数学学院拥有数学和统计学2个一级学科博士学位授予权和数学、统计学2个博士后流动站;设置二级学科博士点8个:基础数学、应用数学、计算数学、概率统计、数学物理、数学教育、数学与信息技术、统计学。基础数学是国家重点学科,数学、统计学是北京市一级重点学科,数学与信息技术是北京市交叉重点学科。其师资有国家首批万人计划领军人才1名,被国际数学家大会邀请作45分钟报告2人,教育部长江学者特聘教授5名、国家杰出青年基金获得者5名、教育部创新团队1个、中组部千人计划入选者2名、国务院学科评议组专家1名。

 

2. 湘潭大学:非985211,ARWU排名没有进入中国大陆前60,数学得分76分,与吉林大学、中山大学、兰州大学并列第16名,成绩非常突出。其数学与计算学院拥有数学、统计学博士后流动站,数学、统计学一级学科博、硕士点,应用统计专业硕士点,数学与应用数学、信息与计算科学、统计学三个本科专业,以及“科学工程计算与数值仿真”湖南省重点实验室、“智能计算与信息处理”教育部重点实验室(与信工院共建)、“国防科技数值算法与模拟”湖南省国防科技重点实验室。

收起全文

辛几何&李代数

BloomFilter——大规模数据处理利器

BloomFilter——大规模数据处理利器

  BloomFilter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。 一.实例   为了说明BloomFilter存在的重要意义,举一个实例:   假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络... 阅读全文

 

  Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。

 

实例 

  为了说明Bloom Filter存在的重要意义,举一个实例:

  假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。给一个URL,怎样知道蜘蛛是否已经访问过呢?稍微想想,就会有如下几种方案:

  1. 将访问过的URL保存到数据库。

  2. 用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以查到一个URL是否被访问过了。

  3. URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库。

  4. Bit-Map方法。建立一个BitSet,将每个URL经过一个哈希函数映射到某一位。

  方法1~3都是将访问过的URL完整保存,方法4则只标记URL的一个映射位。

 

  以上方法在数据量较小的情况下都能完美解决问题,但是当数据量变得非常庞大时问题就来了。

  方法1的缺点:数据量变得非常庞大后关系型数据库查询的效率会变得很低。而且每来一个URL就启动一次数据库查询是不是太小题大做了?

  方法2的缺点:太消耗内存。随着URL的增多,占用的内存会越来越多。就算只有1亿个URL,每个URL只算50个字符,就需要5GB内存。

  方法3:由于字符串经过MD5处理后的信息摘要长度只有128Bit,SHA-1处理后也只有160Bit,因此方法3比方法2节省了好几倍的内存。

  方法4消耗内存是相对较少的,但缺点是单一哈希函数发生冲突的概率太高。还记得数据结构课上学过的Hash表冲突的各种解决方法么?若要降低冲突发生的概率到1%,就要将BitSet的长度设置为URL个数的100倍。

 

  实质上上面的算法都忽略了一个重要的隐含条件:允许小概率的出错,不一定要100%准确!也就是说少量url实际上没有没网络蜘蛛访问,而将它们错判为已访问的代价是很小的——大不了少抓几个网页呗。 

 

Bloom Filter的算法 

 

  废话说到这里,下面引入本篇的主角——Bloom Filter。其实上面方法4的思想已经很接近Bloom Filter了。方法四的致命缺点是冲突概率高,为了降低冲突的概念,Bloom Filter使用了多个哈希函数,而不是一个。

    Bloom Filter算法如下:

    创建一个m位BitSet,先将所有位初始化为0,然后选择k个不同的哈希函数。第i个哈希函数对字符串str哈希的结果记为h(i,str),且h(i,str)的范围是0到m-1 。

 

(1) 加入字符串过程 

 

  下面是每个字符串处理的过程,首先是将字符串str“记录”到BitSet中的过程:

  对于字符串str,分别计算h(1,str),h(2,str)…… h(k,str)。然后将BitSet的第h(1,str)、h(2,str)…… h(k,str)位设为1。

 BloomFilter——大规模数据处理利器

  图1.Bloom Filter加入字符串过程

  很简单吧?这样就将字符串str映射到BitSet中的k个二进制位了。

 

(2) 检查字符串是否存在的过程 

 

  下面是检查字符串str是否被BitSet记录过的过程:

  对于字符串str,分别计算h(1,str),h(2,str)…… h(k,str)。然后检查BitSet的第h(1,str)、h(2,str)…… h(k,str)位是否为1,若其中任何一位不为1则可以判定str一定没有被记录过。若全部位都是1,则“认为”字符串str存在。

 

  若一个字符串对应的Bit不全为1,则可以肯定该字符串一定没有被Bloom Filter记录过。(这是显然的,因为字符串被记录过,其对应的二进制位肯定全部被设为1了)

  但是若一个字符串对应的Bit全为1,实际上是不能100%的肯定该字符串被Bloom Filter记录过的。(因为有可能该字符串的所有位都刚好是被其他字符串所对应)这种将该字符串划分错的情况,称为false positive 。

 

(3) 删除字符串过程 

   字符串加入了就被不能删除了,因为删除会影响到其他字符串。实在需要删除字符串的可以使用Counting bloomfilter(CBF),这是一种基本Bloom Filter的变体,CBF将基本Bloom Filter每一个Bit改为一个计数器,这样就可以实现删除字符串的功能了。

 

  Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。

 

Bloom Filter参数选择 

 

   (1)哈希函数选择

     哈希函数的选择对性能的影响应该是很大的,一个好的哈希函数要能近似等概率的将字符串映射到各个Bit。选择k个不同的哈希函数比较麻烦,一种简单的方法是选择一个哈希函数,然后送入k个不同的参数。

   (2)Bit数组大小选择 

     哈希函数个数k、位数组大小m、加入的字符串数量n的关系可以参考参考文献1。该文献证明了对于给定的m、n,当 k = ln(2)* m/n 时出错的概率是最小的。

     同时该文献还给出特定的k,m,n的出错概率。例如:根据参考文献1,哈希函数个数k取10,位数组大小m设为字符串个数n的20倍时,false positive发生的概率是0.0000889 ,这个概率基本能满足网络爬虫的需求了。  

 

Bloom Filter实现代码 

    下面给出一个简单的Bloom Filter的Java实现代码:

 

import java.util.BitSet;

publicclass BloomFilter 
{
/* BitSet初始分配2^24个bit */ 
privatestaticfinalint DEFAULT_SIZE =1<<25
/* 不同哈希函数的种子,一般应取质数 */
privatestaticfinalint[] seeds =newint[] { 571113313761 };
private BitSet bits =new BitSet(DEFAULT_SIZE);
/* 哈希函数对象 */ 
private SimpleHash[] func =new SimpleHash[seeds.length];

public BloomFilter() 
{
for (int i =0; i < seeds.length; i++)
{
func[i] 
=new SimpleHash(DEFAULT_SIZE, seeds[i]);
}
}

// 将字符串标记到bits中
publicvoid add(String value) 
{
for (SimpleHash f : func) 
{
bits.set(f.hash(value), 
true);
}
}

//判断字符串是否已经被bits标记
publicboolean contains(String value) 
{
if (value ==null
{
returnfalse;
}
boolean ret =true;
for (SimpleHash f : func) 
{
ret 
= ret && bits.get(f.hash(value));
}
return ret;
}

/* 哈希函数类 */
publicstaticclass SimpleHash 
{
privateint cap;
privateint seed;

public SimpleHash(int cap, int seed) 
{
this.cap = cap;
this.seed = seed;
}

//hash函数,采用简单的加权和hash
publicint hash(String value) 
{
int result =0;
int len = value.length();
for (int i =0; i < len; i++
{
result 
= seed * result + value.charAt(i);
}
return (cap -1& result;
}
}
}

收起全文

辛几何&李代数

dla像素衍射临界光圈

dla像素衍射临界光圈

所谓DLA,指Diffraction Limited Aperture,字面直译应该叫做&衍射极限光圈&,不过撞针觉得要做到严格界定,发扬汉语所长,应该称做&像素衍射临界光圈&。 简单的说,当镜头光圈小于某数码相机的&像素衍射临界光圈&时,该相机成像元件的像素点将受到衍射的影响,逐点的分辨率下降。某网站给出的DLA:EOS 50D&&f/7.6EOS ... 阅读全文

所谓DLA,指Diffraction Limited Aperture,字面直译应该叫做“衍射极限光圈”,不过撞针觉得要做到严格界定,发扬汉语所长,应该称做“像素衍射临界光圈”。

 

简单的说,当镜头光圈小于某数码相机的“像素衍射临界光圈”时,该相机成像元件的像素点将受到衍射的影响,逐点的分辨率下降。

 

某网站给出的DLA:

EOS 50D——f/7.6

EOS 450D——f/8.4

EOS 1000D——f/9.3

EOS 400D——f/9.3

EOS 40D——f/9.3

EOS 30D——f/10.3

EOS 20D——f/10.3

EOS 5D Mark II——f/10.3

EOS 1DS Mark III——f/10.3

EOS 350D——f/10.4

EOS 1D Mark III——f/11.4

EOS 1DS Mark II——f/11.6

EOS 300D——f/11.8

EOS 10D——f/11.8

EOS 1D Mark II N——f/12.7

EOS 1D Mark II——f/12.7

EOS 5D——f/13.2

但该站站长比较吝啬,没解释,给机会撞针就好为人师一下咯。

 

这里涉及三个概念,衍射、衍射极限和Rayleigh判据。

 

dla像素衍射临界光圈  
光的衍射(Diffraction)指光在传播路径中,遇到障碍物或小孔(狭缝)时,偏离直线绕过障碍物继续传播的现象。

 

光经过圆形口径后成像,并不会汇聚成绝对的点,而是形成明暗相间,距离不等的同心圆光斑,其中中央斑最大,集中了84%的能量,可以看作衍射扩散的主要部分,被称为Airy Disc(爱里斑)。

 

衍射极限(Diffraction Limit)是指不考虑光学系统几何像差,一个完美光学系统的分辨率仅受衍射(光波波长)限制的情况。

 

Rayleigh判据:如果两个相邻点形成的Airy Disc的角距离小于一个Airy Disc角距离时,这两个点无法分辨。翻译成人话就是如果两成像点(其实是两个斑点)混到一块的时候,自然就分不清了。因此对于光圈为圆形或类圆形的镜头,其衍射极限分辨率就是Airy Disc的直径。

dla像素衍射临界光圈

如果Airy Disc等于数码相机成像元件单个像素尺寸,成像元件的分辨率等于镜头衍射极限分辨率,相机能够充分利用镜头的衍射极限分辨率。如果Airy Disc大于数码相机成像元件单个像素尺寸,则衍射极限分辨率成为瓶颈,成像元件的分辨率无法发挥——用一个像素点分辨一个成像点和十个像素点分辨一个成像点有啥区别?

dla像素衍射临界光圈

衍射极限公式是sinθ=1.22λ/D。其中θ是角分辨率,λ是波长,D是光圈直径。当θ很小时,sinθ约等于tagθ,约等于d/f,其中d是最小分辨尺寸,f是焦距。

 

推导出d/f=1.22λ/D, 推导出f/D=d/1.22λ。f/D就是焦距:光圈直径,这是啥?光圈f/值啊!

 

A=d/(1.22λ)。A是光圈f/值。当d等于成像元件像素点尺寸p时,A就是像素衍射临界光圈。

 

DLA=p/(1.22λ),也就是:

 

Diffraction Limited Aperture=pixel size/(1.22x light wavelength)

 

像素衍射临界光圈=像素尺寸/(1.22x光波波长)

 

所以,像素衍射临界光圈与像素大小(或者说像素数以及成像元件面积)有关。像素数越高也,像素衍射临界光圈越小;成像面积越大,像素衍射临界光圈越大;总之像素密度越大,越不适合用小光圈。

 

另外光的波长λ越小,像素衍射临界光圈越小(f/值越大)。自然光是混合光,可见光波长为380nm-780nm,咱以顺眼的蓝绿色波长(500nm)计算,结果与某网站基本一致。如果用更精确的sinθ以及像素尺寸数据,结果会略有差异。

 

最后想起了一篇专访,Canon表示,随着数码单反像素的增长,少数镜头已经不能满足新型号单反机身的要求。不妨看看50D,对红色波长来说,其像素衍射临界光圈已经只有f/5左右,而很多变焦镜头长焦端最大光圈只有f/5.6,成为影响50D发挥的因素之一。对于高像素小DC来说,设计小光圈也已经有困难。对1470万像素的小DC,撞针不敢多算。

 

最后,撞针一定要提醒:不是说小于衍射临界值的光圈就不可用!!!

 

像素衍射临界光圈确实影响成像,但也只是影响成像的诸多因素之一,对成像的影响也是随着光圈收缩逐级增加的,大量测试证明了这一点。重要的问题是,还需要兼顾景深的要求、兼顾快门的要求,需要小光圈的时候,就应该用小光圈。撞针的老话:成像只能拍第三!

收起全文

辛几何&李代数

巴克豪斯常数

巴克豪斯常数

让被定义为幂序列谁的这项有一个系数等于个素数, (1) (2) 函数有一零点(OEISa088751)。现在让被定义的 ... 阅读全文

 

巴克豪斯常数

巴克豪斯常数被定义为序列谁的巴克豪斯常数这项有一个系数等于巴克豪斯常数素数 巴克豪斯常数

巴克豪斯常数巴克豪斯常数巴克豪斯常数

(1)

巴克豪斯常数巴克豪斯常数巴克豪斯常数

(2)

函数有一零点巴克豪斯常数(OEISa088751)。现在让巴克豪斯常数被定义的

巴克豪斯常数巴克豪斯常数巴克豪斯常数

(3)

巴克豪斯常数巴克豪斯常数巴克豪斯常数

(4)

巴克豪斯常数巴克豪斯常数巴克豪斯常数

(5)

(OEISa030018)。

巴克豪斯常数

然后,巴克豪斯推测

巴克豪斯常数巴克豪斯常数巴克豪斯常数

(6)

巴克豪斯常数巴克豪斯常数巴克豪斯常数

(7)

(OEISa072508)。这一限制随后被证明由P. Flajolet存在。请注意,巴克豪斯常数,这 从收敛半径对 倒数幂级数。

这个连分数巴克豪斯的常数是[ 1,2,5,5,4,1,1,18,1,1,1,1,1,2,…](OEISa074269 ),这是一样的连分数也巴克豪斯常数除了 领先后者的0。

收起全文

辛几何&李代数

新拓扑不变量和新拓扑量子力学,及其在物理学前沿中的应用

段一士教授用过去提出的规范势可分解和具有内部结构的新观点,以及φ-映射拓扑流理论建立了新的拓扑场论和新的拓扑量子力学理论及拓扑流分岔理论,并在许多物理前沿方向和数学上得到重要应用。这一理论是近代拓扑物理和场论方面的重要创新,在国际上处于领先地位。该理论揭示了规范场的几何与拓扑之间的直接内在联系,开辟了拓扑与物理学中新的研究领域。由于这一理论具有严谨性、直观性... 阅读全文

段一士教授用过去提出的规范势可分解和具有内部结构的新观点,以及φ-映射拓扑流理论建立了新的拓扑场论和新的拓扑量子力学理论及拓扑流分岔理论,并在许多物理前沿方向和数学上得到重要应用。这一理论是近代拓扑物理和场论方面的重要创新,在国际上处于领先地位。该理论揭示了规范场的几何与拓扑之间的直接内在联系,开辟了拓扑与物理学中新的研究领域。由于这一理论具有严谨性、直观性和可操作性,因而它有广阔的发展前途和应用前景。

目前他所建立的新拓扑场论和新拓扑量子力学已广泛应用于研究凝聚态物理中固体缺陷的拓扑结构(固体缺陷规范理论创始人D.G.B. Edelen教授认为该理论在这一领域是开创性的);玻色-爱因斯坦凝聚和Chern-Simons场论中涡旋的拓扑量子化及其分岔;超导London方程和高维Ginzburg-Landau模型的拓扑场论;近代超弦理论中p-branes的产生及其拓扑结构。并在国际上首次提出Riemann- Cartan流形中以挠率为基础的新拓扑不变量,研究了早期宇宙中宇宙弦的产生及其分岔理论;还研究了太阳黑子的拓扑结构及其分岔。

 

在数学上,以规范势的分解和φ-映射拓扑流场论为基础,首次得到Chern 示性类密度的直接内在拓扑结构;以及Gauss-Bonnet- Chern密度的内部拓扑结构,揭示了欧拉示性数与矢量场零点指数以及Morse理论的直接内在联系。应该指出段一士教授提出的规范势可分解的观点比最近著名理论物理学家L.D. Faddeev提出的类似观点至少早二十年。段一士教授在1976年曾用此观点研究了非阿贝尔规范场中的磁单极理论,受到杨振宁教授的高度赞赏。

收起全文

辛几何&李代数

Linux过时了- 塔能鲍姆-托瓦兹辩论(Tanenbaum–Torvalds debate)

Linux过时了- 塔能鲍姆-托瓦兹辩论(Tanenbaum–Torvalds debate)

塔能鲍姆-托瓦兹辩论(英语:Tanenbaum&Torvalds debate),由Minix创作者安德鲁&斯图尔特&塔能鲍姆(Andrew Stuart &Andy& Tanenbaum,昵称&安迪&,网络上的代号为&ast&)与Linux核心的作者林纳斯&托瓦兹(Linus Torvalds)之间,进行的网络论战,讨论的主题在于操作系统架构的选择。199... 阅读全文

塔能鲍姆-托瓦兹辩论(英语:Tanenbaum–Torvalds debate),由Minix创作者安德鲁·斯图尔特·塔能鲍姆(Andrew Stuart “Andy” Tanenbaum,昵称“安迪”,网络上的代号为“ast”)与Linux核心的作者林纳斯·托瓦兹(Linus Torvalds)之间,进行的网络论战,讨论的主题在于操作系统架构的选择。1992年在Usenet讨论组群comp.os.minix上发起。塔能鲍姆认为,以微内核架构设计的操作系统,在理论上,比宏内核架构更加优越,Linux采用的宏内核架构是过时的。但是林纳斯·托瓦兹以开发实务上的观点展开反击,并比较Minix与Linux的性能差异。稍后一些著名的黑客也加入讨论,如彼得·麦唐纳(Peter MacDonald,他创造了第一个linux发行版,Softlanding Linux System。他也协助发展了Wine软件)、大卫·米勒(David Stephen Miller,网络昵称为 DaveM,负责Linux核心网络功能以及SPARC平台的制作。他也参与其他开源软件的开发,是GCC督导委员会的成员之一)、曹子德(西奥多·曹,英语:Theodore Y. Ts’o,中文姓名曹子德,小名泰德·曹Ted Tso,他是Linux内核在北美最早的开发者,负责ext2、ext3与ext4档案系统的开发与维护工作。他也是e2fsprogs的开发者。为自由标准组织的创始者之一,也曾担任Linux基金会技术长)。这场辩论影响了Linux核心的设计走向。这场辩论有时也被视为一场口水战。

这个话题在 2006 年塔能鲍姆在 《Computer》杂志发表题为《我们能让操作系统可靠和安全吗?》的文章后被再次提起。尽管塔能鲍姆本人提到,他并不是想借这篇文章重启内核设计的论战,但是这篇文章本身和 Slashdot 技术网站上附加的 1992 年论战的归档共同使战火重燃。

Linux过时了- 塔能鲍姆-托瓦兹辩论(Tanenbaum–Torvalds debate)

林纳斯·托瓦兹(Linus_Torvalds)

托瓦兹通过一个在线论坛反驳了塔能鲍姆的论点,几个技术新闻网站随即开始对其进行报道。这使 Jonathan Shapiro 回应称,大多数经过实际检验的安全可靠的计算机系统,都使用更近似于微内核的模式设计。

辩论过程

虽然初步的辩论显得相对温和,当事人双方仅仅平淡了讨论了有关内核设计的话题。但随着每一轮的发帖,辩论开始逐步变得详细和复杂,甚至跨足于内核设计之外的其它领域,如”微处理器架构将在未来战胜其它架构”,但其中也包括了一些人身攻击、意气之争的言词辩论。除了塔能鲍姆和托瓦兹,Linux开发社区中一些著名黑客也加入辩论,包括彼得·麦唐纳,早期的 Linux 内核开发者和第一个发行版 Softlanding Linux System 的创建者;大卫·米勒,Linux 内核的核心开发者之一;和曹子德,北美洲第一个 Linux 内核开发者。

Linux 是过时的

第一条有关这场辩论的记录,在1992年1月29日,塔能鲍姆在 comp.os.minux 上发表了他的批评。在题为《Linux 是过时的》(Linux is obsolete)的帖子中,塔能鲍姆指出宏内核在整体设计上是有害的。虽然他最初并没有加入高深的技术细节,来解释他认为微内核更好的原因,但他也表明,这关乎可移植性,Linux内核对Intel 80386架构的耦合度太高,但处理器架构的进化很快。不应该在某个特定架构上开发操作系统,所有的操作系统都应该具备可以被移植到其他处理器平台的能力。他提到,在1991年仍然以宏内核来设计操作系统,是“回到1970年代的巨大退步“(a giant step back into the 1970s),现代的操作系统,应该像GNU Hurd一样采用微核心架构。

托瓦兹在一天之后反击,他首先攻击Minix在设计上有缺陷(缺少多线程是一个主要例子)。托瓦兹说,他用自己私人的时间来开发,完全没有获利,免费将代码贡献出去(当时塔能鲍姆的Minix源代码,仍然要购买才能取得),因此,对于Minix设计不良,塔能鲍姆不能用“这只是兴趣”来为来辩护。托瓦兹说,从哲学及美学的观点出发,微核心的确是一个比较好的架构,但是采用微核心架构的GNU Hurd根本没有如期被成功开发出来,所以他才要开发Linux。托瓦兹强调,操作系统核心主要的功能都倚靠硬件特性,所以内核本身不需要过度具备可移植性,让高级的软件应用程序接口具备可移植性才是更重要的。Linux内核采用集成式核心架构,是因为它能够简化核心设计,这是一个权衡下的结果(An acceptable trade-off)。以Linux来跟Minix比较,移植程序到Linux上是更容易的。托瓦兹进一步说,可移植性是那些写不出新程序的人才需要的(Portability is for people who cannot write new programs)。Linux一开始针对Intel 80386架构来开发,一部份的理由是为了托瓦兹自己买的电脑就是80386,这正好可以让他对80386架构了解更多。Linux一开始就是准备自己使用的,如果想要移植到别的平台,代码都是开放的,想要的人可以自己做。

收起全文

辛几何&李代数

免平方字符串

免平方字符串

字符串hello当中连续出现了两个l。字符串prototype当中连续出现了两个ot。字符串nonsense当中连续出现了两个nse。如果某个字符串中连续出现了两个相同的片段,换句话说这个字符串里面含有形如XX的模式(其中X代表一个子串),我们就说这个字符串中含有一个&平方&(square)。如果某个字符串中没有平方出现,我们就说这个字符串是&免平方&的(s... 阅读全文

字符串 hello 当中连续出现了两个 l 。字符串 prototype 当中连续出现了两个 ot 。字符串 nonsense 当中连续出现了两个 nse 。如果某个字符串中连续出现了两个相同的片段,换句话说这个字符串里面含有形如 XX 的模式(其中 X 代表一个子串),我们就说这个字符串中含有一个平方square)。如果某个字符串中没有平方出现,我们就说这个字符串是免平方的(square-free)。

如果只使用两种字符,比方说字符 0 和字符 1 的话,我们只能构造出一些长度非常有限的免平方字符串。事实上,我们只能构造出以下 6 个免平方字符串: 0 、 1 、 01 、 10 、 010 、 101。然而,如果允许使用三种字符,比方说字符 0 、 1 、 2 的话,我们不但能够构造出任意长的免平方字符串,还能构造出无限长的免平方字符串。在继续阅读下去之前,你不妨先自己试试看。

让我们先来看一个与刚才的讨论似乎毫不相关的问题。你能找出下面这个序列的规律吗?(考虑到字符串本质上就是一个字符序列,因此下面我们会经常混用字符串序列这两个概念。)

0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1 …

答案:它们分别表示 0, 1, 2, 3, 4, … 的二进制表达中有多少个数字 1 ,其中 0 代表有偶数个数字 1 , 1 代表有奇数个数字 1 。如果我还没说清楚的话,看看下表你应该就明白了。

十进制数

0

1

2

3

4

5

6

7

8

9

10

11

二进制数

0

1

10

11

100

101

110

111

1000

1001

1010

1011

1 的个数

偶数

奇数

奇数

偶数

奇数

偶数

偶数

奇数

奇数

偶数

偶数

奇数

序列

0

1

1

0

1

0

0

1

1

0

0

1

我们不妨把这个序列用 t 表示。序列 t 还有很多等价的定义,比方说,我们可以递归地定义,当n 为偶数时, t(n) = t(n/2) ,当 n 为奇数时,t(n) = 1 – t(n-1) ;最后再规定 a(0) = 0,整个序列就唯一地确定了。你会发现,定义方式虽然是新的,但是背后的实质仍然没变。如果 n是偶数,那么 n 的二进制表达的最后一位就是数字 0 ,除以 2 其实就相当于是去掉这个数字 0,数字 1 的个数的奇偶性显然没变。如果 n 是奇数,那么 n 的二进制表达的最后一位就是数字1,而 n – 1 的二进制表达的最后一位则是数字 0 ,这两个二进制数仅在最后一位有所不同,因此数字 1 的个数的奇偶性肯定是相反的。因而,不断这样递推下去,最后得到的序列与刚才的序列 t 一模一样。由于对于所有的偶数 n , t(n) = t(n/2) 始终成立,因此这个序列还有一个非常炫的性质:把序列中的 t(1), t(3), t(5), … 都去掉,仅保留 t(0), t(2), t(4), … ,由此得到了一个新的无穷序列,它和原来的序列完全相同!另外,由于对于所有的奇数 n , t(n) = 1 – t(n-1) = 1 – t((n-1)/2) 始终成立,你也可以选择去掉 t(0), t(2), t(4), … ,保留t(1), t(3), t(5), … ,由此得到一个新的无穷序列,它和原序列的每一项都正好相反。

在介绍序列 t 时,很多地方会采用另一种等价的定义方式:从 0 出发,不断执行取反并后置的操作,最终得到的序列就是序列 t 。所谓取反,就是把所有的 0 全部变成 1 ,把所有的 1 全部变成 0 ;所谓后置,就是把所得的字符串接在当前字符串的后面。从 0 出发,取反后得 1 ,把它加在 0 后面便得到 01 ; 01 取反后得 10 ,把它加在 01 后面便得到 0110; 0110 取反后得到 1001 ,把它加在 0110 后面便得到 01101001 ……不断这样下去,我们就会得到序列 t 。

 01  0110  01101001  0110100110010110  …

为什么?因为这种序列生成法的本质仍然是在统计二进制数的数字 1 的个数。我们不断地根据二进制数的规律,利用 t(0) 到 t(2n – 1) 的值,推出 t(2n) 到 t(2n+1 – 1) 的值。比方说,序列 t 的前 4 个数分别代表 00, 01, 10, 11 这 4 个二进制数中数字 1 的个数的奇偶性,那么序列 t 接下来的 4 个数就应该分别代表 100, 101, 110, 111 这 4 个二进制数中数字 1 的个数的奇偶性。前 4 个二进制数与后 4 个二进制数的区别仅仅在于最前面的那个数字 1 ,因而它们所含的数字 1 的个数的奇偶性应该正好相反。因此,如果序列 t 的前 4 个数分别是 0, 1, 1, 0,那么序列 t 接下来的 4 个数就应该完全反过来,分别是 1, 0, 0, 1 了。

 

从 1906 年到 1914 年,挪威数学家 Axel Thue 发表了一系列论文,第一次对这个序列进行了细致的研究,成为了 combinatorics on words 这个新的数学分支的开山之作。 1921 年,美国数学家 Marston Morse 把 Thue 提出的序列用在了微分拓扑上,因而这个序列最终被命名为了 Thue-Morse 序列。

Thue-Morse 序列有很多非常漂亮的性质。如果某个字符串中连续出现了两个相同的片段,但它们有一个字符的交叉,换句话说这个字符串当中出现了形如 aXaXa 的模式,其中 X 代表一个子串,a 代表一个字符,那么我们就说 aXa 在这个字符串当中发生了重叠overlap)。例如,单词banana 当中的 ana 就出现了重叠,单词 Mississippi 中的 issi 也出现了重叠。如果某个字符串中没有重叠出现,我们就说这个字符串是免重叠的(overlap-free)。下面我们就来证明Thue-Morse 序列的一个最为重要的性质:它是免重叠的。

我们采用反证法。假如 Thue-Morse 序列存在重叠子串,那么在所有的重叠子串中一定有一个最短的重叠子串。这意味着, Thue-Morse 序列将会包含 aXaXa 的模式,其中 X 表示某个子串, a表示某个字符,并且 X 的长度已经达到最小。首先我们证明, X 的长度不可能是奇数。否则,三个 a 的位置编号的奇偶性相同,因而如果我们从第一个 a 开始,间隔地读出各个字符,就会得到形如 aX’aX’a 的结果,其中 X’ 就是从 X 当中抽出的字符串,长度是 X 的一半(取下整)。然而,前面我们已经提到过 Thue-Morse 序列的性质了:间隔地抽取字符,得到的新字符串要么就是 Thue-Morse 序列,要么取反后就是 Thue-Morse 序列。这说明, aX’aX’a ,或者它取反后的结果,其实就是 Thue-Morse 序列的子串。因而, Thue-Morse 序列当中存在比 aXaXa 更短的重叠现象,这与 X 的长度的最小性矛盾。

接下来我们证明, X 的长度也不可能是偶数。首先注意到, 4n, 4n + 1, 4n + 2, 4n + 3 的二进制表达中,只有最后两位数字不一样,它们依次是 00, 01, 10, 11 。因此, t(4n), t(4n + 1), t(4n + 2), t(4n + 3) 的值要么依次是 0, 1, 1, 0 ,要么依次是 1, 0, 0, 1 。所以,如果我们把 Thue-Morse 序列四个数四个数地看作一组,你会发现 Thue-Morse 序列就是由一个一个的 (0, 1, 1, 0)  (1, 0, 0, 1) 组成的。

如果 X 的长度是大于等于 4 的偶数,那么不管 aXaXa 在 Thue-Morse 序列中的什么地方出现,前一个 aXa 里必然会包含某个四元组的中间两项,不妨假设这是 aXa 中的第 i 项和第 i + 1项。另外,别忘了 X 的长度是一个偶数,因此前一个 aXa 需要向右移动奇数个单位才能和后一个aXa 重合。这就矛盾了:向右移动奇数个单位后, aXa 的第 i 项和第 i + 1 项将会对应于另一个四元组的前面两项或者后面两项,于是前一个 aXa 的第 i 项和第 i + 1 项是两个相同的数字,后一个 aXa 中的第 i 项和第 i + 1 项是两个不同的数字,这显然是荒谬的。

免平方字符串

如果 X 的长度等于 2 , aXa 的长度会非常短,以至于会发生这样的情况:没有任何一个四元组的中间两项落在了前一个 aXa 的范围里,此时前面的推理就失效了。不过没关系,如果真的发生了这种情况, aXaXa 的位置只可能像下图这样,此时前一个 aXa 的第 1 项和第 2 项对应于某个四元组的后两项,但后一个 aXa 的第 1 项和第 2 项就会对应于下一个四元组的中间两项,矛盾依然存在。

免平方字符串

最后,如果 X 的长度为 0 呢?这就更不可能了。在 Thue-Morse 序列中,任意三个连续的字符都会涵盖到某个四元组的前面两项或者后面两项,因而包含两个不同的数字。因此,在 Thue-Morse序列中绝不可能有形如 aaa 的子串出现。

综上所述, Thue-Morse 序列中不可能包含形如 aXaXa 的子串,即 Thue-Morse 序列是免重叠的。

 

有了这个结论之后,我们就能解决本文最初提到的问题了。借助 Thue-Morse 序列,我们可以得到一个无限长的免平方字符串,其中只含 0 、 1 、 2 三种字符。方法很简单:只需要依次列出Thue-Morse 序列中相邻两个 0 之间有多少个 1 即可。在 Thue-Morse 序列中,第 1 个数字 0和第 2 个数字 0 之间夹着 2 个数字 1 ,第 2 个数字 0 和第 3 个数字 0 之间夹着 1 个数字1 ,第 3 个数字 0 和第 4 个数字 0 之间夹着 0 个数字 1 ,第 4 个数字 0 和第 5 个数字 0之间夹着 2 个数字 1 ……于是,我们就得到了一个以 2, 1, 0, 2 开头的无限字符串。注意,由于 Thue-Morse 序列中不可能出现三个或者三个以上的连续数字 1 ,因此所得字符串中不会出现大于等于 3 的数字,只有数字 0 、 1 和 2 。

Thue-Morse 序列: 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0…
新的序列:2, 1, 0, 2, 0, 1, 2, …

为什么由此得到的序列是免平方的呢?很简单。如果新的序列里面出现了某个平方,比如 a1a2a3…ana1a2a3…an ,这就意味着 Thue-Morse 序列里出现了 0 1a1 0 1a2 0 1a3 0 … 0 1an 0 1a1 0 1a20 1a3 0 … 0 1an 0 (其中 1a1 表示连续 a1 个数字 1 ,以此类推),于是形成了重叠子串,与Thue-Morse 序列的免重叠性矛盾。

 

从 Thue-Morse 序列的免重叠性出发,我们还能得出很多有趣的推论。例如, Thue-Morse 序列一定是免立方的,即 Thue-Morse 序列中不存在形如 XXX 的子串。原因很简单:不妨假设 X = aX’,那么 XXX 实际上就是 aX’aX’aX’ ,其中 aX’aX’a 形成了重叠子串,又与 Thue-Morse 序列的免重叠性矛盾了。由此可以进一步推出, Thue-Morse 序列永远不会发生循环。原因很简单:如果 Thue-Morse 序列从某处开始发生循环,这就直接与 Thue-Morse 序列的免立方性矛盾了。

同时, Thue-Morse 序列是一个复现序列recurrent sequence),意即 Thue-Morse 序列中的每一个子串都会出现无穷多次。这个事实背后的原因也很简单。比方说,我们在 Thue-Morse序列当中取出 t(6)  t(10) 这么一段,它们是 0, 1, 1, 0, 0 ,表示二进制数 0110, 0111, 1000, 1001, 1010 的数字 1 的个数的奇偶性。那么, 0, 1, 1, 0, 0 今后一定会出现无数多次。在数到二进制数 110110, 110111, 111000, 111001, 111010 时,我们会再一次得到 0, 1, 1, 0, 0 ;在数到二进制数 1010110, 1010111, 1011000, 1011001, 1011010 时,我们会再一次得到 0, 1, 1, 0, 0 。这样的机会显然还有无穷多,例如,在数到二进制数 1101001000110,1101001000111, 1101001001000, 1101001001001, 1101001001010 时,我们会再一次得到 0, 1, 1, 0, 0 

构造一个复现序列很简单,任何一个循环序列即满足要求,比如 0, 1, 0, 1, 0, 1, … 。而Thue-Morse 序列则告诉了我们:存在不是循环序列的复现序列。

 

最后,我们再不加证明地给出两个与 Thue-Morse 序列有关的神奇结论。对于哪些正整数 k ≥ 2,存在两个大小相等的整数集合 A = {a1, a2, a3, …, an B = {b1, b2, b3, …, bn,使得

a1 + a2 + a3 + … + an = b1 + b2 + b3 + … + bn
a12 + a22 + a32 + … + an2 = b12 + b22 + b32 + … + bn2
……
a1k + a2k + a3k + … + ank = b1k + b2k + b3k + … + bnk

即集合 A 里的所有数与集合 B 里的所有数从 1 次方和到 k 次方和全都相等?当然,集合 A 和集合 B 必须是两个不同的集合。答案是,对于所有的正整数 k ≥ 2 ,满足要求的解都是存在的。利用 Thue-Morse 序列,我们可以得出一种 n = 2^k 的构造解,方法如下:取出 Thue-Morse序列的前 2k+1 位,即 t(0), t(1), …, t(2^(k+1) – 1),如果 t(i) = 0 ,就把 i 放进集合 A里,如果 t(i) = 1 ,就把 i 放进集合 B 里。

i

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

t(i)

0

1

1

0

1

0

0

1

1

0

0

1

0

1

1

0

 k = 3 时,如上表所示,根据规则,我们应该把 0, 3, 5, 6, 9, 10, 12, 15 分为一组,把1, 2, 4, 7, 8, 11, 13, 14 分为另一组。神奇的事情出现了:下面三个等式真的是成立的!

0 + 3 + 5 + 6 + 9 + 10 + 12 + 15 = 1 + 2 + 4 + 7 + 8 + 11 + 13 + 14
02 + 32 + 52 + 62 + 92 + 102 + 122 + 152 = 12 + 22 + 42 + 72 + 82 + 112 + 132 + 142
03 + 33 + 53 + 63 + 93 + 103 + 123 + 153 = 13 + 23 + 43 + 73 + 83 + 113 + 133 + 143

Thue-Morse 序列还能帮忙构造幻方。 1977 年, Adler Allan 和 Shuo-Yen Robert Li 给出了一种算法,可以利用 Thue-Morse 序列构造 2^n × 2^n的幻方(其中 n ≥ 2 )。首先,从左至右从上至下地把 1 到 2^2n的数填入 2^n × 2^n的方格里。然后,如果 Thue-Morse 序列中的第 i个数是 0 (即 t(i – 1) = 0 ),就把 i 从方格里拿出来。最后,把所有拿出来的数倒序放回方格,我们就得到了一个幻方。下图所示的是 n = 2 时的例子。由于 Thue-Morse 序列中的第 1, 4, 6, 7, 10, 11, 13, 16 个数是 0 ,因而我们把这些数从 4 × 4 的方阵中取出来;把它们以相反的顺序放回去后,可以验证,方阵中的每一行、每一列和两条对角线上的数字之和都是 34 。

i

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

t(i – 1)

0

1

1

0

1

0

0

1

1

0

0

1

0

1

1

0

免平方字符串

收起全文
人人小站
更多热门小站
X