一探汉语中的文字幻方

    大家都知道,幻方是这样一种数字游戏,将 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 对汉字幻方作了一些搜索。下面和大家分享一下我得到的结果。

Read more…

习一文一乐,便入安宁万世……

    我曾经在这里介绍过一个叫做 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 ,使得一句话里每个字的笔画数恰好等于圆周率的小数展开。

Read more…

Mathematica真的什么都能求出来吗?

    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 。

Read more…

用Mathematica寻找最相似的汉字

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

   

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

   

Read more…

满足xy恰有k个约数的(x,y)所组成的图形

刚才在这里看到了如题所说的图像,立即想到用 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 为某个素数:

Read more…