有理数与小数展开
有理数是能写成 的数(、 为整数且 )。把这个分数按长除法展开成小数,得到的形态只有两种:有限,或者从某位起无限循环。无限不循环的展开被排除在外,这条排除的理由短得出乎意料——只需数一数余数能取几个值。
本页给出这条等价的两个方向,再往下问一个更细的问题:循环节有多长?答案不在长除法里,而在分母的因数分解与一个模运算的阶上。
1 · 长除法的余数与鸽巢原理
长除法的每一步都是同一个动作:把当前余数乘 ,除以 ,商得一位小数,留下新余数。新余数是「乘 之后对 取余」的结果,只能落在 这 个值里。
定理 1.1 任何有理数 的十进制展开或是有限小数,或是从某位起无限循环的小数。
证明 展开的每一步由当前余数唯一决定:余数相同则此后的商位与余数序列完全相同。余数取值只有 种,故前 步里必有两步的余数相同(鸽巢原理)。若中途出现余数 ,展开终止,得有限小数;否则某个余数第二次出现,从它起整段重复,两次出现之间的那串商位即循环节。∎
这条论证只用到余数的取值个数,与十进制没有关系。换成二进制,余数照样只有 种,结论同样成立,只是「有限」的判据从「分母只含 与 」换成「分母只含 」。这个换底的后果在 浮点数:实数在代码里的残影 里有直接的用处。
警示 · 引擎最初只在非负输入上验过。computeLongDivision(-1, 2) 返回的 digit 是
,decimalString 把它拼成了字面的 -1.-5:JS 的 % 对负数给出负余数,负号一路渗进了每一位商。lab 把分子的输入下界钉在
,所以页面上从未暴露过。现在展开只在绝对值上做,符号单独记在 negative 字段里。
2 · 循环小数还原成分数
反方向同样成立:任何有限小数或循环小数都是有理数。有限小数直接按位数取分母,。循环小数的标准手法是错位相减——乘上 的适当次幂使两式的循环部分对齐,相减即把无限的尾巴消掉。
例 2.1 设 ,即 。前置段长 、循环节长 ,故取 与 两个倍数:,,相减得 ,即 。
同一个结果也可以由等比数列求和给出: 的循环部分是首项 、公比 的等比数列之和,即 ,加上前置段 得同一个分数(等比数列求和的公式见 等比数列与前 n 项和)。两条路殊途同归:错位相减是把求和公式的推导过程就地做了一遍。
| 小数展开形态 | 例子 | 归类 |
|---|---|---|
| 有限小数 | 、 | 有理数 |
| 无限循环小数 | 、 | 有理数 |
| 无限不循环小数 | 、 | 无理数 |
3 · 循环节的长度
定理 1.1 只保证循环会出现,没说循环节有多长。这件事完全由约到最简之后的分母决定,而且分工清楚:把分母写成 ,其中 与 互素。
定理 3.1 设 已约到最简, 且 。则前置非循环段的长度为 ,循环节的长度为 在模 下的乘法阶,即使 成立的最小正整数 。 时展开有限。
由此得到纯循环与混循环的分界:(分母不含 与 )时小数点后立刻进入循环,称纯循环小数;否则前 位不参与循环,称混循环小数。 纯循环, 混循环且前置段一位, 前置段两位——三者的循环节都是 位,因为剥掉 与 之后剩下的都是 。
循环节长度的上限是 ,在 是模 的原根时取到: 长 、 长 、 长 、 长 。这样的素数在 以内共 个:。上限之外的情形更常见,而且落差可以很大: 的循环节是 而不是 , 只有 ; 是素数, 有六个因数, 的阶取到了其中最小的 ,于是 的循环节只有 位。阶必整除 ,具体落在哪个因数上要算过才知道。
core/real-numbers.ts 里的长除法设了
步上限,
是第一个展不完的分母(
的循环节长
)。这条上限比看起来更容易撞上:lab 允许的分母到
,其中
个()的展开超过
位,最长的是
,循环节
位。定理 3.1 那条路不做除法,只做一次因数分解与一次求阶,因此色块阵列上每一格都算得出来,长除法那一栏则会截断显示并注明未闭合。
4 · 等于一的那个循环小数
是严格相等,不是「无限接近」。至少有三条独立的论证。
错位相减:设 ,则 ,两式相减得 ,故 。
等比数列求和: 是首项 、公比 的无穷等比数列之和,。
反证:若 与 不等,则 是一个正数,必存在正整数 使 。但 的前 位小数全是 ,故 ,即 ,矛盾。
这条等式说明十进制表示不是一一对应的:分母只含 与 的分数各有两种无限小数写法,一种以 结尾、一种以 结尾()。除此之外没有别的重复写法,所以「小数展开」与「实数」之间那个几乎是双射的对应,差的仅是这一族可数多个点。反过来看,本页的还原公式在 上给出的分数是 而不是别的什么,单测把这一条钉住了。
5 · 参考文献
- Repeating decimal. Wikipedia. 循环小数的记法、还原公式与循环节长度。https://en.wikipedia.org/wiki/Repeating_decimal
- Multiplicative order. Wikipedia. 乘法阶的定义与它整除 这一性质。https://en.wikipedia.org/wiki/Multiplicative_order
- Full reptend prime. Wikipedia. 使 成为原根的素数,即循环节取到上限的那些分母。https://en.wikipedia.org/wiki/Full_reptend_prime
- 0.999…. Wikipedia. 这条等式的多种证明与常见误解。https://en.wikipedia.org/wiki/0.999...