Home
Blog
Products
Profile
Study
Collatz
© 2024 Oizumi Yuta

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

2024-12-11

はじめに

2(2m−1)−33\displaystyle\frac{2(2^m - 1) - 3}{3}32(2m−1)−3​ (数式を TEX で出力できるように日々奮闘中) の計算結果を既約分数で出力したかった。そこで次の Python 組み込みライブラリを使用した。

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

実装

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()

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

m=6k−2 (k=1,2,3,4,5)m = 6k - 2\ ( k = 1, 2, 3, 4, 5)m=6k−2 (k=1,2,3,4,5) のとき整数になっている。この理由は 2 の mod 9 での位数が 6 だから。

参考

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