十六进制小数_巧算任意进制下有理数的小数形式

机缘巧合

2020.3.13凌晨,wyt在用Excel统计数据时绘制了许多柱状图,然而却使用了实际数据而非百分比,直至完成后才不觉惊醒。为了不用重复绘图,他打算对原数据进行手动除法。数据共有三组,每组的总量分别为36、37、27,看起来它们作为分母都很繁琐,然而实际操作时却发现并非如此。37、27作为分母算得的分数都是三位一循环,整齐得可怕。我觉得事情不简单,于是打算稍做探究。

25d1fe973f3d6c007ca9b1c8336020e4.png下列各小数均是某一个正整数作为分子,37作为分母除得的结果(保留了六位小数)

尾数7在“帮忙”?

小学时我们就知道7作为分母时小数是六位一循环,看起来很整齐,于是我不由得想到了或许是37与27具有共同的尾数7使得它们性质如此相似。于是,我进行了7,17,...97作为分母,分子任意除得的诸多小数,发现除了7与77六位一循环(那是因为77整除7),37与27三位一循环,其余各数作为分母所得的商的循环节很长以致规律难寻。这样看来,尾数7不是37、27具有三位一循环的小数的性质的原因。

37*27=999

在注意到1/37=0.027027...以及1/27=0.037037...后,我才发现了37与27的

乘积为999=10^4-1。是的,这才是它们作为分母时小数有三位的循环节的原因。

因为

be563cef500ffd69a1072bbe5e6c5800.png

于是有

e0f699254a156c338242ad7f38baa1c1.png

那么1/37与1/27可以分别如下进行计算

d4a3ad41823dddecab8aacd85f43430f.png

98e5bde40e3e380bb345577a47c9aff7.png

例如,

59b5b91e3257b39f8e306cb4542dc00b.png

而抛开37与27两个因子,将999分解质因数,

41836f253625b1e6e81a15c2f538d2a0.png

它的其他因子作为分母时也有相同的情形。如

ba6c93004a71bafc9c957f9df8386f19.png

于是我们可以轻松得出,假设a是999的一个因子,那么b/a(b为绝对值小于a的整数且与a互质)的循环节有三位,循环节为b*999/a。对于真分数如此,那么假分数只需对于真分数加上特定整数即可。

推广:10^n-1

在我们将999研究得较为透彻之后,或许又想看看9、99、9999等等数字的因子作为分母时的情况了。

551fb5bc2f8f7adc0dcf745e52fc2117.png

类比前文可知,假设a为9的因子,b为99的因子,c为9999的因子,x,y,z为三个整数,它们的绝对值分别小于a,b,c,那么x/a有一位循环节,其大小为x*9/a;y/b有两位循环节,其大小为y*99/b;z/c有三位循环节,其大小为z*99/c。假分数在真分数基础上加减整数即可。例如,

94e6119ae3fb38c530236e0474f91132.png

对于10^n-1=99...99(n-1个9)的因子,由于

e8c8136cf5f94e030d24237f2f451908.png

可得若d为10^n-1的因子,w为绝对值小于d的整数,那么w/d的循环节有n-1位,其值为w*(10^n-1)/d。例如,142857*7=999999,那么以7为分母的有理数的循环节有六位,而1/7的循环节就是142857。

事实上,有理数集等同于有限小数集加上无限不循环小数集,而用10^n-1的因式去证明就很简便。(若有兴趣大家去知乎查找证明吧)然而用这种方法去找任意有理数的小数并不简便,因为不知要找到连续多少位9的天文数字才是该有理数的倍数,因而很多分数的循环节过长以致于肉眼根本看不出,这决定了通过寻找10^n-1的因式来计算小数的方法实用性较差。

*推广:10^n-m

“循环节”的定义十分狭义,它必须是以相同的几位数为周期去进行。我们为何不能定义一些更为广义的“伪循环节”呢?

让我们“随意”去算几个分子为1的分数

c0147f5923b2fccaeccb2804e5e2cf7d.png

