Slide 1

Slide 1 text

あえて開平法で平方根を 求めるコードを作ってみた 久島慶大

Slide 2

Slide 2 text

自己紹介 名前:久島慶大 職業:AIエンジニア 最近の案件:画像認識 最近の出来事:イベントに出典するため、別のAIを開発することに。正直プレッ シャー

Slide 3

Slide 3 text

開平法とは? ひっ算を用いて整数の平方根を求めるアルゴリズム 一言でいうと、手計算でルートを求める手法 手順 1.小数点を基準に二けたずつ区切る 2.二乗して最も左のブロック以下となる最大の整数を  求める。その数を右側に1つ、左側に2つ書く 3.左側は足して、右側は引く 4.(左側の数の末尾にNをつなげたもの*N)が右の次のブロックまで取った  もの以下になる最大の整数を求める 5. 3~4を繰り返す 出展元:開平法のやり方と原理 | 高校数学の美しい物語

Slide 4

Slide 4 text

実装 前ページの手順を次のように読み替えて、Pythonで実装。 1. 桁数が奇数の時、先頭に0を加える。その後、計算したい桁数’00’を末尾に加える 2.二けたずつ区切って、リストに格納 3.左側の数、右側の数をそれぞれ0で初期化 4.右側の数字を更新 (右側の数字 ← 100*右側の数字+リストのi番目の要素 )  5. (10*左側の数字 + n) * n<= 右側の数字となる最大の整数nを求める 6.右側、左側の数字をそれぞれ更新 (右側の数字 ← 右側の数字 - (10*左側の数字 + n)*n                 左側の数字 ← 10*左側の数字 + 2*n) 7. 4~6をリストの要素分繰り返す

Slide 5

Slide 5 text

今回作成したコード 詳しくはQiitaに挙げているので、確認してください (開平法で平方根を任意桁まで求める【 Python実装付き】 #数学 - Qiita)

Slide 6

Slide 6 text

ニュートン法と比較してみた x y= a ニュートン法とは?ー数値解を求めるアルゴリズムの一種 一言でいうと、xの値を決める→(x,f(x))をから接線を引く を繰り返してf(a)=0となるaを求める方法 方法 1.初期値x_0を求める 2.f(x_0)とf’(x_0)を求める 3.x_0- f(x_0)/f’(x_0) を計算する。これが次の xになる 4.2~3を繰り返す

Slide 7

Slide 7 text

方法 1~100万までの整数を10万個出力してみて、誤差が 10^-8以下になるまで計算を行い すべて計算し終わるまでの時間を計測 誤差(err)は以下の式で求めている ※今回はニュートン法の初期値は 1.0で固定している a:ルートの中身 n:数値解

Slide 8

Slide 8 text

結果 開平法 ニュートン法 1回目 12.03186 8.02147 2回目 11.48783 8.58757 3回目 11.53064 8.82972 平均 11.68344 8.47959 ニュートン法の方が早く収束

Slide 9

Slide 9 text

まとめ ニュートン法の方が、精度、計算時間が優れていた。 もっと言うと、コードサイズもニュートン法の方が短かった ー使われているものには使われるだけの理由があるんだなと感じた 双方のアルゴリズムをスライドにまとめているときに、ニュートン法の方が説明が書きやすかった ーシンプルであることも良いアルゴリズムであることの指針の一つかなと感じた

Slide 10

Slide 10 text

最後に Qiitaに今回の記事を挙げてます いいね押してもらえると励みになります