循环节那点事儿

0、绪叨

这是我在五六年前用VB编的小程序了,现在将程序和其理论知识在这里分享下。唉,那时不知世上有个叫Mathematica的数学软件,不然也不会使用VB编写十多行代码来解决这个小问题了。不过,用VB编写一些基础命令确实挺锻炼编程能力的。

介绍:将一个分数化为小数时,会得到有限小数循环小数(也称无限小数)。循环小数又可以细分为纯循环小数混循环小数。在循环小数中最短的重复出现的数字称为循环节。 比如$\frac{1}{7}=0.\dot{1}4285\dot{7}=0.142857142857\cdots $,其中142857就是$\frac{1}{7}$的循环节(循环节一般用数字上面加点或横线的方法表示,这里选择前者)。显然,不同的分数其循 环节一般是不同的,那么它与什么有关呢?

点此下载程序>>
程序界面:

Snap2

1、理论

1.1、概念

欧拉函数$\varphi \left( n \right)$:表示在不大于$n$的正整数中与$n$互质的整数的个数。
欧拉定理:设$m$是大于1的整数,$\left( a,m \right)=1$,则${{a}^{\varphi \left( m \right)}}\equiv 1\left( \bmod \ m \right)$。
指数:若$m$是大于1的整数,$\left( a,m \right)=1$,则使得同余式${{a}^{\gamma }}\equiv 1\left( \bmod \ m \right)$成立的最小正整数$\gamma $叫作$a$对模$m$的指数。
原根:若$a$对模$m$的的指数是$\varphi \left( m \right)$,则$a$叫作模$m$的一个原根。
定理${^{[1]}}$:设$0<a<b$,$\left( a,b \right)=1$,则有理数$\frac{a}{b}$能表成纯循环小数的充要条件是$\left( b,10 \right)=1$。

1.2、核心

结论:转化公式:$\frac{a}{b}=\frac{{{\alpha }_{1}}{{\alpha }_{2}}\cdots {{\alpha }_{\gamma }}}{{{10}^{\gamma }}-1}=0.{{\dot{\alpha }}_{1}}{{\alpha }_{2}}\cdots {{\dot{\alpha }}_{\gamma }}$ ,其中,$0<a<b$,$\left( a,b \right)=1$,$\left( b,10 \right)=1$,$\gamma $为10对模$b$的指数。
实际上,$\gamma $即为循环节位数,${{\alpha }_{1}}{{\alpha }_{2}}\cdots {{\alpha }_{\gamma }}=\left( {{10}^{\gamma }}-1 \right)\frac{a}{b}$为循环节。

证明

设循环节共有$x$位,则有:
\[ \begin{align} & \frac{a}{b}=0.{{{\dot{\alpha }}}_{1}}{{\alpha }_{2}}\cdots {{{\dot{\alpha }}}_{x}} \\ & \quad =0.{{\alpha }_{1}}{{\alpha }_{2}}\cdots {{\alpha }_{x}}\times \left( 1+{{10}^{-x}}+{{10}^{-2x}}+\cdots +{{10}^{-kx}}+\cdots \, \right) \\ & \quad =0.{{\alpha }_{1}}{{\alpha }_{2}}\cdots {{\alpha }_{x}}\times \frac{1}{1-{{10}^{-x}}} \\ & \quad =\frac{{{\alpha }_{1}}{{\alpha }_{2}}\cdots {{\alpha }_{x}}}{{{10}^{x}}-1} \\ \end{align} \]

下面证明$x=\gamma $。由于$\frac{a}{b}=\frac{{{\alpha }_{1}}{{\alpha }_{2}}\cdots {{\alpha }_{x}}}{{{10}^{x}}-1}$,所以存在正整数$m$使得$ma={{\alpha }_{1}}{{\alpha }_{2}}\cdots {{\alpha }_{x}}$且$mb={{10}^{x}}-1$,由欧拉定理知$x=\gamma $。||

这一结论至少有两个用处。

首先,可以将纯循环小数化为分式(对于混循环小数,可以将其成两部分),比如$0.\dot{1}4285\dot{7}=\frac{142857}{999999}=\frac{1}{7}$;其次,为计算循环节提供了一种方法,下面对此进行解释说明。

设$0<a<b$,$\left( b,10 \right)=1$,$\left( a,b \right)=1$,则循环节位数即为10对模$b$的指数$\gamma $,所以其循环节为\[\left( {{10}^{\gamma }}-1 \right)\frac{a}{b}\]。在Mathematica软件中,$\gamma =\text{MultiplicativeOrder}[10,b]$。

Mathematica代码:

a = 7; b = 29;
g = MultiplicativeOrder[10, b]
circle = (10^g - 1) a/b
N[a/b, 3 g]

输出结果:

Out[1] = 28
Out[2] = 2413793103448275862068965517
Out[3] = 0.241379310344827586206896551724137931034482758620689655172413793103448275862068965517

注:由于函数MultiplicativeOrder[ 10, b ],要求10和b互质,所以上面的代码只能计算$\left( b,10 \right)=1$时的循环节,同时,循环节中前面的零也都被忽略。下面是上面程序的CDF动态演示,其中b也受这些限制,而在我编的VB程序中判断条件较多,没有这类问题。在Mma中可以直接使用函数RealDigits来得到有理数的循环节。

[WolframCDF source=”https://shuli.xianyungu.com/wp-content/uploads/2014/01/Cycle-Node.cdf” width=”320″ height=”295″ altimage=”” altimagewidth=”” altimageheight=””]

下载此CDF文件>>

参考文献

[1] 闽嗣鹤. 初等数论[M]. 高等教育出版社, 2007, 62.

About the Author

野鹤

自由学者,爱好广泛,虽无一精通,却常乐在其中...
open

本博客已停止更新,请您移步到我的新博客阅读更多文章。