Project Euler 354
Project Euler 354
题目
Distances in a bee’s honeycomb
Consider a honey bee’s honeycomb where each cell is a perfect regular hexagon with side length \(1\).

One particular cell is occupied by the queen bee.
For a positive real number \(L\), let \(\text{B}(L)\) count the cells with distance \(L\) from the queen bee cell (all distances are measured from centre to centre); you may assume that the honeycomb is large enough to accommodate for any distance we wish to consider.
For example, \(\text{B}(\sqrt 3)=6, \text{B}(\sqrt {21}) = 12\) and \(\text{B}(111\,111\,111) = 54\).
Find the number of \(L \le 5 \times 10^{11}\) such that \(\text{B}(L) = 450\).
解决方案
令\(N= 5 \times 10^{11}\)蜂巢每个格子是边长为 \(1\) 的正六边形。相邻六边形的中心距为\(d=\sqrt{3}.\)把蜂巢中心点都放到平面上,它们构成一个三角晶格(等价于 Eisenstein 整数晶格的缩放)。
取复平面,令\(\omega=e^{i\pi/3}=\dfrac12+i\dfrac{\sqrt3}{2}.\)三角晶格可表示为\(\Lambda=\{a+b\omega: a,b\in\mathbb Z\}.\)蜂巢中心点与 \(\Lambda\) 只差一个整体缩放:由于相邻中心距是 \(\sqrt3\),可取中心点集合为\(\sqrt3\Lambda.\)
于是从原点到点 \(\sqrt3(a+b\omega)\) 的距离平方为\(L^2 = 3|a+b\omega|^2.\)而\(|a+b\omega|^2=(a+b\omega)(a+b\bar\omega)=a^2+ab+b^2.\)令\(n=\dfrac{L^2}{3},\)那么距离为 \(L\) 等价于存在整数 \(a,b\) 使\(a^2+ab+b^2=n.\)
因此 \(\mathrm B(L)\) 就是该方程的整数解 \((a,b)\) 的个数。
为了使用更标准的形式,把它化到 \(x^2+3y^2\) 上。注意恒等变换:\(4(a^2+ab+b^2)=(2a+b)^2+3b^2.\)令$ x=2a+b,y=b,\(得到等价计数:\)x2+3y2=4n.$
所以 \(\mathrm B(L)\) 等于 \(4n\) 被二次型 \(x^2+3y^2\) 表示的方式数(并且每个 \((x,y)\) 对应唯一的 \((a,b)\))。
在 Eisenstein 整数环 \(\mathbb Z[\omega]\) 里,范数为\(N(a+b\omega)=a^2+ab+b^2.\)
该环是唯一分解整环。整数素数在 \(\mathbb Z[\omega]\) 中的分解规律如下(只用到结论本身即可):
- \(p=3\) 是特殊素数:在 \(\mathbb Z[\omega]\) 中平方分裂(本质上不影响计数,因为\(\mathbb Z[\omega]\)有6个单位元\(\{\pm 1,\pm \omega,\pm \omega^2\},\)因此\(3 = (1-\omega)(1-\omega^2)= -\omega^2(1-\omega)^2.\))。
- 若普通素数 \(p\equiv 2\pmod 3\)(对奇素数即 \(p\equiv 5\pmod 6\)),则 \(p\) 在 \(\mathbb Z[\omega]\) 中仍为素(不分裂)。
- 若普通素数 \(p\equiv 1\pmod 3\)(对奇素数即 \(p\equiv 1\pmod 6\)),则 \(p\) 在 \(\mathbb Z[\omega]\) 中分裂成一对共轭素因子。
把“解的个数”理解为:把整数 \(n\) 的素因子在 \(\mathbb Z[\omega]\) 里分配到 \(\alpha\) 与其共轭 \(\bar\alpha\) 之间,使 \(N(\alpha)=n\),然后再乘上 \(6\) 个单位元带来的旋转对称(蜂巢六方向)。
由此得到经典结论:
- 若 \(n\) 的分解中存在某个 \(p\equiv 2\pmod 3\)(即 \(p\equiv 5\pmod 6\) 的奇素数,或 \(p=2\))的指数为奇数,则无法在共轭之间平均分配,故\(\mathrm B(\sqrt{3n})=0.\)
- 否则(所有 \(p\equiv 2\pmod 3\) 的指数都为偶数),这些素因子在 \(\alpha\) 与 \(\bar\alpha\) 的分配方式是唯一的,不贡献乘数;真正贡献组合数的是分裂素数 \(p\equiv 1\pmod 3\),即奇素数 \(p\equiv 1\pmod 6\)。
设\(\displaystyle{n = 3^t\cdot \Big(\prod_{p\equiv 1(\bmod 6)} p^{e_p}\Big)\cdot \Big(\prod_{q\equiv 5(\bmod 6)\lor q=2} q^{2f_q}\Big),}\)则\(\mathrm B(\sqrt{3n}) = 6\prod_{p\equiv 1(6)}(e_p+1).\)也可以把\(\displaystyle{x=\prod_{p\equiv 1(\bmod 6)} p^{e_p}}\) 看作 \(n\) 去掉所有“非 \(1\bmod 6\)”素因子后的部分,那么\(\mathrm B(\sqrt{3n}) = 6\tau(x),\)其中 \(\tau\) 是约数个数函数。
可见,\(\mathrm B(L)=450 \iff 6,\tau(x)=450 \iff \tau(x)=75.\)而\(75=3\cdot 5^2.\)若\(\displaystyle{x=\prod p_i^{a_i},\tau(x)=\prod(a_i+1)=75,}\)则满足的指数组合只有三类(忽略排列):
- \((a_1,a_2)=(24,2):x=p^{24}q^2.\)
- \((a_1,a_2)=(14,4):x=p^{14}q^4.\)
- \((a_1,a_2,a_3)=(4,4,2):x=p^4q^4r^2.\)
这里 \(p,q,r\) 都必须是互不相同且 \(\equiv 1\pmod 6\) 的素数。
注意这三类里指数全是偶数,所以 \(x\) 是完全平方数;再加上其他素因子必须是偶次,得到:\(n=L^2/3\) 一定是 “平方数 \(\times 3^t\)”。
于是\(L^2=3n = 3^{t+1}\cdot w^2,\) 从而 \(L\) 只能落在两类:
- \(t\) 偶数:\(L=\sqrt3\cdot m\)(\(m\) 为整数)
- \(t\) 奇数:\(L=3\cdot m\)(\(m\) 为整数)
记\(R_1=\left\lfloor \dfrac{N}{\sqrt3}\right\rfloor, R_2=\left\lfloor \dfrac{N}{3}\right\rfloor.\)我们要数:
- \(L=\sqrt3m\le 5\times 10^{11}\Rightarrow m\le R_1\)
- \(L=3m\le 5\times 10^{11}\Rightarrow m\le R_2\)
对给定 \(m\),有
- 若 \(L=\sqrt3 m\),则 \(n=m^2\)
- 若 \(L=3m\),则 \(n=3m^2\)
两者的 \(x\)(也就是所有 \(p\equiv 1\pmod6\) 的部分)都来自 \(m^2\) 的那部分,因此完全一样。
设\(m = u\cdot v,\) 其中
- \(u\) 由 \(p\equiv 1\pmod6\) 的素因子构成(并且指数被上面三种形状严格限定)
- \(v\) 不含任何 \(p\equiv 1\pmod6\) 的素因子(否则 \(x\) 会多出新的 \(1\bmod6\) 素数,\(\tau(x)\) 就不可能还是 \(75\))
由于 \(n=m^2\) 或 \(3m^2\),所有 \(v\) 中的素因子在 \(n\) 里都自动变成偶次,因此不会触发 “\(p\equiv 5\bmod6\) 奇次指数导致 \(\mathrm B=0\)” 的禁忌。
三种骨架(对 \(m\) 的形式)
把 \(x\) 的指数减半(因为 \(m^2\)):
- \(x=p^{24}q^2 \Rightarrow m\) 含 \(u=p^{12}q\)
- \(x=p^{14}q^4 \Rightarrow m\) 含 \(u=p^7 q^2\)
- \(x=p^4q^4r^2 \Rightarrow m\) 含 \(u=p^2 q^2 r\)
其中 \(p,q,r\) 两两不同且都 \(\equiv 1\pmod 6\) 的素数。
于是,对任意上界 \(R\)(取 \(R_1\) 或 \(R_2\)),答案就是\(\displaystyle{\sum_{u\in \mathcal U} \#\{v\le R/u:(\forall k\in\mathbb{Z}: 6k+1\nmid v)\}.}\)
只要我们预处理一个前缀计数函数\(F(t)=\#\{1\le v\le t: (\forall k\in\mathbb{Z}: 6k+1\nmid v)\},\) 那么每个骨架 \(u\) 的贡献就是 \(F(\lfloor R/u\rfloor)\)。
最终只需要把这两块统计结果相加即可。
代码
1 | from bisect import bisect_right |