Daily Surf [daily-surf]

Sublime Text 4 高分屏设置 [sublime-text-config]

装好 PackageResourceViewer 包后, 修改主题文件如 Default.sublime-theme 即可.

侧边栏字体大小

"class": "sidebar_label",
"fg": "var(sidebar_label)",
"font.face": "var(font_face)",
"font.size": "var(font_size)"  // line 264

侧边栏文件树

"class": "sidebar_tree",
"platforms": ["windows"],
"row_padding": [6, 5, 4, 5],  // line 226

文件 Tab

"class": "tab_label",
"font.face": "var(font_face)",
"font.size": "var(font_size_lg)",  // line 938

Sagemath Jupyter 主题设置 [sagemath-theme]

如果你是一个没有定制化需求的 Sagemath 用户或者单纯地使用 Jupyter Notebook 连接一些与 Sagemath 无关的服务, 你遇到本文所关心问题的可能性是很低的, 这个主要有以下两个原因.

  1. Sagemath Jupyter Notebook 在 Visual Studio Code 上几乎不能使用. 这是因为, 所有由 MathJax 提供渲染的公式都无法呈现, 甚至连 Cell 也不出现. 于是最稳妥的做法就变成了使用浏览器访问 Jupyter Notebook.

  2. Jupyter Notebook 的主题设计非常混乱, 常用主题位于 jupyterthemes 包, 但是这个包的文档和使用示例并不适用于 Sagemath.

这两点使得问题看上去不太容易. 因为一般的, 如果用户使用 Visual Studio Code 访问 Jupyter Notebook 就完全不需要担心主题问题, 于是相应的可能在互联网上存在的解决方案就会变少. 关于第二点, 如果尝试在 Jupyter Notebook 当中执行下面这样的程序

from jupyterthemes import get_themes, jtplot
import jupyterthemes as jt
from jupyterthemes.stylefx import set_nb_theme

set_nb_theme('monokai')

确实能够切换到 monokai 主题, 同时你还会发现当前使用的 Jupyter Notebook 的 HeaderToolbar 消失了 1. 如果你尝试检索相关信息, 你会在 jupyterthemes 的文档中找到像是

jt -t monokai -T -N

这样的做法, 这里的 -T 是 Toolbar Visible, -N 是 Name & Logo Visible. 然后遗憾地发现这不会对 Sagemath 的 Jupyter Notebook 造成任何作用. 同时, 这样的设置也是临时的, 如果希望将某个特定的主题作为默认主题, 就得另谋他法.

最直接的方法是, 找到像下面这样的编译后的样式文件

sagemath/runtime/opt/sagemath-9.3/local/lib/python3.7/site-packages/jupyterthemes/styles/compiled/monokai.css

然后覆盖到

<SAGE_HOME>/.sage/jupyter-4.1/custom/custom.css

这样你就得到了一个永久生效的样式设置. 随后可以通过修改 div#maintoolbar#header-containerdisplayblock 重新显示这两个组件. 修改 .MathJaxfont-size120% 或者更大则能够增大渲染后公式的字号.

1

从编译后的样式文件中我们可以看到, div#maintoolbar#header-container 确实被设置为了 display: none.

Git 过滤分支 [git-filter-branch]

一个常见的需求是, 对已经存在的 commit 历史作出修改. 如果目标 commits 都存在于本地分支, 那么一组 rebase 就能解决问题. 但若是要修改已经推送至远程仓库或托管平台 1 就没那么容易了, 而且对于真实的多人协作仓库来说, 这么做的潜在危害远高于修改 commits 历史所得到的短期好处 2. 因此我们接下来的讨论都是以接受这一点作为前提来进行.

这里只说方法. 哪怕是对于已经提交的 commit, 修改 commits 还是一样的用 rebase. 但现在肯定是不能直接推送了, 我们需要额外做一步 filter-branch.

git filter-branch --force     

filter-branch 配合 replace 或者 <GIT_DIR>/info/grafts 也能够用来快速清除某次 commit 之前的所有记录.

虽然后者目前已经被标记为 deprecated.

hint: Support for <GIT_DIR>/info/grafts is deprecated
hint: and will be removed in a future Git version.
hint:
hint: Please use "git replace --convert-graft-file"
hint: to convert the grafts into replace refs.
hint:
hint: Turn this message off by running
hint: "git config advice.graftFileDeprecated false"
2

这就是为何你应该对每个任务都开新的 分支, 同时在每次正式 推送 之前都 rebase, 来避免污染主分支的 commit 树.

