24

初投稿

1096
1

この記事はぜんぜん数学的に厳密ではありません ゆるして                                                     

初投稿


MZVの具体値とか求めるアプリいる?
ってきいたら作って欲しいといわれたので作りました。

それだけなのですが、そこまでにいろいろとあるのでそれを話します。

プログラムの数学


mathlogのコミュニティガイドライン
を読んできたのですが、実は結構震えています。
数学として、プログラムの話をしてもよいのでしょうか。
どう考えてもさすがにそれはまずいので、計算量の話をしますが、
それでもここで話す内容ではないのではと考えてしまいます。
Mathlog で投稿可能な内容として次のようなものがあります。
物理学やコンピュータサイエンス、経済学などの数学の応用先となる分野の内容*
*運営としては、物理やコンピューターサイエンスなどの数学を応用した内容によって、数学に対する見方が変わる人や数学を学ぶきっかけになる人も多くいると考えております。そのため、数学を応用した分野の内容も投稿可能としています。

とあるので、少しだけ安心しました。
いろいろと調べるうちに、コードのサポートもあるようなので、
それも使ってみたいと思います。

本題


まずMZVは初見なので定義を聞きました。←MZVの文字かっこいい!
定義1 Multiple Zeta Value
ζ(s1,s2,,sr):=0<n1<n2<<nrn1s1n2s2nrsr

頑張って打ちました。
これ初めて見たときぎょっとしましたね。なんでΣの上に数字が無いんやと。
よく下をみたらありますね。謎の範囲が。
これを満たすようなn1,n2,,nrのすべてのパターンで足し算するらしいです。
これをプログラムにぶち込んで計算しましょう。
というわけなのですが、ここはmathlogなので、プログラムではなく計算量の話をします。

MZVの計算量がおおい。


MZVは見ての通りすごい形で総和を計算するのですが、プログラムにするのは簡単で、
ループを何回かかませば簡単に実装できます。
では本題の計算量がどれくらいになるのかなのですが、
このままだと上限を決めていないので無限大になってしまいます。!!
これではいけないので、次のような関数を定義してみましょう
定義2 Multiple Zeta Value
ζap(s1,s2,,sr):=a<n1<n2<<nr<p+rn1s1n2s2nrsr(a<p)

このようにして範囲を制限してあげることで、計算量が無限大にならないようにします。

具体的な計算法


具体的には、このように変形してあげます。
ζap(s1,s2,,sr)=n1=a+1pn2=n1+1p+1nr=nr1+1p+r1n1s1n2s2nrsr

こうすることでプログラムの形が見えてきます。
r=3と限定してコードを書いてみましょう。
サイトに実装して動かすのでjavascriptで書きます。

[VScode:Dark (Visual Studio -C/C++)]
0function MZV3(inputs) {
1    var results = [];    //結果を入れる箱
2    let n = Number(inputs[3].value);
3
4    let i1=0;
5    let i2=0;
6    let i3=0;
7    let y1;
8    let y2;
9    let y3;
10    let d1 = new BigNumber(0);
11    let d2 = new BigNumber(0);
12    
13    let s1 = inputs[0].value;        //ユーザーからの入力
14    let s2 = inputs[1].value;
15    let s3 = inputs[2].value;
16    let sum = new BigNumber(0);
17    for(i1 =      1; i1 <= n-2; i1++){
18        for(i2 = i1 + 1; i2 <= n-1; i2++){
19            for(i3 = i2 + 1; i3 <= n  ; i3++){
20                y1 = BigNumber(i1).pow(s1);    //i3 ^ s1
21                y2 = BigNumber(i2).pow(s2);    //i3 ^ s2
22                y3 = BigNumber(i3).pow(s3);    //i3 ^ s3
23                d1 = y1.times(y2);
24                d2 = d1.times(y3);
25                d1 = BigNumber(1).dividedBy(d2);
26                sum = sum.plus(d1);            //sumに計算した値を足していく。
27            }
28        }
29    }
30    results.push(sum.toString());         //結果を詰め込む
31    let results;
32}