当我们挑选的分母不大于10^n却又很接近它的时候(记分母为10^n-m),会发现有很明显的规律出现:商有所谓的“伪循环节”,即“伪循环节”有n位,第一个的值为1,后面每一个的值均为前一个的m倍。例如,1/9997中,“伪循环节”有四位,且第二个“伪循环节”3=1*3,第三个“伪循环节”9=3*3。

道理易解释,类比多项式函数,我们定义q与r

a3b0fe0ef1d0d260119030c1ae157020.png

当我们用10^n-m去除1时,商q1的值为

10^(-n)。这时我们去看一下余数r1,

9724f5260bce3b7b509ca86829922d98.png

这时我们用10^n-m去除r1,商q2与余数r2分别为

0e9f64c6fe90a46b7e7f02fa20261a58.png

递推一下,对于任意不小于2的整数k,

d5d4ad3efc26a935f29b8f0ec6267fa4.png

现在我们对一下的k个式子进行叠加

048dcb3c9f47dea302b2504bec4babad.png

得到

418d1a4b840f9ffbf7b34bdb12c2d95c.png

当k趋于∞时有rk趋于0,那么Σqj即为商。

根据之前我们总结出的qj的形式,

d1713c9e422d23b7c580686caabfafb4.png

可以看出之前我们所说的商的“伪循环节”的样子了(“伪循环节”有n位,第一个的值为1,后面每一个的值均为前一个的m倍)。

我们扩展到真分数的范畴,

b94f992f4eb1e8b2b89f247e9818ab7a.png

efe74b64ca016d13388186470a408155.png

对于这样的结论,我们开始对其应用,比如前文所题2/7的一种计算方式是999999=142857*7,于是可知分数六位一循环,循环节为142857*2=285714。

现在利用“伪循环节”的方式,由14*7=98,知“伪循环节”为两位,第一个为28,第二个为56,第三个为112(进位使得第二个“伪循环节”变为57,也由于后一个“伪循环节”进位使得第三个变为14)。甚至可以再过分一下,由7*1=7,知“伪循环节”有一位,第一位为2,第二位为6,第三位为18等等(是的这里有许多进位的情况)。

那么来一些正经一点的例子来体现一下“伪循环节”的作用

7799bfae48dfa84bbe0b388a21ebb2db.png

把这些分数的小数值口算到小数点后六七位不成问题。

最后说明一下,显然“伪循环节”不固定,这就要求对于固定的分母,我们要去权衡好其倍数10^n-m中n与m的大小,这样才能方便计算。

*推广:十进制只是开始

如果说手上有一台计算器,那么我们大概率还是希望动用这个工具来求得有理数的小数形式。可是,计算器是十进制的呀(至少目前我没见过八进制或是十六进制的计算器),求解任意进制下有理数的小数形式依旧要费力地去“除”。

那么,为何不把前文的规则引入到任意进制的情况下呢?

对与B进制下的分数a/b,

442e3c81c1625ad4e9e5489117b5cb91.png

其B进制下的小数的“伪循环节”有n位,第一个的值为1,后面每一个的值均为前一个的m倍。

我们在八进制下看三个例子,

adb112eaf9d358b240673ade8b57abe6.png为观察方便,我用中括号将每个“伪循环节”括起来,之后再按照位权进行加法即可

不得不承认这样的笔算会稍难于十进制,但难点主要在于我们对于八进制下的乘法规则不如十进制下那么熟练,而利用“伪循环节”计算小数的前面几位的方法并没有难度上的提升。

再拿一个十六进制的数看看,

c038ede31f3f98ad00d480364ac0e283.png与上面八进制相同,中括号内的每个数占一个位权

可以说,进位的难度在n比较小,即“伪循环节”较短的情况下比较大。

结语

本就是无心插柳之举,不期望巧算的方式有很好的实用性,只是希望能提供一种思考方式。

过程中我几乎没有参考其他资料,没有合作讨论者,甚至于类似“伪循环节”这样定义都是生造出来的,所以文章中若有明显错误也望各位dalao海涵。最后,十分欢迎指正与交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值