Exegesis. 日经观点 [baby-viewpoint]

$\gdef\Mat{\operatorname{Mat}}$ $\gdef\vol{\operatorname{vol}}$ $\gdef\diag{\operatorname{diag}}$ $\gdef\d{\operatorname{d}}$ $\gdef\R{\mathbf{R}}$ $\gdef\Q{\mathbf{Q}}$

  1. 一个矩阵 $A \in \Mat_{n \times n}(\R)$ 所确定的线性映射 $\alpha: \R^n \to \R^n$ 作用在 $X \in \R^n$ 上, 此映射对 $X$ 的体积 $\vol(X)$ 的缩放量为 $\det A$. 即 $\vol(\alpha X) = \det A \cdot \vol(X)$. 特别地取 $A = \diag(a,b)$, 然后乘单位圆 $u^2+v^2=1$ 上一点构成的向量 $(u,v)$, 得到满足椭圆方程 $\frac{x^2}{a^2}+\frac{y^2}{b^2}=1$ 的 $(x,y)$, 这样便能看出椭圆的面积 $S = \det A \cdot \pi$.

  2. 设 $\omega$ 是一个 $k$-形式, 它的两次微分 $\d(\d \omega) = 0$. 另一方面, 考虑一个有向流形 $\Omega$ 和它的边缘 $\partial \Omega$, 我们知道 $\partial(\partial M) = \varnothing$. 这两件事相互对偶.

  3. 考虑数域 $K=\Q(\alpha_1, \cdots, \alpha_i)$ 的一个存在于上的历史原因是, 在适当的 $K$ 中考虑能够使原本在 $\Q$ 上无法分解的 Diophantus 方程因式分解. 如 $\Q(\sqrt{-7})$ 能使 Ramanujan–Nagell 方程 $x^2=2^n-7$ 改写为 $(x+\sqrt{-7})(x-\sqrt{-7})=2^n$. Fermat 方程 $x^n+y^n=z^n$ 能够在 $\Q(\zeta_n)$ 上分解成 $x^n=(z-y)(z-\zeta_n y) \cdots (z-\zeta_n^{n-1} y)$, 这是 Kummer 提出 理想数 概念的一个原因.

Fibonacci 抛硬币 [fibonacci-flip]

抛一枚硬币 $n \ge 2$ 次且从不连续出现正面, 这样的可能共有 $F_{n+2}$ 种, 这里的 $F_{n+2}$ 是从零开始的 Fibonacci 数列. 我们把抛 $n$ 次不连续出现正面的可能数记为 $S_n$, 考虑相邻的两次抛硬币, 假设第 $i$ 次掷硬币为正面, 则第 $i+1$ 次掷硬币只能是反面, 这个时候的所有可能为 $S_{n-2}$. 假设第 $i$ 次掷硬币为反面, 则第 $i+1$ 次掷硬币的结果可任意. 因此 $S_n = S_{n-1} + S_{n-2}$, 再利用初值 $S_1$, $S_2$ 就能解出 $S_n$.

屏幕右上角的 “FPS GPU CPU 延时” [nvidia-fps-gpu-cpu]

根据 这个 Reddit 问题.

首先这项功能来自 Nvidia Overlay, Intel 用户可以通过 Alt+R 开启这个 “PC 统计数据”1 AMD 则是 Ctrl + Shift + O. 目前看来这个信息会出现在安装了 Nvidia APP (Beta) 或者 GeForce Experience 程序的设备上.

1

我们姑且按照该 Reddit 问题的某个回答这么称呼此信息.

极坐标出现前人们怎样计算高斯积分 [gaussian-integral]

这一证明最早似乎来自 Michael Rozman. 除此之外 MSE 上也有极类似的回答, 见 此处.

M. Rozman, Evaluate Gaussian integral using differentiation under the integral sign, Course notes for Physics 2400 (UConn), Spring 2016.

$\gdef\R{\mathbf{R}}$ $\gdef\spaces#1{~ #1 ~}$ $\gdef\d{\operatorname{d}}$

核心技巧来自一个函数 $F(t)$ 的构造. 对 $t \in \R$ 定义如下函数

$$ F(t) \spaces= \int_0^\infty \frac{e^{-t^2(1+x^2)}}{1+x^2} \d x $$

容易验证 $F(t)$ 满足 $F(0)=\frac{\pi}{2}$, $F(\infty) = 0$, 以及最关键的

