【Python】既約分数で出力する

# はじめに

$\\displaystyle\frac{2(2^m - 1) - 3}{9}$ の計算結果を既約分数で出力したかった。そこで次の Python 組み込みライブラリを使用した。

https://docs.python.org/ja/3/library/fractions.html

# 実装

```py
from fractions import Fraction

# mの範囲を指定
m_values = range(1, 30)

# ヘッダーを表示
header = (
    f"{'m':>4} | {'Numerator':>16} | {'Denominator':>16} | "
    f"{'Fraction':>16} | {'is Integer':>16}"
)
separator = "-" * len(header)
print(header)
print(separator)

for m in m_values:
    numerator = 2 * (2**m - 1) - 3
    denominator = 9
    fraction = Fraction(numerator, denominator)
    is_integer = fraction.denominator == 1

    # 計算結果を表示
    row = (
        f"{m:>4} | {fraction.numerator:>16} | {fraction.denominator:>16} | "
        f"{str(fraction):>16} | {str(is_integer):>16}"
    )
    print(row)

```

# 実行結果

```
$ python3 sample.py 
   m |        Numerator |      Denominator |         Fraction |       is Integer
----------------------------------------------------------------------------------
   1 |               -1 |                9 |             -1/9 |            False
   2 |                1 |                3 |              1/3 |            False
   3 |               11 |                9 |             11/9 |            False
   4 |                3 |                1 |                3 |             True
   5 |               59 |                9 |             59/9 |            False
   6 |               41 |                3 |             41/3 |            False
   7 |              251 |                9 |            251/9 |            False
   8 |              169 |                3 |            169/3 |            False
   9 |             1019 |                9 |           1019/9 |            False
  10 |              227 |                1 |              227 |             True
  11 |             4091 |                9 |           4091/9 |            False
  12 |             2729 |                3 |           2729/3 |            False
  13 |            16379 |                9 |          16379/9 |            False
  14 |            10921 |                3 |          10921/3 |            False
  15 |            65531 |                9 |          65531/9 |            False
  16 |            14563 |                1 |            14563 |             True
  17 |           262139 |                9 |         262139/9 |            False
  18 |           174761 |                3 |         174761/3 |            False
  19 |          1048571 |                9 |        1048571/9 |            False
  20 |           699049 |                3 |         699049/3 |            False
  21 |          4194299 |                9 |        4194299/9 |            False
  22 |           932067 |                1 |           932067 |             True
  23 |         16777211 |                9 |       16777211/9 |            False
  24 |         11184809 |                3 |       11184809/3 |            False
  25 |         67108859 |                9 |       67108859/9 |            False
  26 |         44739241 |                3 |       44739241/3 |            False
  27 |        268435451 |                9 |      268435451/9 |            False
  28 |         59652323 |                1 |         59652323 |             True
  29 |       1073741819 |                9 |     1073741819/9 |            False
```

# 所感

整数かどうかの判定を `is_integer = fraction.denominator == 1` で行っているが、Python 3.12 から `is_integer()` が導入されたらしい。

[fractions --- 有理数 is_integer()](https://docs.python.org/ja/3/library/fractions.html#fractions.Fraction.is_integer)

`:>` で右寄せできることを初めて知った。

$m = 6k - 2\ ( k = 1, 2, 3, 4, 5)$ のとき整数になっている。

$2$ の $(\mathbb{Z}/9\mathbb{Z})^{\times}$ における位数は $6$ だから $m > 0$ のとき

$2(2^m - 1) - 3 = 2^{m + 1} - 5 \equiv 0\pmod 9 \iff m = 6k + 4\ (k = 0, 1, 2, \cdots)$

となることを ChatGPT に教えてもらった。

# 参考

https://docs.python.org/ja/3/library/fractions.html