Skip to content

Instantly share code, notes, and snippets.

@hobione2k
Last active June 7, 2024 05:47
Show Gist options
  • Save hobione2k/b091d36b0e0addbd9f111846dae352cb to your computer and use it in GitHub Desktop.
Save hobione2k/b091d36b0e0addbd9f111846dae352cb to your computer and use it in GitHub Desktop.
某ワールド用
from decimal import Decimal, getcontext
from fractions import Fraction
from typing import Iterable, List
getcontext().prec = 4 * 8
def continued_fraction(n) -> Fraction:
if len(n) == 1:
return Fraction(n[0])
else:
return Fraction(n[0]) + 1 / continued_fraction(n[1:])
def fraction_to_dec(f: Fraction) -> Decimal:
return Decimal(f.numerator) / Decimal(f.denominator)
def ans_to_dec(n: List[int]) -> Decimal:
frac = ''.join(map(str, n))
fs = f'0.{frac}'
return Decimal(fs)
def continued_fraction_number(n, max_n: int) -> Iterable[int]:
# 連分数表現を得る
yield 0
for _ in range(max_n):
i = 1/n # 逆数
a = int(i) # 整数部
yield a
n = i - a # 小数部
def resolve(ans: List[int]) -> Decimal:
# 答えを小数にする
n = ans_to_dec(ans)
# 連分数表現を得る
con_frac_n = list(continued_fraction_number(n, 5))
print(con_frac_n)
con_frac_n += [1] * 100 # 末尾は1が続く
# 再計算
f = continued_fraction(con_frac_n)
return fraction_to_dec(f)
def print4(n: Decimal):
# 小数点以下
fr = f'{n}'[2:]
ans = [fr[x:x+4] for x in range(0, len(fr), 4)]
for n, a in enumerate(ans):
print(n, a)
def main():
ans = [9005, 6439, 6704, 8685]
print4(resolve(ans))
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment