Deep Dive技术精读
0.3333 和 1/3 在同一个计算器里是两回事
在 /calculators/fraction/ 页面里,a=24、b=36 给 2 / 3,同一页面下面 d=0.3333 给 3333 / 10000——读者想问的是 1 / 3,工具给的是 0.3333 的精确值,中间没有任何标记。逐层拆开这两个字段背后的三套精度哲学:gcdParts 刻意读 .toString() 的最短 round-trip 串,因为 0.3 是 10^-1 上的整数 3、不是 double 底下的 5404319552844595/18014398509481984;但 0.1+0.2 那个 double 给回的是 17 位串 0.30000000000000004,喂进 a/b 会产出 16 位分子的比;decimalToFraction 完全不走字符串,Math.floor、b−a、1/frac、h1/k1 全程 double;a/b as decimal 那一行是裸浮点除法,24/36 显示 0.6666666666666666;输出用字符串而不是数字,因为 0.3/0.1 在 double 里是 2.9999999999999996,而 0.9/0.3 恰好等于 3;0:0 约成 0:0、0:n 约成 0:1、n:0 约成 1:0,但只有 n:0 真能从比例页触达;k1 > maxDenom 不含等号,0.0001 的分母恰好 10000 能通过,0.3333 在 maxDenom 9999 下返回 null;早退容差 1e-12、末兜底容差 1e-9 松三个数量级;maxDenom 默认 10000 界面上没有字段可改,错误文案与默认参数耦合;fraction 的 a/b/d 用 type: number,prime-factorization 用 type: bigint,因为 <input type=number> 在 2^53 以上 round-trip 不可信;hint 写「最多 20 位」是准确的(2^64−1 是 20 位),但 19 位保证在范围内、20 位要看量级,是必要条件不是充分条件;factorWhole 的 n ≤ 1 守卫分支不可达,注释自认 settle here rather than trusting the caller's guard;168 个素数到 997、Miller–Rabin 七个底数在 2^64 以下确定、Pollard rho 用 Brent 循环检测加 128 步批量 GCD;τ(360)=24、τ(10^9+7)=2、τ(2^63−1)=96、τ(2^64−1)=128。
Read full article →阅读完整解析 →Deep Dive技术精读
质因数分解的算力账:从试除卡死 3 秒到 Miller–Rabin、Pollard–Brent 与批量 GCD
复盘质因数分解计算器从 O(√n) 试除法到确定性 7 基数 Miller–Rabin、Pollard-Brent 周期判环、128 步批量 GCD 及位运算剥离的完整优化历程。拆解人脑十进制心算与计算机二进制算法的本质差异,看如何将 64 位整数的最坏分解耗时从数秒彻底压进毫秒级。
Read full article →阅读完整解析 →