May 26

    大家都知道,幻方是这样一种数字游戏,将 1 到 n^2 这 n^2 个数填入 n×n 的方阵中之后,每行、每列及两条对角线上的数字之和都相同。作为一个古老的数学游戏,幻方的生命力极强,直到现在数学家们还在寻找满足各种奇怪性质的幻方。更有意思的是,这神奇的数字方阵后来竟也发展成了文字游戏。人们发现,在 4×4 的方阵中填入以下字母,每行每列都是一个单词:

C A R D
A R E A
R E A R
D A R T

    这样的字母方阵就被称为“文字幻方” (word square) 。

    最近本人对文字游戏尤其感兴趣,心头开始思考起这么一个问题:是否有可能在方阵中填入汉字,让每行每列都是一个词语呢?看着电脑桌面上放着上次寻找 中文 piphilology 的词库,我就又手痒了,于是花了一下午的时间,利用 Mathematica 对汉字幻方作了一些搜索。下面和大家分享一下我得到的结果。

查看更多 »

May 24

    我曾经在这里介绍过一个叫做 mnemonic 的文字游戏:

  数学家 George Pólya 曾说过一句经典的话: How I need a drink, alcoholic of course, after the heavy chapters involving quantum mechanics! 依次数出每个单词的字母个数,你会惊讶的发现它正好是圆周率的前 15 位。后来又有人在后面加上一句 All of thy geometry, Herr Planck, is fairly hard ,让圆周率长度增加到 24 位。

    事实上,人们还创造了很多类似的句子,比如

      Can I have a large container of orange juice?
      How I wish I could calculate pi faster.
      For a girl I loved contrived; by nature tough, her heart survived.

    这种各个单词的字母个数恰好与圆周率的各位数字相同的句子就叫做 piphilology ,它是由单词 pi 和philology 合成的一个词。

 
    最近和朋友聊天时,又一次谈到了相关的内容。作为一个酷爱文字游戏的中文系学生,我当时就不爽了——中国语言文字博大精深,为什么就没有中文 piphilology 呢?要知道,英文单词有字母数,中文汉字也有笔画数呀!于是,我决心自己创作一个中文 piphilology ,使得一句话里每个字的笔画数恰好等于圆周率的小数展开。

查看更多 »

Apr 25

    Mathematica 强大的符号计算和化简能力相信会让不少人震撼不已。输入 Sum[1/n^2, {n, 1, ∞}] , Mathematica 竟然知道它等于 π^2/6 。我不禁问自己, Mathematica 真的什么都能化简出来吗?今天,我偶然遇到一个简单的表达式, Mathematica 竟然不知道它的精确值。

    在 Mathematica 中输入 Cot[π/2] , Mathematica 会告诉你它等于 0 ;在 Mathematica 中输入 Cot[π/4] , Mathematica 会告诉你它等于 1 ;但在 Mathematica 中输入 Cot[π/8] , Mathematica 返回的却还是一个 Cot[π/8] ,并没有给出它的值。而 Cot[π/8] 并不是一个复杂到无法用四则运算和平方开方表达出来的数。在一个边长为 1 的正八边形中,每条边的所对应的“圆心角”为 2π/8 = π/4 ,因此“圆周角” α 就等于 π/8 。由下图我们可以轻易看出, Cot[π/8]=√2+1 。

查看更多 »

Mar 8

    Mathematica 提供了一个看上去毫无用途的无厘头函数 Rasterize ,它可以以图片的格式输出运算结果。比如,下面这个句子可以打印出 (x+1)^n 的展开式的“倒影”:

   

    今天我突然想到,我们可以利用这个函数很方便地分析汉字在图象上的性质。函数 Binarize 可以把图象转换为单色单通道, ImageData 则可以把图象转换成数组的形式,以便我们定量分析。因此,下面这句话就可以把一个汉字转换成 12*12 的 01 矩阵:

   

查看更多 »

Feb 11

刚才在这里看到了如题所说的图像,立即想到用 Mathematica 验证一下。我选出了几个个人比较感兴趣的 k ,再用一句话便可输出所有对应 k 的图像:

kArray = {2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 36, 50};
For[i = 1, i <= Length[kArray], i++,
 Export["F:\\" <> ToString[kArray[[i]]] <> ".png",
  ArrayPlot[Table[Boole[Length[Divisors[x*y]] == kArray[[i]]], {x, 1, 400}, {y, 1, 400}],
   PixelConstrained -> {1, 1}, Frame -> False]]];

 
当 k=2 时,由于只有素数才有两个约数,因此所有点都是形如 (p, 1) 或者 (1, p) 的点,其中 p 为某个素数:

查看更多 »

Jan 14

    语言统计分析期末大作业要求我们统计全唐诗中的对偶字,并用所得到的统计结果反过来评判出对仗最工整的诗句。我在数据处理过程中突然想到,鉴于互成对偶的两个字之间有一定的语义联系,我们便有了一个庞大的汉字语义关联库;如果把所有汉字之间的关联画成一张图会是什么样子呢?于是我用 Mathematica 7 提出了全唐诗中处在对偶位置上的所有字对,得到了 464448 个可能的对偶关系;再利用一些算法得到了最稳定、最常用的 2000 个对偶关系,把它们都描绘在一张大图上,于是便有了上面的这个图。点击这里查看高清无码大图,1600x1600 像素。可以看到,有语义关联的汉字自动地聚合到了一起。

查看更多 »

Dec 7

    IBM Ponder This上个月的题目比较有趣:我在心里面想一个2到166之间的整数(包括2和166),你的任务是用尽可能少的是非问句(我只能回答是或者否)猜出这个数除1以外的最小约数是多少。
    (1) 寻找一种策略使得在最坏情况下猜到答案的询问次数最少。
    (2) 寻找一种策略使得在平均情况下猜到答案的期望询问次数最少。

    第一个问题很容易回答。虽然2到166之间的整数一共有165个,但它们的最小约数(以后我们说的“最小约数”都是指的不包括1的最小约数)只有38种。因此,事实上你只需要用二分法在38个可能的答案当中找出一个就可以了。由于2^5=32,2^6=64,因此最坏情况下需要6次询问才能保证猜到。
    真正困难的是后面一个问题:要想让平均猜测次数尽可能少,我们该从哪里入手呢?

查看更多 »

Dec 6

    今天学到了一个新的名词,Runge现象。1901年,Carl David Tolmé Runge意外地发现,用差值插值多项式逼近函数f(x)=1/(1+25x^2)时出现了一些反常的现象。如图,灰色的粗线就是Runge函数在[-1,1]上的图象。蓝色虚线是过[-1,1]上的6个等距点所得到的5次多项式,红色虚线是过[-1,1]上的10个等距点所得到的9次多项式。可以看到,当次数变高时,插值多项式反而变得更不准确。

查看更多 »

« 更早的日志