どうも,このペースでゆくと一日の来訪者が1万人を突破しそうだ.
わたしもついに,アルファブロガーの仲間入りをしたのだろうか?
ゼルコバの木テント村
来訪者数が25万人を越えている.最近は1日の来訪者が2千を超す場合もある(滅多にないが).どこから湧いてくるのかよく分からないが,数が増えるのは単純にうれしい.
べき乗和の一般公式を求めているところだが,ゴールがやや近付いたという雰囲気が出てきた.黒木の公式とファウルハーバーの公式を架橋するというのが目標だが,黒木の公式を一般化できる可能性が出てきた.まだ,どこかに計算ミスが残っているようだが,もし,これで基本的なところが通っているとすれば,解決は時間の問題だ.そのためには少し環境整備しなくてはならない.複数の公式・恒等式を使わなくてはならないが,その中にはまだ数値的に動作確認されていないものも含まれる.その辺りは黒木氏にお願いしているところなのだが,あまり積極的ではないように見かけるので,そろそろ自分でやる必要が出てきた.まず,julia のサビ落としから始めなくてはならない.
動作確認する必要のある関数(アルゴリズム)には以下がある.
まず,黒木の公式から確認したいのだが,方法はあるだろうか?今の環境では変数の入った多項式を文字式として扱うことはできない.従って,できるとしても,kとnを指定して値を基準値と比較するしかない.そのためには,まず第3項のべき乗和の公式を作る必要がある.これはkごとにF_k(n)=F(n)のような多項式として表示した式だ.現在,julia 環境には,仕掛りのプロジェクトとして「階乗素因数のべき」というのが上がっている.走らせると,以下のような出力が吐き出される.
n=14^16 ゼロ=2494949494949492 n=10000000000000000 r=6.000000000000000041323199371444658202404150485
572577732799965364508923497182429
多分,これはAMSのDaily Epsilonに関係するものと思われるが,すっかり忘れてしまった.TrailingZeros という関数名があるので,巨大数末尾のゼロの個数をカウントしていたものと思われるが… その他に,primeExponent という関数も入っている.階乗数Nをb進数表記したときの末尾ゼロの個数をカウントしているのだろう.使っているモジュールは Printf と Primes だけだ.高精度演算が必要なので,setprecision などが使われている.データ型はBigIntとBigFloatを使っている.あとは,@printf や println だけだ.
べき乗和公式というフォルダを作って,ここから始めることにした.⇒PowSum1~5という関数セットを作った.動作している.べき乗和を単純に計算する処理を組み込んで結果が一致していることを確認した.べき乗するところはbig(n)^kのような形式で実行する必要がある.さもないと桁落ちが発生してしまう.さて,いよいよ黒木の公式だ.これは大きいのでかなり大変だろう.
いや,かなり簡単に実装できた.実際,この関数はべき乗和関数を再帰実行しているので,既成のPowerSumがそのまま使えた.これで3つの関数が出揃ったことになる.動作確認が必要なルーチンがあと,2つある.黒木の恒等式とべき指数の逆順変換だ.黒木の恒等式は片付いた.べき指数の逆順変換も通った.これで準備は整った.
前にもどこかでこのような話題が出たことはあるが,どこでだったか覚えていない.G++をやっていた時期ではないかと思う.この時期には海外の系図研究者と活発な対話が成立していた.ゼルコバの木に入力してみようと思っのだが,動かない.サブ機にはコラッツ特注版というのが入っているが,起動時エラーになる.開発機に入っているのはこれとは別バージョンだが,フォントサイズを変更しようとしてエラーが止まらなくなってしまった.
開発環境でリビルドして以下のエラーになった.
2>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\ Common7 \IDE\VC\VCTargets\ Microsoft.Cpp.WindowsSDK.targets(46,5): error MSB8036: Windows SDK バージョン 10.0.17763.0 が見つかりませんでした。必要なバージョンの Windows SDK をインストールするか、プロジェクト プロパティ ページで SDK バージョンを変更するか、ソリューションを右クリックして [ソリューションの再ターゲット] を選択してください。
[ソリューションの再ターゲット] を実行してビルドできるようになった.ビルドできた!実行してみよう.⇒問題なく起動できた.氏名を入力すると下の欄に10という数字が表示されている.多分コラッツ版で入れたものだろう.⇒配偶者を登録し,配偶者に未婚の子どもを入力して例外が発生した.
▲配偶者に連れ子を入力して例外が発生した.GP例外のようだ.いや,TRIBEBOX::StartTribe でスローしている例外だ.group()が空でないために論理エラーとみなされている.MakeUpTree→SortTribeList→StartTribe というシーケンスだ.SortTribeListでは始系列を取り出そうとしているので,動作が矛盾している.⇒暫定的に止めて動作するようになった.
人名枠の中身を出力しているところを探さなくてはならない.関数名を忘れてしまった.NameBox.cppというのがある.PrintParameterでパラメータ類を出力している.
▲所属を表示しようとして停止した. Bobject::setClipRegionでマッピングモードがMM_TEXTになっているためだ.
デルタ多面体を三角錐に分解する問題:任意の多面体をデルタ多面体に転換することは容易に可能だが,多面体→デルタ多面体の変換には多義性がある.つまり,デルタ多面体には三角錐に分解できるものとできないものがある.それをどのように識別するか?それが問題だ.平面グラフと多面体は等価であると考えられるので,グラフ理論上の問題として考えるのが妥当かもしれない.平面グラフについて少し考えてみよう.
①平面的グラフ:平面的グラフは球面など種数0の曲面に描けるグラフと同値である.②平面グラフにおいて,辺で囲まれた極小な領域を面という.有界な面を有限面,そうでない面を無限面と呼ぶ.③オイラーの公式:種数gの曲面S上に描かれた連結グラフがSをf個の領域に分割しているとき,|V|-|E|+f=2-2g.③ワグナーの定理:グラフが非平面的であるのは,K3,3またはK5を部分グラフとして含むときかつそのときに限る.④クラトフスキーの定理:グラフが平面的グラフであるための必要十分条件は5角形グラフあるいは6角形グラフに縮小し得るようなグラフを元のグラフが含まないことである.⑤四色定理:平面グラフは4色で彩色できる.⑥2連結3平面正則グラフは1因子分解できる.これは四色定理と同値.
外平面的グラフ:すべての頂点が無限面の回りにくるように描ける平面的グラフ.このうち,辺集合が極大となっているものを極大外平面的グラフと呼ぶ.極大外平面的グラフには切断点がなく無限面以外の面がすべて三角形になるように平面描画できる.
タットの定理:グラフGが完全マッチングを持つのは頂点集合Vの任意の部分集合Uに対し,V-Uの導出部分グラフの奇数個の頂点を持つ連結成分の個数が高々|U|であるとき,かつそのときに限る.→ガライの補題
基数が2のときの動作がおかしい.2は素数なので(n-1)/zの値はきっちりpにならなくてはならないはずなのに,端数が出ている.⇒2^kでk=7の場合と,14の場合で不一致が発生している.⇒2^7をダンプして末尾ゼロを目測でカウントしてみたところ,127あった.この数字は正しい.TrailingZeros が返してくる値は126で1小さい.どこかで桁落ちなど起きているのだろうか?
primeExponentが返してくる値が,126になっている.
n=128, p=2, k=6, e=64+32+16+8+4+2=126
どうも,対数関数のlogが誤差を出しているようだ.
p=2 n=128 log =6.999999999999999999999999999999999999999999999999999999999999999999999999999931
この値のfloorを取ると6になってしまう.これは本来7でなくてはならないのではないだろうか?2^7=128だから,log_2(128)=7でなくてはならない.これを回避するにはどうすればよいか?logの引数をBigFloatにしてみたが,効果なし.logの値をBigFloatで受けるようにしてみたが,同じ.BigFloatの精度は256もあるのに,計算値は80桁くらいしかない.⇒やった!primeExponentの冒頭でsetprecision(BigFloat, 512)を実行したら,log=
7.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006
という値が取り出せた.これでrも1.0に落ち着いた.とりあえず,これでよいということにしておこう.⇒この計算誤差は他の数値でも出ている可能性がある.チェックしておこう.⇒数値には変化はなかった.
階乗の末尾連続ゼロ数は基数のbによって決まる.bの素因数分解に含まれる素数をpとするとき,N=n!に含まれる最小のp^eの個数が連続ゼロ数となるので,最小のp^eの個数を決定する必要がある.一般にはpが大きいほどこの値は小さくなるが,pが小さくてもeが大きければ逆転する可能性がある.
まず,一般的にnとbを指定したときの連続ゼロ数を与える関数を作ってみよう.このためには,nを素因数分解するところから始めなくてはならない.julia には factor という関数がある.以下のダンプは b=2^2・3 を表している.
b=12 f =Primes.Factorization(2 => 2, 3 => 1)
Factorization というのは連想配列で,とりあえず,
for (p, e) in f
@printf(“%d %d \n”, p, e)
end
の形で取り出すことができる.
Julia がさっぱり動いてくれない.わたしのボケが進んでいるためかと思ったが,Julia の使いづらさ(不備)というのもあるような気がする.ブレークポイントが聞く既存プロジェクトに対象となるコードを埋め込んでみたが,ブレークしない.既存コードでも同じようなことが起こっているが,plot を呼び出さなければブレークできるところを見ると,どうも,デバッガが動くコードと動かないコードがあるように思われる.停止点がそのコードより前にあっても停止しないので,おそらく実行時に先読みしているのだろう.
確かにplotが動作するようになるまでかなり手間取った記憶はある.plot というのはウィンドウを開いてグラフなどを表示するための関数だが,何も出てこないということはまるきり動作していないということだろう.多分,どこかに plot が動くバージョンは残っているはずだが,どうやって動かしたのか忘れてしまった.現在仕掛りのコードでは,おそらくPrimes というパッケージがそれに該当するのだろう.いや,Primes はコメントアウトしてある.
ファイルは新規生成しただけでは実行されない.外部から持ち込んだだけの場合も同様.「保存」が必須のようだ.
ひさびさにJuliaを起こしてみたが,使い方をすっかり忘れてしまった!functionの書き方どころか,コメントの付け方さえ忘れている.二重階乗というプロジェクトがあったので,コピーしてここから始めることにしたのだが… 環境も変わってしまっているような感じだ.using Primes が通らないので,再インストールしている.Julia は間に GitHub が入っているのでいまいち何がどうなっているのかよく分からない.というか,その前に Juliaの拡張が入っていない.というか,2,3日前に Windows 11 をインストールしているのだが,それが裏目に出なければよいのだが… エクスプローラの詳細表示で行間が広くなっている.こういう変化はうれしくない.
GeoGebraのIF文がどうやっても通らない.こんなつまらないところで躓くとは… 何かシンプルなサンプルはないだろうか?
▲q1とp1の交点T2(C_1)は辺CA上に乗っていない.わずかながらずれている.作図ミスと思われる.q1とp1はいずれも円だ.q1(l2, V), p1(T1, V).Vは円周上の点でV(c1, j)だが,これが間違っているのではないか?jは(L, C)という直線でLは直線i上の点だ.i(A, B)でこれは間違いようがない.どうもLは点Aを選択したつもりで新たな点として追加されたものと思われる.⇒これで正しく動作するようになった.Point(…)を総点検する必要がある.Lは削除しておこう.