という感じです。(ぐへぇ)
プログラムが分からない人もいると思うので、説明すると、プログラム中にあるforというものが、
ここでいうの範囲にあたります。
これを重ねているのは、が連なっているということと同じです。

で、計算量はどのくらいになるのかというのを見積もると、超大雑把にみてO(pr)
くらいかなぁと考えました。
(javascriptの四則演算の計算量のオーダーがはっきりとしないので、
ここでいう計算量はループの数ということにして、計算量を比較していきます。)
ここで、prζap(s1,s2,,sr)から来ています。
実用的にはpのほうがrよりもずっと大きく設定するので、これでいいでしょう。
これ、指数レベルのオーダーなので、多変数&精度を求められると、計算時間が爆発してしまいます。
さて、O(pr)というのは、ループの数のオーダーなのですが、
これをいかにして減らすのでしょうか???????

名言より


ルロイ修道士の名言に、次のようなものがあります。

困難は分割せよ



これはルネ・デカルトの言葉なのですが、ルロイ修道士の方がなじみ深いですね。
この言葉をもとに、まずは簡単な問題へとレベルを落としてみます。
手始めに、こういうものをしてみましょう
ζ05(1,1)=0<n1<n2<7n11n21
=112+113+114+115+116+123+124+125+126+134+135+136+145+146+156

実際に書いてみると、きれいですね。
きれいに並んでいるので、どうにかうまい計算方法を見つけたいものですが...
例えばこういう風にするとどう見えるでしょうか。
11(12+13+14+15+16)+12(13+14+15+16)+13(14+15+16)+14(15+16)+15(16)

おお、綺麗にまとまりましたね。こうすると、下から計算していくと、計算量が減らせそうです。
例えば
12+13+14+15+16を計算するときに
13+14+15+16計算結果を使いまわせます!
こうすることで、計算量を減らすことができます。(すごい発見)

でも、一般の場合は?



ここで問題になってくるのが、一般の場合です。
一般の場合、、、急に想像しずらくなりました。
でも、私たちには上に書いた具体例という強力な武器があります。
これをもとに考えてみましょう。


もし、pが大きくなったとしても、r=2ならば上記の方法をのばすことで対応できます。
では、rを変えたとき、どう対処すればよいでしょうか。
私はどうしたかというと、ルロイ修道士の名言に従いました。
ζ04(1,1,1)=0<n1<n2<n3<7n11n21n31

これを展開してみましょう。(頑張って)
...
と言いたいところですが、賢い皆さんならこれが3次元的に広がりそうなのは分かると思います。
なので、さらに問題を分割してみたいと思います
具体的には、n1=1の時を考えます。
1123+1124+1125+1126+1134+1135+1136+1145+1146+1156
これを見ると分かる通り、綺麗にくくれそうです。
11(123+124+125+126+134+135+136+145+146+156)
むむむ、、、よく見てみるとさっきの2変数の形に似ています。
というよりこれこう書けるじゃないですか!
11(ζ15(1,1))
ということはn1=2のときもなりそう、、、
12ζ25(1,1)
実際になりましたね!(実際になるか展開して確かめるのは読者に任せる。)
ということで、結局こうなります。
ζ04(1,1,1)=0<n1<51n1ζn15(1,1)


よし、やっと一般の場合を予想できます。多分こんな感じでしょう。
ζap(s1,s2,,sr)=a<n1<p+11n1s1ζn1p+1(s2,s3,,sr)

これ、証明できるかな?
証明

証明の強力な手助けとして、上に頑張って書いた具体例があります。
それをもとに証明方法を考えてみましょう。
と言っても、多分n1a+1,a+2,,pの時を考えて全部足せばいけるやろ!
という気持ちでやってみます。
ζap(s1,s2,,sr)=a<n1<n2<<nr<p+rn1s1n2s2nrsr
ここで、右辺の
a<n1<n2<<nr<p+rn1s1n2s2nrsr
においてn1=t(a<t<p+1)の時、この式は、
(a<)t<n2<<nr<p+rts1n2s2nrsr=ts1t<n2<<nr<p+rn2s2nrsr=1ts1ζtp+1(s2,s3,,sr)
となりますね!
あとはこれをt=a+1,a+2,,pの時をすべて足すだけです!
ζap(s1,s2,,sr)=a<t<p+11ts1ζtp+1(s1,s2,,sr)
証明できました!

