1/81を計算すると、0.0123456790123456790・・・と123456790が無限に循環することになります。
from decimal import *
getcontext().prec = 46
print(f"{Decimal('1')/Decimal('81'):>30.46f}")
0.0123456790123456790123456790123456790123456790
偶然といえば偶然ですが、何かうまく説明する理由がないか考えてみます。なぜ、8が抜けているのかも不思議です。
111111111(1が9個)を9で割る
まず、111111111(1が9個)を9で割ります。
from decimal import *
print(f"{Decimal('111111111')/Decimal('9')}")
12345679
ここから不思議なことが始まります。111111111を10000000+1000000+100000・・・+10+1に分けます。そしてそれぞれを9で割ります。
print(f"{Decimal('100000000')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 10000000')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 1000000')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 100000')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 10000')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 1000')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 100')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 10')/Decimal('9'):>30.20f}")
print(f"{Decimal(' 1')/Decimal('9'):>30.20f}")
11111111.11111111111111111111 1111111.11111111111111111111 111111.11111111111111111111 11111.11111111111111111111 1111.11111111111111111111 111.11111111111111111111 11.11111111111111111111 1.11111111111111111111 0.11111111111111111111
右揃えにして小数点の位置を揃えると整数部分では計算結果の合計が123456789になることがわかります。ところが小数部分は0.11111111・・が9つあるので、これを合計すると1になります。このため、123456789に1を加えると123456790になります。
循環小数
次の計算を考えます。
1をある数で割って、1.1111のように1を無限に循環するようにする。
12をある数で割って、121212のように12を無限に循環するようにする。
123をある数で割って、123123123のように123を無限に循環するようにする。
1234をある数で割って、1234123412341234のように1234を無限に循環するようにする。
print(f"{Decimal( '1')/(Decimal('1')-Decimal('0.1')**1):>30.20f}")
print(f"{Decimal( '12')/(Decimal('1')-Decimal('0.1')**2):>30.20f}")
print(f"{Decimal( '123')/(Decimal('1')-Decimal('0.1')**3):>30.20f}")
print(f"{Decimal('1234')/(Decimal('1')-Decimal('0.1')**4):>30.20f}")
1.11111111111111111111
12.12121212121212121212
123.12312312312312312312
1234.12341234123412341234
$1.11111\cdots =0.1^0+0.1^1+0.1^2+0.1^3+0.1^4+0.1^5\cdots=\displaystyle\frac{1}{1-0.1}$となります。 同様に
$12.1212121212\cdots =0.01^0+0.01^1+0.01^2+0.01^3+0.01^4+0.01^5\cdots=\displaystyle\frac{1}{1-0.01}=\frac{1}{1-0.1^2}$
となります。循環する桁数が1桁の場合は$1$を$1-0.1=0.9$、$1-0.1^2=0.09$で割ればよいことになります。
さらに一般化するとn桁の小数を循環させるためには$1$を$1-0.1^n$で割ればよいことになります。
12345679を無限に循環させるために
12345679を循環させるためには、12345679は9桁なので0.999999999で割れば
from decimal import *
getcontext().prec = 200
print(f"{Decimal('12345679')/Decimal('0.999999999'):>40.30f}")
print(f"{Decimal('111111111')/Decimal('9')/Decimal('0.999999999'):>40.30f}")
12345679.012345679012345679012345679012
12345679.012345679012345679012345679012
$\displaystyle\frac{12345679}{0.999999999}=12345679.012345679・・・$となります。ところで$\displaystyle 12345679=\frac{111111111}{9}$なので
$\displaystyle\frac{111111111}{9\times 0.999999999\times1000000000}=\frac{1}{81}=0.0123456790\cdots$となります。