$$ F'(t) \spaces= \int_0^\infty -2te^{-t^2(1+x^2)} \d x \spaces= -2te^{-t^2} \int_0^\infty e^{-(tx)^2} \d x $$

记高斯积分为 $I$. 这就有 $F'(t) = -2Ie^{-t^2}$, 此时再求 $F'(t)$ 于 $[0, \infty)$, 上的积分, 就能得到

$$ F(\infty)- F(0) \spaces= -2I \int_0^\infty e^{-t^2} \d t \spaces= -2I^2 $$

于是这给出 $I = \frac{\sqrt\pi}2$.

Wolfram 引擎与 WLJS [wolfram-engine]

Wolfram 把 Mathematica 的内核 Wolfram Engine 单独拆出来并作为免费软件 1 提供已不是什么新鲜事. 如不考虑实际的交互体验, 至少对于开发者而言, 为最新版 Mathematica 付费这件事基本就意味着只购买了个带官方服务支持的 Wolfram Notebook.

Wolfram 引擎能直接使用 Homebrew 或 winget 等包管理器安装, 命令行功能由引擎自带的 Wolfram Script 提供. 虽然能用, 但可想而知体验不会太好. 最早的一个方案是用 Visual Studio Code 和相关 Notebook 插件连接到 Wolfram 引擎, 这样一来比起纯命令行能好上不少, 但是对于习惯了 Mathematica 官方笔记本的用户来说还差点意思.

要是用户不在乎多装一个浏览器以此换来更好的 Notebook 体验, 那么开源的 WLJS 会是一个可供考虑的选择. Augsburg 大学的物理学家 Kirill Vasin 在 2023 年 11 月 16 日发布了 WLJS 的第一个长期版本 2. WLJS 这几个字母是 Wolfram JS Frontend 的缩写, 从技术上说, 它是一个 Electron APP, 如果用户的目的是对于 Mathematica 功能有高度依赖的科研用途, 那么多装一个浏览器的代价自然算不了什么. 另外 WLJS 的引导部分做的很不错, 也有不少很有意思但是 Wolfram Notebook 不具备的功能.

1

Windows 上的 Wolfram Engine 安装完成之后能占用大约 6.5GB 的磁盘空间. 比起 Sagemath 还是大了不少.

Theorem. 生成函数系数 [expand-coefficient]

$\gdef\Z{\mathbf{Z}}$

设 $\frac1{(1-q)^3} = \sum_{u \ge 0} a_u q^u$, 求 $a_n$. 显然 $a_n$ 同时也是 $x_1+x_2+x_3 = n$ 在 $\Z_{\ge 0}$ 上解的个数.

Lemma. Young 引理 [young-lemma]

$\gdef\spaces#1{~ #1 ~}$

Young 不等式有许多风格迥然的证明, 最常见的办法可能是使用定积分. 我们在此介绍一种充分利用对数线性化 $\log x \le x -1 $ 的方法, 即 Young 引理. 并展示 Young 不等式与其他常见不等式如何作为此结果的直接推论.

对数函数 $\log$ 最为特殊的性质可以说就是 $\log a^b = b\log a$ 和 $\log a b = \log a + \log b$. 另一方面, 我们知道对于非负的 $X,Y$, 不等式 $X \le Y$ 等价于 $\log \frac XY \le 0$. 如果我们希望充分利用这三点, 那么就可以试着去考虑

$$ \log \frac{f_1^{p_1}f_2^{p_2}}{g^{p_1+p_2}} \spaces= p_1\log\frac{f_1}g \spaces+ p_2\log\frac{f_2}g $$

现在对右侧使用对数的线性化, 得到

$$ \begin{aligned} \log \frac{f_1^{p_1}f_2^{p_2}}{g^{p_1+p_2}} &\spaces\le p_1\Big(\frac{f_1}g-1\Big) \spaces+ p_2\Big(\frac{f_2}g-1\Big) \\ &\spaces= g^{-1}(p_1f_1+p_2f_2) - (p_1+p_2) \end{aligned} $$

我们当然希望 $\log\frac\Box\Box \le 0$. 这就是说, 如果有关于加法和乘法的条件

$$ p_1f_1+p_2f_2 \spaces\le (p_1+p_2)g $$

那么可以推出 $f_1^{p_1}f_2^{p_2} \le g^{p_1+p_2}$ 这样一个指数上的结果. 有时我们也写成

$$ p_1 \log f_1 + p_2 \log f_2 \spaces\le (p_1+p_2)\log g $$

用完全相同的步骤, 也可以证明任意多个 $p_i$ 和 $f_i$ 时的情况.