用Julia把π玩出花来

虽然“阿基米德常数”在几千年前就被发现了,但直到18世纪我们才开始用希腊字母“π”来指代它。

为了证明这一点,Patricia Rothman给出了下面的一页文字,这是π在数学中最早的应用之一。它来自William Jones撰写并于1706年出版的数学教科书:

Jones在不同的地方使用希腊字母来表示数字,并且和他的一些前辈一样,表示圆的周边或周长(希腊字母 περιφέρεια),和在图中标注出点,如同我们今天会使用P和Q进行表示一样。Jones也把它称为范塞伦数(Van Ceulen's Number),来纪念荷兰数学家鲁道夫·范·科伊伦,这位数学家一生中的大部分时间都在计算该数值。(他计算出了小数后35位,并要求把它刻在墓碑上。)

和所有数学家一样,Jones使用了很多符号。他的《最新数学导论》,或叫做《数学新论》已经被编辑为规范的符号化形式了,具体内容可查看链接:

https://archive.org/stream/SynopsisPalma

这是一个令人印象深刻的成就,不仅仅是因为他用的是排字机,这样的操作可能会让你比平常更欣赏你的下一次LATEX课程。

但是,尽管Jones是最初使用数学符号π的人们之一,但他没有足够的影响力去鼓舞和更多的人去效仿,而更著名的Leonhard Euler和他在本世纪后期对π符号的使用,为后人建立希腊字母最初的数学意义上起到更显著的作用:

Julia全然接受了Unicode标准,因此在代码中使用适当的希腊(和其他Unicode)字母非常容易。 例如,在REPL中,键入\ pi TAB以插入Unicode字符U + 03C0:

同时,你可以在表达式中很方便地使用它:

@test kepler_solver.([π/4, π/6, 8π/3], 0) ≈ [π/4, π/6, 2π/3]

和Julia一样,你通常可以看到神奇的表现:

julia> Base.REPLCompletions.latex_symbols["\\pi"]

"π"

更多形式的π

我们通常使用Unicode块中的U +03C0的π作为希腊语和科普特文本字形(科普特文字是埃及人基于希腊文字脚本创造的来取代象形文字),但还有其他π符号主要用于数学用途。 下面的Julia代码片段结果显示了所有小写的Unicode π符号:

morepi = [

(0x3c0, "\\pi", "GREEK SMALL LETTER PI")

(0x213c, "\\bbpi", "DOUBLE-STRUCK SMALL PI") # v0.7

(0x1d6d1, "\\mbfpi", "MATHEMATICAL BOLD SMALL PI")

(0x1D70B, "\\mitpi", "MATHEMATICAL ITALIC SMALL PI")

(0x1d745, "\\mbfitpi", "MATHEMATICAL BOLD ITALIC SMALL PI")

(0x1d77f, "\\bsanspi", "MATHEMATICAL SANS-SERIF BOLD SMALL PI") # v0.7

(0x1d7b9, "\\mbfitsanspi", "MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI")];

foreach(p -> println(" $(Char(p[1])) U+$(lpad(hex(p[1]), 5, "0")) $(rpad(p[2], 15))

$(p[3])"), morepi)

被打上v0.7的两个标签完成版已添加到Julia 0.7版本中。

你看到的输出很大程度上取决于你的计算机,操作系统和其他各种设置。 这是对奇妙的字体世界的冒险游戏的一个很好的介绍。(意译:接下来我们可以探索所产生的不同字体) 例如,如果在Julia REPL(版本0.6.2)中使用macOS上的终端应用程序评估此片段,将会看到:

正如你所看到的,并不是所有的π符号都被渲染了。OS在当前字体(此时使用的是FILA代码(注:链接https://github.com/tonsky/FiraCode)中找到了Unicode字符U+3C0、U+213C、U+1D6D1、U+1D70B、U+1D75、U+1D77、U+1D7B9。对于每一个计算机没有找到的字符,它搜索其他激活的字体以寻找在该代码点处具有符号的字体。 OS操作系统不会检查它找到的符号是否合适。

在上面的例子中,U + 3c0处的希腊字符π在Fira代码中可用。 最终在微软的Segoe UI符号中找到了\ mitpi(U + 1d70b处的数学斜体π),因此该字体可以用于表示字符π。 对于\ bbpi,双击式或黑板式π,字体Code2000在U + 213c处产生了一个被适当使用的符号,虽然对我来说相比于任何类型的π,它看起来更像是一个反向单击的ε。那些在有效字体中找不到的其他字符,它们已在框中使用问号显示。

现在,如果我激活Asana-Math,Everson Mono或STIX,或其他一些数学赋值字体,操作系统将立即开始查找匹配并更新显示,根据需要不断切换字体以满足 Unicode代码点:

安装Asana Math后,可以找到所有其他的π。现在双击小π看起来更像它应该相似的黑板式字符,虽然在小号的点下很难看清。 并且我认为有更好的设计:

一些繁琐的实验表明搜索在某种程度上是按照字母次序的进行的,因为如果Asana Math不可用,操作系统会继续运行Code2000,然后是Deja Vu,然后是Everson,然后是FreeSans,依此类推。至少这是我所认为的在当前的macOS上使用我的特定设置会发生的故事。由于输出与计算机本身的特性有关,所以不同的计算机上或许不一样。在不同的浏览器中会发生类似(但不同)的事情。

顺便说一句,π的这些替代符号,例如\ mitpi,不会被作为数值3.14 ......,所以你可以像William Jones那样使用它们作为通用符号。例如,如果你使用素数时,你可以用其中一个字符来表示素数计数函数。不过你可能会被以下内容所混淆:

julia> = 3

julia> 2

6

并非所有字体在U + 03C0都包含合适的希腊字母π。一些昂贵的字体,如Gotham,在U + 03c0处提供带圆圈的P符号,而不是π。这是“表音文字”(phonogram)(或可以写成“phonorecord”)符号,代码点通常位于U + 2117(U + 24C5也被使用),它就像版权符号©也可以用于表示读音。这背后的故事是,特别是在Unicode标准化时代之前,字体公司有时倾向于实用主义而不是正确性。根据David Berlow的说法:

我们在Font Bureau了解了用户的工作方式,所以我们将p放在一个圆圈中,这是一个“必备”的字形,因为对于用户而言,在字形(数学字符 pi)的插槽中操作非常困难,而且大多数人真的不需要(因为即使他们需要,它也是地球上每台计算机上都有的符号字体)。

π的设计

我们可以使用Julia找到π的所有不同设计吗?我在对此挑战的第一次尝试中使用Fontconfig.jl生成已安装字体的列表,并使用Luxor.jl在表中绘制它们。这种方法至少可以看到各种可用的设计,并解释了一些问题。所提供的零宽字形的字体将被跳过,这意味着表格会比原计划的小。

using Fontconfig, Luxor

function buildfontlist()

fonts = []

for font in Fontconfig.list()

families = Fontconfig.format(font, "%")

for family in split(families, ",")

push!(fonts, family)

end

end

filter!(f -> !ismatch(r".LastResort|Agenda|Topaz|Bodoni Ornaments|System",

f), fonts)

return sort(unique(fonts))

end

function tabulatepi()

fonts = buildfontlist()

ncols = 25

nrows = convert(Int, ceil(length(fonts))) ÷ ncols

@svg begin

background("ivory")

setopacity(1)

t = Table(nrows, ncols, 30, 25)

sethue("black")

cellnumber = 1

for n in 1:length(fonts)

fontface(fonts[n])

te = textextents("π")

if te[3] > 0.0

fontsize(18)

text("π", t[cellnumber], halign=:center)

setfont("Lucida-Sans", 3)

settext(fonts[n], t[cellnumber] + (0, isodd(cellnumber) ? 6 : 10), halign="center")

cellnumber += 1

end

end

end 800 1200

end

tabulatepi()

你可能不必像我一样从字体列表中手动删除像Bodoni Ornaments或Topaz这样的字体。

如果我手动选择候选字体,而不是使用这个自动生成的字体列表,那就更好了:在各种系统和语言特定的字体中有太多的“默认”设计,这些字体只是用基本的设计来填充位置,而不是根据字体的主题来生成形状。并且由futCONFIGG生成的字体列表不会在所有字体库中搜索,因此候选的列表是一个不完整的列表。

以下是一些更有趣的设计:Portly Cooper Black和Tiffany Heavy,极简主义的Verdana和Tahoma(看起来几乎像“n”?),古怪的Gill“Kayo”Sans和笨拙的Chalkduster。

我喜欢小号的Dalliance字体,它相当“老派”。说Dalliance字体老派是因为它起源于欧拉过世不久的1799年。

The average π π的平均字形

我突然想到“π的平均字形是什么?”,或者“如果所有的π同时显示会是什么样子?”。 使用与以前相同的字体列表生成,我运行出了这个:

有关基于多种其他字体的平均形状的完整字体,请查看Averia。

我还没有找到一种方法来列出包含完整的Unicode π符号集的所有字体。 从理论上讲,我认为我可以使用Freetype.jl检查字体,看它是否包含特定字符字形的代码点。 也许我会在3-14-19这天报告进展情况......

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180730G00IQ100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券