10

GWリレー記事:有限和とZeilberger's Algorithm

343
2

こんにちは,itouです.

この記事はオープンチャット 積分,級数の部屋 のGW mathlogリレーの4日目の記事です.

有限和とZeilberger's Algorithm

有限和をやります.積分,級数はどこいったねんという感じですが, 世の中はまさに離散化の時代なのです .特に多重ゼータ値の分野における各種関係式がどこまで離散化できるか,そして有限和等式が何に活用できるか,まさに研究が始まったところであるようです.私は皆がどうやって離散化の関係式を導いているのか全く知らないのですが,今回はZeilberger's Algorithmで有限和等式を見つける方法を紹介します.

Zeilberger's Algorithmとは?

説明するよりpythonコードを見た方が早い!!

      # -*- coding: # -*- coding: cp932 -*-
import sympy
from math import *
from fractions import Fraction
import sys
#(dep+2)項間wt次多項式漸化式は、(wt+1)(dep+2)個の係数変数をもつ
wt=1
dep=0
# 変数の数を指定
num_vars = (wt+1)*(dep+2)
# sympy.Symbolを使用して変数を生成
x = [sympy.Symbol(f'x_{i}') for i in range(num_vars)]
def binom(n,k):# binomial coefficient
    if k > n  or  k < 0 :
        return 0
    else:
        return Fraction(factorial(n), factorial(k)*factorial(n-k))
    
def beta(n):
    s=Fraction(binom(2*n,n),4**n)
    
     
    return s
def seque(N):#一般項による計算
    s=0
    for n_1 in range(0,N):
        s+=beta(n_1)
    return s
def calculate_sequence(n):
    sequence = [seque(n) for n in range(0, n+1)]
    return sequence
def coefficient(i):
    s=0
    for l in range(0,wt+1):
        s+=x[i*(wt+1)+l]*n**(wt-l)
    return s
def coefficient_str(i):
    s=0
    for l in range(0,wt+1):
        s+=x[i*(wt+1)+l]*n**(wt-l)
    return s
def divide_dict_to_lists(my_dict, k, n):
    total_elements = (k + 1) * (n + 2)
    # 辞書を (k+1) 個ずつの要素を持つリスト (n+2) 個に分ける
    chunks = [dict(list(my_dict.items())[i:i + k + 1]) for i in range(0, total_elements, k + 1)]
    # 分けた結果を (n+2) 個のリストに格納
    result_lists = [list(chunk.values()) for chunk in chunks]
    return result_lists
def  divide_dict_to_lists1(x):
    expression = "+".join([f"{coeff}*n^{len(x)-exp}" for exp, coeff in enumerate(x, start=1)])
    result_string = f"{expression}"
    print(result_string)
MAX=(wt+1)*(dep+2)+3+dep#nの値は
a=calculate_sequence(MAX)
equations = [x[0]-1]
for n in range(1,(wt+1)*(dep+2)+4):#不定方程式を解き係数決定
    equations.append(sum(coefficient(i)*a[n+dep-i] for i in range(0, dep+2)))
solution = sympy.solve(equations, x)
if solution==[]:
    print("解なし.wtまたはdepの値を大きくして下さい.")
    sys.exit()
# キーを引用符で囲んで新しい辞書を作成
converted_data = {str(key): value for key, value in solution.items()}
# x_i_valueに値を文字列として代入(分数形式で表示)
x_i_values = {}
for key, value in converted_data.items():
    index = int(key.split('_')[1])  # キーからインデックスを取得
    x_i_values[f'x_{index}_value'] = str(value)
# 結果の表示
print("深さ"+f"{dep}"+"重さ"+f"{wt}")
for key, value in x_i_values.items():
    print(f"{key}: {value}")
result = divide_dict_to_lists(x_i_values, wt, dep)
for x in result:
    divide_dict_to_lists1(x)

    

冗談です.解説すると,与えられた関数aNが満たすような斉次多項式係数漸化式を発見する漸化式です.wtは多項式の次数で,dep+2項漸化式を探索します.見つからなかったら「"解なし.wtまたはdepの値を大きくして下さい."」と表示されます.

多項式係数漸化式に関する理論については 子葉さんの記事:
超幾何数列の基礎シリーズ
にまとめられています.

等式たち

発見した漸化式を直接解く,あるいは別の式が同一の漸化式(と初期条件)満たすことを直接確認することで,以下のような等式が得られます.
以下,(a)nをポッホハマー記号(a)n=a(a+1)(a+n1),[a]n=(a)nn!とします.

0

以下は定義からすぐにわかる.
(nk)=(1)k[n]k
(nak)=(1)k[n+a]k[a]k

1

k=0N[N]k[a]k=[1a]N

2

k=02N[2N]k[a]N[a]2Nk=[12]N[a2]N[1+a2]Na1N+a1 

3

0n2n1N[a]n1[1a]Nn2=1+a(1a)N+4Ak=1N1i=0k1[a]i[1a]i(i+1)2(i+2)2(i+a)(i+1a)a(1a)
ただし
A=a(a+1)2+a(1a)+34a(a+1)(1a)(2a)2a(1a)1
とする.

4

k=0N(1)k(Nk)[a]k[1a]k=k=0N[a]k2[1a]Nkk=0N(1)k(Nk)(N+kk)[a]k[1a]k=k=0N[a]k2[1a]Nk2
1の式は二項変換による対称性を示しています.(積分でいうとt1tに置換したようなものでしょうか?二項変換はかなり重要な性質をもっているように思います.)
離散化の観点からいうと,3の式は反復積分の等式の離散化かもしれません.
4の式はゼータ関数と深く関わっているようです(「光とゼータ関数の特殊値」というpdfに出てくるアペリ類似数を一般化したもの).

感想

今回はZeilberger's Algorithmの利用方法を紹介しました.まあお気づきの通り,式自体を自分で持ってくる必要があること,漸化式は一般には解けないこともあって,このアルゴリズムで等式を得るのは非常に効率が悪いです.   

とはいえ,有限和が複数の非自明な表示をもつことを踏まえると,漸化式で特徴づけるというアイデアは重要だと思っています.大体遊びつくしたと思うので,別の有限和等式を求める方法を探したいところです.

さて,GWリレー記事は明日で最終日です.最後の方がきっちり締めてくれるでしょう!

おまけ データ

私が集めたデータです.
上の式が下の漸化式を満たすという意味です.
βn=[12]nとします.

aN=0n2n1Nβn1βNn20=(n2+4n+4)an+2+(3n29n334)an+1+(3n2+6n+92)an+(n2n14)an1

aN=0n2n1Nβn2βNn10=(n)an+(n1)an1

aN=0n3n2n1Nβn3βn2βNn10=(n2+2n+1)an+1+(2n25n94)an+(n2+3n+2)an1

aN=0n2n1NNβn2βNn10=(n1)an+(n1)an1

aN=0n2n1NN2βn2βNn10=(n22n+1)an+(n2n)an1

aN=0n2n1Nβn2Nn2+1βNn10=(n+2)an+1+(2n52n)an+(n+12)an1

aN=0n2n1NβNn1n1+1βn20=(n+2)an+1+(2n52n)an+(n+12)an1

aN=0n2n1NβNn1n1+1βn2n2+10=(n2+4n+4)an+1+(2n26n92)an+(n2+2n+34)an1

aN=0n3n2n1NβNn1βn2βn30=(n2+2n+1)an+1+(2n25n94)an+(n2+3n+2)an1

aN=0n3n2n1NβNn1βNn2βn30=(n2+2n+1)an+1+(2n25n94)an+(n2+3n+2)an1

aN=0n2n1NβNn1βNn20=(n2+2n+1)an+1+(2n24n74)an+(n2+2n+34)an1

aN=1n2n1NβNn1βNn20=(n2)an+1+(2n2+14)an+(n214)an1
aN=1n3n2n1NβNn1βNn2βNn30=(n4+3n3+3n2+n)an+1+(3n48n3274n2158n)an+1+(3n4+7n3+174n2+38n316)an+(n42n312n2+12n+316)an1

aN=0n2n1Nβn2βNn11(Nn1+1)(Nn1+2)1(n2+1)(n2+2)0=(n2+14n+45)an+1+(2n2512n60)an+(n2+232n+15)an1

aN=0n2n1Nβn1βNn21n1+10=(n2+3n+2)an+1+(2n24n94)an+(n2+n+14)an1

aN=0n2n1NβNn1βNn2(Nn1)(Nn2)0=(n2)an+1+(2n22n34)an+(n2+2n+34)an1

aN=k=0N1k4βk40=(n4+2n3+32n2+12n+116)an+1+(2n42n332n212n116)an+(n4)an1

aN=0<n2n1<N1Nn11Nn20=(n2+2n+1)an+2+(3n23n1)an+1+(3n2)an+(n2+n)an1

aN=0<n2n1<N1n121Nn20=(n3+6n2+12n+8)an+3+(5n317n222n11)an+2+(9n3+10n2+10n+3)an+1+(7n3+7n26n+2)an+(2n36n2+6n2)an1

aN=0<n2n1<N1n121(Nn2)20=(n4+8n3+24n2+32n+16)an+3+(8n432n354n248n19)an+2+(18n4+20n3+30n2+16n+3)an+1+(16n4+24n330n2+20n5)an+(5n420n3+30n220n+5)an1

aN=0<n2n1<NN2n1(n1+1)(n1+2)1Nn20=(n4+2n3)an+1+(2n44n3n2+2n+1)an+(n4+2n3+n2)an1

aN=0n1N1((Nn1)!)2n1!0=(n2+2n+1)an+1+(2n2)an+(1)an1

投稿日:202454
更新日:202454
OptHub AI Competition

この記事を高評価した人

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

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

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

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

投稿者

itou
itou
144
13135
数学勉強中. https://twitter.com/G7UOMb0Zd8V7LdP

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. 有限和とZeilberger's Algorithm
  2. Zeilberger's Algorithmとは?
  3. 等式たち
  4. 0
  5. 1
  6. 2
  7. 3
  8. 4
  9. おまけ データ