ζap(s1,s2,,sr)=a<n1<p+11n1s1ζn1p+1(s1,s2,,sr)



...
証明できましたが、これがどう計算量の削減につながるのでしょうか。
じつは、ここにはさっき見出した素晴らしい発見が見えない形になってしまっています。
そう、それが計算結果の使いまわしです。

おお、綺麗にまとまりましたね。こうすると、例えば
12+13+14+15+16を計算するときに
13+14+15+16計算結果を使いまわせます!
こうすることで、計算量を減らすことができます。(すごい発見)

はいはい、さっきやりましたね。でもいったいどこに消えたのでしょうか。
上の方の、計算結果を使いまわせます!のところで書いていた分数たちに注目しましょう。
11(12+13+14+15+16)+12(13+14+15+16)+13(14+15+16)+14(15+16)+15(16)
これですね。これをよくよく考えると次のように表せられます。
11(ζ16(1))+12(ζ26(1))+13(ζ36(1))+14(ζ46(1))+15(ζ56(1))
これ、さっきの公式1に似てませんか?
ね、似てるよね。
ここで、使いまわしはどれをどう使いまわしていたのか思い出すと、

12+13+14+15+16を計算するときに
13+14+15+16計算結果を使いまわせます!

なので、ζ16(1)を計算するとき、ζ26(1)を使いまわせる!と言っているのです。
うん...

は?


ということでこれ、どうやって一般の場合に前回の結果を使うのでしょうか。
上の具体例をよく見ると、こういうことになっています。
ζ16(1)=ζ26(1)+16
つまり?
ζ16(1)ζ26(1)=16
とみれば、下の数をずらした物の差は、簡単に表せるような気がします。
では、これに従い公式1を使って計算してみましょう。いい結果が出ろ!たのむ!
ζap(s1,s2,,sr)ζa+1p(s1,s2,,sr)=a<n1<p+11n1s1ζn1p+1(s1,s2,,sr)a+1<n1<p+11n1s1ζn1p+1(s1,s2,,sr)=1(a+1)s1ζa+1p+1(s2,s3,,sr)
うわぁぁぁぁでたぁぁぁぁ!!!!
n1=a+1のときだけ引き算されなくてこんな式ができました
ζap(s1,s2,,sr)ζa+1p(s1,s2,,sr)=(a+1)s1ζa+1p+1(s2,s3,,sr)

ここまで来て気づいたこと


はい、急に何かと思われるでしょうがここまで来て一つかなり重い問題が浮かび上がってきました
それは、、、


記事を書くのがめんどくさすぎる!!!!


ここまで書いてきましたが皆さん分かってますよね、おかしいと。
背景がまずおかしいし、一番上では文字がうごくし、
なんか急にめっちゃカラフルなプログラムが出てきたりと
これね、ほとんどHTMLで書いているのでいろいろできるんですね
できるんです、できるんですけど問題が山ほどあります
CSSが使えない、プレビューが異次元に飛ぶ、TEXがバグりにバグる
HTMLもバグりにバグる。しんどかったです
そろそろ頭もMathlogもパンクしそうなので、これはpart1としてここまでにしたいと思います。(ごめんね)

次回!!!


あの公式2が主人公に⁉⁉⁉
計算量が指数時間から○○○時間まで落ちた!!!!
お楽しみに!

参考にさせていただいた記事、サイト


MathlogでのHTMLテクニック 任意色の枠など |sinh76821661
MathlogにおけるMarkdown記法に関するメモ (2020年12月時点) |ぱるま
エディタの使い方 |Mathlog ヘルプ
chatGPT
投稿日:2024325
更新日:20241020
OptHub AI Competition

この記事を高評価した人

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

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

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

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

投稿者

Y.K.
Y.K.
103
5968
掛け算が苦手

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. でも、一般の場合は?
  2. は?
  3. ここまで来て気づいたこと