こんにちは,itouです.
この記事はオープンチャット 積分,級数の部屋 のGW mathlogリレーの4日目の記事です.
有限和をやります.積分,級数はどこいったねんという感じですが, 世の中はまさに離散化の時代なのです .特に多重ゼータ値の分野における各種関係式がどこまで離散化できるか,そして有限和等式が何に活用できるか,まさに研究が始まったところであるようです.私は皆がどうやって離散化の関係式を導いているのか全く知らないのですが,今回は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)
冗談です.解説すると,与えられた関数
多項式係数漸化式に関する理論については
子葉さんの記事:
超幾何数列の基礎シリーズ
にまとめられています.
発見した漸化式を直接解く,あるいは別の式が同一の漸化式(と初期条件)満たすことを直接確認することで,以下のような等式が得られます.
以下,
以下は定義からすぐにわかる.
ただし
とする.
1の式は二項変換による対称性を示しています.(積分でいうと
離散化の観点からいうと,3の式は反復積分の等式の離散化かもしれません.
4の式はゼータ関数と深く関わっているようです(「光とゼータ関数の特殊値」というpdfに出てくるアペリ類似数を一般化したもの).
今回はZeilberger's Algorithmの利用方法を紹介しました.まあお気づきの通り,式自体を自分で持ってくる必要があること,漸化式は一般には解けないこともあって,このアルゴリズムで等式を得るのは非常に効率が悪いです.
とはいえ,有限和が複数の非自明な表示をもつことを踏まえると,漸化式で特徴づけるというアイデアは重要だと思っています.大体遊びつくしたと思うので,別の有限和等式を求める方法を探したいところです.
さて,GWリレー記事は明日で最終日です.最後の方がきっちり締めてくれるでしょう!
私が集めたデータです.
上の式が下の漸化式を満たすという意味です.