筆算による開平計算の自動化

まずはこちらの記事をご覧ください.

筆算によって,様々な正の平方根の値を求めました.小数点以下になればなるほど,計算の面倒臭さが増していきます.頭がおかしくなるかと思いました.

そこで考えたのです.

「筆算の過程をプログラムに出力させれば良いんじゃね?」

というわけで,テキトーに書いたコードがこちらです.

import re

# 入力 平方根を求めたい実数
n = input()
# ループの回数
k = 15

# 整数部分と小数部分の分離
m = re.match(r"(\d+)\.?(\d*)", n)
integer_part, fractional_part = m.groups()
integer_part_list = list(integer_part)
fractional_part_list = list(fractional_part)

# 2桁区切りのリストを作成(整数部分)
integer_list = []
# 奇数桁の場合は頭は1桁
if len(integer_part_list) % 2 == 1:
    integer_list.append(int(integer_part_list.pop(0)))
# 2桁区切り
for i in range(int((len(integer_part_list)/2))):
    integer_list.append(int(integer_part_list[i*2])*10+int(integer_part_list[i*2+1]))

# 2桁区切りのリストを作成(小数部分)
fractional_list = []
# 小数点以下の数字が奇数個の場合は0でパディング
if len(fractional_part_list) % 2 == 1:
    fractional_part_list.append('0')
# 2桁区切り
for i in range(int((len(fractional_part_list)/2))):
    fractional_list.append(int(fractional_part_list[i*2])*10 + int(fractional_part_list[i*2+1]))

# 次の桁の値を探す関数
def extraction_sqrt(amari, left_num, block_num):
    amari = amari * 100 + block_num
    # 次の桁の値を探す
    next_num = 9
    while (left_num * 10 + next_num) * next_num > amari:
        next_num -= 1
    # 計算結果を出力
    print((left_num * 10 + next_num), end='  ')
    print(amari)
    print(next_num, end='  ')
    print((left_num * 10 + next_num) * next_num)
    # 新しい余りと左側の計算
    amari = amari - ((left_num * 10 + next_num) * next_num)
    left_num = (left_num * 10 + next_num) + next_num
    return amari, left_num

amari = 0
left_num = 0
# 整数部分の計算
for block_num in integer_list:
    amari, left_num = extraction_sqrt(amari, left_num, block_num)
# 小数部分の計算
for block_num in fractional_list:
    amari, left_num = extraction_sqrt(amari, left_num, block_num)
# 小数部分の計算をk回繰り返す.
for a in range(k):
    amari, left_num = extraction_sqrt(amari, left_num, 0)

\sqrt{10}の出力はこんな感じ↓

3  10
3  9
61  100
1  61
626  3900
6  3756
6322  14400
2  12644
63242  175600
2  126484
632447  4911600
7  4427129
6324547  48447100
7  44271829
63245546  417527100
6  379473276
632455526  3805382400
6  3794733156
6324555320  1064924400
0  0
63245553201  106492440000
1  63245553201
632455532026  4324688679900
6  3794733192156
6324555320328  52995548774400
8  50596442562624
63245553203363  239910621177600
3  189736659610089
632455532033667  5017396156751100
7  4427188724235669
6324555320336749  59020743251543100
9  56920997883030741

表示位置のズレが気になりますが,もうメンドクサイのでこれで良しとしましょう.

「勝手気ままに高校数学」シリーズ一覧へ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA