あらきけいすけのメモ帳

あらきけいすけの雑記帳2

ChatGPT(無料版)に有意味な変数名と無意味な変数名のコードの解読をさせてみた

変数名を無意味化して「Pythonコードを解読」させてみた。変数名を「解読」のきっかけに使っているようだ。(まだ動作の推測をミスリードするような変数名に変える、例えば三角関数関連の名称を変数に使うとどうなるか試していない)コードはNewton法の漸化式:\displaystyle x_{k+1}=\frac{n-1}{n}x_{k}+\frac{a}{nx_{k}^{n-1}}からx_{\infty}=\sqrt[n]{a}を求めている。

これは何をするプログラムでしょうか?

def aaa ( bbb, ccc ) :
  ddd = 1
  while ccc > 0 :
    if ccc % 2 == 1 :
      ddd = ddd * bbb
    bbb = bbb * bbb
    ccc = ccc // 2
  return ddd

def eee ( fff, ggg, hhh ):
  if fff <= 0: return 0
  iii = fff
  jjj = 0
  while jjj/iii - 1 < -hhh or hhh < jjj/iii - 1:
    jjj = iii
    iii = ((ggg-1)*iii)/ggg + fff/(ggg*aaa(iii,ggg-1))
  return iii

fff = 43
ggg = 55
hhh = 1E-12
kkk= eee(fff,ggg,hhh)
print( 'kkk', kkk , aaa(kkk,ggg) )

ANSWER

このプログラムは、数学的な計算を行うものです。

関数 aaa(bbb, ccc) は、指数計算 bbb^ccc を計算するためのアルゴリズムであり、二分法を使用しています。

関数 eee(fff, ggg, hhh) は、方程式 fff = ggg * fff / (ggg-1) + fff / (ggg * (iii^(ggg-1))) を数値的に解く*1ためのアルゴリズムであり、ニュートン法を使用しています。この方程式は、 iii についての非線形方程式であり、この方程式の解が iii になります*2

このプログラムは、 fff = 43、 ggg = 55、 hhh = 1E-12 という値を使用して、関数 eee を呼び出し、 kkk という変数にその戻り値を割り当てています。そして、 kkkggg のべき乗を計算して、それらを表示しています。

このプログラムは、数学的な計算を行うため、実際に何を計算しているのかを理解するには、数学的な背景知識が必要です。

これは何をするプログラムでしょうか

def iPow ( base, exponent ) :
  power = 1
  while exponent > 0 :
    if exponent % 2 == 1 :
      power = power * base
    base = base * base
    exponent = exponent // 2
  return power

def nThRoot ( base, order, EPS ):
  if base <= 0: return 0
  root = base
  rootPrev = 0
  while rootPrev/root - 1 < -EPS or EPS < rootPrev/root - 1:
    rootPrev = root
    root = ((order-1)*root)/order + base/(order*iPow(root,order-1))
  return root

base  = 43
order = 55
EPS   = 1E-12
result= nThRoot(base,order,EPS)
print( 'result', result , iPow(result,order) )

ANSWER

このプログラムは、数学的な計算を行うためのプログラムです。

関数 iPow(base, exponent) は、指数計算 base^exponent を計算するためのアルゴリズムであり、二分法を使用しています。

関数 nThRoot(base, order, EPS) は、 base の order 次の根を数値的に解くためのアルゴリズムであり、ニュートン法を使用しています。このアルゴリズムは、 root の値を変化させていき、 root の order 乗が base に等しい場合に*3収束します。EPS は収束の閾値を表し、許容誤差を設定するために使用されます。

このプログラムは、 base = 43、 order = 55、 EPS = 1E-12 という値を使用して、関数 nThRoot を呼び出し、その戻り値を result という変数に割り当てています。そして、 result と order のべき乗を計算して、それらを表示しています。

このプログラムは、数学的な計算を行うため、実際に何を計算しているのかを理解するには、数学的な背景知識が必要です。

*1:元の式のiiiが不完全にfffにすり替わっている

*2:方程式の解が入る変数はiiiだが「この方程式の」で指示された式がマチガイなので意味が通らない

*3:目的から考えるとウソではないが、収束判定の説明としてはマチガイ