0

k-リュカ数の四捨五入表示についての考察(その3)とその予想

11
0

はじめに

 この記事では 前回の記事 に続いてk-リュカ数の四捨五入表示について考察していきます。
 さて前回までの考察で以下のことまでわかっていたのでした。

 k-リュカ数Ln[k]の四捨五入表示
Ln[k]=αkn
n0nで成り立つようなn0のうち最小のものをnkとおくと
nk<k2(2k+1)π2(1π248)(<k33)
が成り立つ。特にnk=O(k3)と評価できる。

 前回の記事を書いてからというもの、どうにかここから評価を改善できないか試行錯誤したものですが何とも言えず仕舞いだったので、ここは一般のkについて考えてるばかりでなくnkの特殊値を見てみなければと思いさっそくnkを計算してみることにしました。一旦計算の過程は省くとしてnknk=nk/k3の値について以下の結果を得ることができました。
n2=2n2=0.2500n3=4n3=0.1481n4=6n4=0.0937n5=11n5=0.0880n6=14n6=0.0648n7=23n7=0.0670n8=26n8=0.0507n9=38n9=0.0521n10=42n10=0.0420n11=57n11=0.0428n12=63n12=0.0364n13=80n13=0.0364n14=100n14=0.0364n15=121n15=0.0358n16=145n16=0.0354n17=170n17=0.0346n18=198n18=0.0339n19=228n19=0.0332n20=278n20=0.0347n21=312n21=0.0336n22=360n22=0.0338n23=409n23=0.0336n24=463n24=0.0334n25=519n25=0.0332n26=590n26=0.0335n27=665n27=0.0337n28=732n28=0.0333n29=815n29=0.0334n30=902n30=0.0334n31=993n31=0.0333n32=1088n32=0.0332n33=1202n33=0.0334n34=1323n34=0.0336n35=1431n35=0.0333n36=1544n36=0.0330n37=1695n37=0.0334n38=1817n38=0.0331n39=1979n39=0.0333n40=2148n40=0.0335n41=2323n41=0.0337n42=2504n42=0.0337n43=2650n43=0.0333n44=2842n44=0.0333n45=3083n45=0.0338

 見るからにnk0.0333130くらいの値に収束しそうな感じがします。つまるところ以下の予想が立てられます。

nkk330が成り立つ。

 この予想の精密化と解決が今後の課題となりますが、私には思い付きそうもないのでこの記事の読者にでも委ねようと思います。

nkの計算について

 具体的にnkを求めるにあたって、手計算で挑むにはLn[k]αkn2nであるので人力では分が悪すぎるということでこのためにpythonで簡単なプログラムを書いた(プログラミングにも数値計算にも明るいわけではないので賢いプログラムであるかは不明)。
 手順としてはαkの近似値をニュートン法で求め、Ln[k]とそれに対するLn[k]αknを順に計算していき、Ln[k]αknk回連続して0になったら ランダムウォークの手法 nkが決定する。αkの精度が荒くてLn[k]αknの値が大きくなったときは停止して精度を良くしてからやり直す。といった具合である。
 実際に使ったプログラムは以下のようである。

      import decimal
d=750   #有効数字の桁数
decimal.getcontext().prec=d

m=42    #求めるkの最小値(やり直すとき用)
K=50    #求めるkの最大値
N=10000 #計算するnの上限値(n_kが膨大になったとき用)

def natti(A,k): #計算回数の少ない漸化式L_{n+1}=2L_n-L{n-k}の適用
    n=len(A)
    A+=[2*A[n-1]-A[n-k-1]]
    return

def alpha(k):   #α_kをα^{k+1}-2α^k+1=0からニュートン法で求める
    a=decimal.Decimal('2')
    while (a-2)*a**k+1)/(((k+1)*a-k)*(a**(k-1))>10**(-d):
        a=a-((a-2)*a**k+1)/(((k+1)*a-k)*(a**(k-1)))
    return a

for k in range(m,K+1): 
    a=alpha(k)
    L=[k]+[2**(i+1)-1 for i in range(k)]    #L_nの初期値
    
    count=0 #L_nとround(a^n)が連続して一致した回数
    notfind=True
    for i in range(N):
        natti(L,k)  #L_{k+i}を計算する
        R=L[k+i]-round(a**(k+i))
        if R==0:
            count+=1
        else:
            count=0
        if count==k:    #L_n-round(a^n)がk回連続して0になったらn_kを出力して抜ける
            print(f'n_{k}={i+1}')
            notfind=False
            break
        if R>1000:  #L_n-round(a^n)が大きくなりすぎても抜ける
            break

    if notfind: #n_kがNよりも大きいときやa^nの誤差が大きくなったときに抜ける
        print(f'n_{k} not find')
        break
    

 ニュートン法の精度を上げるには有効数字decimal.getcontext().precを大きくすればよい。無闇に上げすぎても計算時間が増えるだけなので難しいところ(パソコンの性能次第ではありますが)。

投稿日:202125
更新日:2024515
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

子葉
子葉
1093
268538
主に複素解析、代数学、数論を学んでおります。 私の経験上、その証明が簡単に探しても見つからない、英語の文献を漁らないと載ってない、なんて定理の解説を主にやっていきます。 同じ経験をしている人の助けになれば。最近は自分用のノートになっている節があります。

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中