1/81が0.0123456790・・・というように循環する理由

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$となります。

この記事を書いた人

目次
閉じる