「卍関数」を書いてみる
こんにちは。寝起き(@teimon0)です。
これはョョョAdvent Calender 2020の16日目の記事です。
adventar.org
これが本来ョョョAdbentCalenderに書く予定だった記事です。AdCに空きがあったので、なにか書けることないかなーーと考えたんですが、新規性のあるネタを吐き出せないなあと思って諦めの舞を踊っていました。でも、なぜか突然「卍関数」を思い出したので、ここに吐き出すことにしました。本稿では私が1年半前くらいに考えたネタを再検討し、考察を加えていくことにします。
難しい話はあまりなくて、高校数学を前提にして(それも一部がっつり高校数学の焼き直し)書いたので、まあちゃららーーーと読んでください。
せぷねこニキ周辺の各位が関心を持つ分野やョョョAdCの想定分野(要するに技術系のさむしんぐ)とは大きく異なりますが、まあ適当に読んでいただけると嬉しいです。
ョョョねこ要素はかけらもないので、ョョョねこをお求めの方はご注意ください。
目標
卍関数とは?
卍関数といって、なんのことやねんと思った方がほとんどだと思います。別に学問的な呼び方というわけではなく、ただ「まじ卍~~~」が流行っている時期にふと思ってやっただけです。
ここで、卍関数とは、「それがとる点を座標平面上にプロットすると、全体の形が『卍』の形になる式」を指します。これを作成することが第一の目標です。
適切でない例 - 複数本の式
しかし、これはたとえば次のような式でもって簡単に実現できるでしょう。
これは要するに卍を縦3本横3本で合計6本の直線によって表現しています。
しかし、これは正直当然の結論です。複数本の線をばらばらに使ったら当然できるに決まっています。
適切でない例 - 関数と定義域
そこで、もっとスマートな形を考えてみましょう。
とに範囲を与えずを変化させて描画すると上図の通りです。=2(紫),3(青),5(水),8(緑),10(黄),100(桃),500(赤)の7つの場合を示しています。は当然として、cの値が小さい時は興味深い振る舞いをすることがわかりますが、それはともかくとして、の絶対値がともに1以下の領域についてみれば、が大きいほどより卍の字に近づいていくことを見て取ることができます。
恣意的な定義域
しかし、これらは正直つまらないと思うのです。というのも、定義域を課している時点でその式のいわば「おいしいところ」だけつまみ食いしているようなものです。定義域はたしかに式の一部ですが、式そのものというよりは式を拘束しているというべきで、そのように拘束をかける根拠ガ「たまたま卍になるから」というのは非常につまらないものです(しかし、上に示したグラフを見る限り、範囲内の格子点、すなわちの9点が明らかに特徴的なので、なにか面白い性質があるのかもしれません。)。
関数とは
また、卍関数が「関数」を名乗る以上、完全にそうではなくとも、可能な限り関数の要件を備えておきたいものです。
ここで、関数の定義を示します。つまり、定義域内の変数に対して、がただ一つの値を返すとき、をの関数である、とします。定義域内で必ずが値を返す必要があるので、定義不可能な点(発散してしまう点やゼロ除算となる点)があれば、そこは定義域から排除する必要があります。たとえば中学生でやる反比例の式はで定義できませんから、定義域から排除する要請が式からあらわれることになります。
関数の定義を踏まえた上で、先に示したを見てみましょう。これは関数といえるでしょうか(極限が入っているとまずいので、極限をとるまえの十分に大きいが有限の値であるをとっていると考えてみましょう。今回の場合であれば、グラフを見る限りくらいでは卍の表現に近づいていることがわかるので、たとえばグラフでは桃色の線で示したでいいでしょう)。
これは、関数とはいえません。なぜなら、たとえばを代入すればとという2つの値を返してしまいます。図に示すように、と2つの交点を持ってしまいます。
陰関数と陽関数
ところで、先述の式はすべて左辺に移行してしまえば、次のように書くことができます。(面倒なので定義域は省略します)
このように、の形で記述されるものを陰関数と呼びます。このほかにも、たとえば中心が原点で半径が$r]である円はと書けますから、これは陰関数です。また、たとえば比例の式はと書けますから、これも陰関数です。
一方、という式で記述されるものを陽関数と呼びます。先の比例の式はと書けますから、これは陽関数です。
比例の式はうまく陰関数から陽関数への変形ができました。また、逆に陽関数から陰関数へ変形することもうまくできることは明らかにわかります。しかし、円の式は陽関数の形にしようとするととなりますから、複数(今回の場合は2本)の陽関数へ変形されます。つまり、1本の陽関数は1本の陰関数に変形できますが、1本の陰関数が1本の陽関数に変形できるとは限りません。
関数の定義を思い出してください。を与えればがただ1つ定まるが関数でしたから、陽関数表示されている式は(やばい特性を持っていない限り)関数の定義を満たしますが、陰関数表示されている式はかならずしも関数の定義を満たしません。たとえば半径$r]で中心を原点に持つ円の式はに対してのように2つのの値を返してしまいますから、これは明らかに関数の定義を満たしません。
このように、陰関数の形で示す式は必ずしも関数の性質を満たさないのですから、卍関数を名乗る以上はできるだけ陽関数で書きたいというモチベーションが現れます。
まとめ
以上をまとめると、卍関数をこれから書くにあたって、
1.1本の式で書ける
2.陽関数で書くことができる
3.式の中の要請によって定義域が出現する
ことを要求することにします。
直角の表現
まず、卍をどう表現するか考えます。この文字の中にある直角変化を陽関数でどう表現すべきでしょうか。
delta関数
ここで、Diracのdelta関数という便利なものがありますので、紹介します。
このように、ではひょこっとになっていて、それ以外の領域では0になっている連続関数(ここですでに「関数」性を持っていないという批判はもっともですが、とりあえず便宜的に関数と呼びます)を考えます。(矩形パルスというべきですかね)
ここで、ぴょこっと飛び出している部分は縦1横1の正方形ととらえられますから、この関数の全域積分は当然
となります。
この正方形のうち、軸にくっついている辺の長さを考えましょう。小学校でいうところの「よこの長さ」です。ここの長さを今後と呼ぶことにします。
ここで、先の関数を思い出してください。あれは、「よこの長さ」が1の長方形(つまり正方形)の部分をグラフに持っていました。この「よこの長さ」lに対してそれぞれが決められそうです。
そこでを、では0をとるが、で瞬間的にまで増加しまでその値を維持し、で同様に0まで急激に減少し、以後[texx>l]で0を取り続ける連続関数、としましょう。
定義から、は0より大きいlに対して次のような性質を持っています。
面積1を保ちつつ、(と、向かい合う辺の長さ)を短くすればするほど「たての長さ」は長くなります。たとえばで作図すると、長方形の形は図のようになります。
長方形の面積は1に保たれていることに注意してください。
図中で破線で示した曲線はです。長方形の頂点のうち1つ(右肩側の点)がかならずこの曲線の上にあることがわかりますね(当然といえば当然なのですが)。
これはdelta関数を議論するうえでたいへん重要な性質を示します。つまり、が小さくなればなるほど、面積1の長方形の「たての長さ」はどんどん大きな値をとることになっていきます。そして、最終的には正の無限大に発散します。
このように極限までが0に近づいているときのをと定義しましょう。つまり、
と定義します。このこそがDiracのdelta関数です。(ここではdelta関数を定義しましたが、delta関数とはこういうようななりたちで理解できる関数である、といったほうが正確です。実際、delta関数の定義というのは
で記述されます。そのため、delta関数の導入までの議論がよくわからなかった、きれいではない、というのであれば別の関数を使っても構いません。たとえばを
と定義すれば、これは極限をとるまえから明らかに偶関数ですし、(いままでの適当な意味の、ではなく、定義をちゃんと満たした!)関数ですから、こちらの方が綺麗ではありますね。
参考までに、図5にこれでを変化させた場合の非ゼロ部分のグラフの形を示しておきます。)
どれだけが小さくても長方形の面積は1に保たれるのですから、のゼロ極限をとってしまっても面積は1に保たれています。つまり、全域積分の結果も1のままです。
このdelta関数、面白い性質、便利な性質がありますし、だからこそDiracもこれを発明したのですが、今回はただ卍を書くことが目標なので、詳しく触れることはしません。
ここで、はじめにせっかく導入したにもかかわらずごまかしてきた、このdelta関数が関数といえるのか、という問題がありますが、まあ端的に言ってしまえば関数ではありません。なぜならで値をとらず正の無限大に発散しているにもかかわらず、は定義域から排除されていません。そのため、このdelta関数は関数(function)ではなく超関数(distribution)という括りに入ります。関数の拡張概念みたいなものらしいですが、詳しく知りません。物理学徒的には使えればどうでもいいです。
ステップ関数
このdelta関数を積分した関数を考えてみます(Heavisideのステップ関数と呼ばれます)。つまり、
と定義します。
ステップ関数は
とふるまいます。これをグラフに起こすと、図のとおりです。
delta関数の性質から、ステップ関数もにおいてちゃんと連続しています。
これでまず、卍という形の中で特徴的な、直角にふるまう陽関数を手に入れることができました。
定義域の設定
次に必要なことは、定義域の獲得です。
先述した通り、定義域を「たまたま都合がいいので」という理由で決めるのは、別に物理的な要請とかがあるわけでもないので、不自然です(自然じゃないものを作ろうとしているのに不自然という理由を持ち出すのは整合性がないという批判は甘んじて受け止めます)。
そこで、使いたくない(つまり今回の場合は、卍の文字を表示するために必要ではない)エリアを排除することが、関数の定義から数学的に要請されるように、うまいこと係数をつけてやればよさそうです。
どういう係数をつけてやればよいか、ですが、使いたい領域(つまり、定義域内にしたい領域)では1を返して、定義域外のxを代入すると値が定義できない(つまり、無限大に発散してしまうなど)ようなものができれば嬉しいです。
では、定義域をどう決めましょう。これは簡単で、にしてしまいましょう。これは見てわかる通り、なんとなく都合がよさそうです。今後の領域を便宜的に領域と呼ぶことにします。
これから、なんとなく都合がよさそうな定義域、を、式から当然に要求される定義域、に変えることを試みます。
定義域外では値が定義できないと述べましたが、要するに、定義域外ではゼロ、定義域内では非ゼロの値が出るようなというものを考えつくことができれば、は定義域内では有限の値を返しますが、定義域外ではゼロ除算となり定義できなくなります。を探してみましょう。
床関数
高校数学で、「ガウス記号」というものを扱います。これは、実数aに対して、を、を超えない最大の整数として定義するものです(この四角カッコがガウス記号ですね)。このような関数を一般に「床関数」と呼び、
[x]
などと書き表します。
このグラフは図に示すようになります。
もっとゼロ付近だけ拡大してみましょう。
白い丸は、そこで値がとられていないことを示しています。たとえばのとき、は0ではなく1をとります。
基本構想
これをうまいこと使えないでしょうか。つまり、床関数はでゼロを返すのですから、領域外のxに対してだけとなるうまい関数というものを考えてやれれば、は領域内でゼロを返すことになります。
方針としては、領域内のに対して取りうるの値と、領域外のに対してとりうるの値が一切違えばよさそうです。言い換えれば、領域内のに対してとりうるの値の集合(何個あるかわからないので、とりあえず要素個としました。無限個ある可能性も否定できませんが、卍関数を書く上では問題ありません。)と、領域内のに対してとりうるの値の集合(こちらも何個あるかわからないので、とりあえず要素個としました。)が共通の要素を持たない、つまり、実数に対しておよそがとりうる値の集合がとの直和で表されるならば、次に示す関数は選択的に領域内で非ゼロの値を返し、領域外ではゼロのみをとります。
(補足:ここで出てきた記号はギリシャ文字のパイの大文字ですが、総積をあらわします。たとえば、関数に3から6を代入して得られるすべての数を全てかけたもの、はこの総積の記号を使うと
と書くことができます。)
しかし、ここでとしてを使うのはあまり都合がよくありません。なぜなら領域内のの1つであるに対してですが、これは領域外の一部の(たとえば)でも、は同じように1を返してしまいます。領域の内外ではとりうるの値が一切重複してほしくないので、これは問題です。
かつての私はこれをどう解決しようとしたかというと、の絶対値をとったうえでを考え、
これがで0になるように、の値が変化するポイントを少し(無限小)だけ右にずらす、ということをしました。つまり、
とおきました。しかしこれは、閉集合と開集合の違いを無視していて、ちゃんとでうまくふるまうか、領域の境界でもきっかりが違う値をとってくれるか、よくわかりません。(もっとも、ただ図形を描く、という意味ではこれでよいのかもしれません。)
ところで、の絶対値をとるというアイデアを使えば、のふるまいはとだけみればよくなります。いま、には使えないねえ、も使えないねえ、となったのは、この関数が領域の境界であるでの振る舞いが都合が悪いからでした。絶対値をとるというアイデアを使ったり、ずらしたり、ということを使うことで、床関数のおいしい部分を使うことができないでしょうか。
天井関数
床関数の0付近を見ると、は非常に使いやすそうです、これがにあればよかったのに、と思ってしまいます。
そこで、をにして(左右反転)、図10のような振る舞いをする関数を得ます。
さらに、にして(上下反転)、図11のような振る舞いをする関数を得ます。
この関数は床関数と似た振る舞いをしていますが、見比べるとわかる通り、白丸の場所や線分の場所がかわっています。この関数はに対して、を下回らない最小の整数を返していることがわかります。この関数のことを天井関数といい、
などと書き表します。
この天井関数について、のかわりにの絶対値を代入する()と、次のようなグラフが得られます。(白丸がそこで値をとらないという意味だったのに対して、塗りつぶされた丸はその点で値をとることを示します。)
グラフをみてわかる通り、これは領域についていままでの要請を満たしています。つまり、領域内のに対しては0か1を返し、領域外のについては1以外の自然数のどれかを返します。これはにうってつけでしょう。
よって、を
と設定すれば、これは領域内で非ゼロ、領域外では常にゼロをとることになります。
以上から、係数
をつけることで、領域内では1、領域外はゼロ除算で定義不能となるから定義域からの排除が要請されるようになりました。
若干の補足
なお、お気づきかもしれませんが、は図13
のようにふるまいますから、これも領域内でか、領域外で以下の整数のどれかをとることになり、に使うことができます。
複数の曲線の同時表現
妥協
最後に、卍関数を議論するうえで避けて通れない、1つのに対して少なくとも2個のが対応している状態にする、という問題を議論します。冒頭から申し上げると、1つのに対して少なくとも2個のが対応している状態というのは1.3.2で述べた通り関数の定義に大きく反することになります。そのため、今回は「卍を描く」ことにフォーカスし、若干妥協せざるを得ません。しかし、delta関数がそうであったように、せめて少なくとも、極限をとるまえの段階では関数としてふるまうように仕向けます。
基本構想
2つの曲線を同時に表現するには、どのような手段をとればよいでしょうか。
ここに対する発想として、定期的に2つの曲線を行き来するように仕向ければよい、というものを思いつきました。つまり、の関数とを考え、これらはいずれも定期的に0と1を交互に取り続けます。そして、のとき、またのときとなるようにしましょう。と(x)]の間につねに、とがなりたっていることを要求します。
図に示すと、図14のようにふるまうようにします。たとえば青線が、赤線が(x)]だったりするわけですね。
この1本の線の長さ(もも同じ長さの線分がずらーーーーーーっと並んでいるわけですが、そのぶちぶちの線分の1つ当たりの長さ、という意味)は式の中で適当にいじくることができて、たとえば非常に長くしたり、非常に短くすることができることにしましょう。以降この長さをと呼びます。
これが得られるとどういうことができるかというと、
このように互いに独立した関数(青が、赤が)に対して、をそれぞれかけた、を考えると、例えばグラフは次のようになります。ただし以後、端点の白丸などは省略することにします。
そして、を小さくすると
こうなって、、、
こうなります。
ところで、お気づきかもしれませんが、のカラフルな線が出現したこと以外には、これはもとの何も掛かっていないのグラフとほぼ変わりません。
そして、を図17のままにしたまま、これらの和、すなわちのグラフは次の通りです。
もとののグラフから全く逸脱していません。なぜなら、先述した条件「と(x)]の間につねに、と」によって、あるを定めれば必ずとはどちらかが0、どちらかが1をとりますから、の値はつねにかのどちらかしかとりません。そして、そのとのいずれかをとるの区間はそれぞれに等間隔かつ交互にやってきますから、が小さくなればなるほど、よりきれいに2曲線をいずれも表示することができます。
探索
では、このようなはどうやって見つければよいでしょうか。
まず条件から、である(反対もおなじ)ことがわかります。これはそれぞれどちらかを見つけることは、もう一方を見つけることに等しいということです。
次に、定期的に2つの値をとり続けるという点から、先述した天井関数・床関数の利用が有効そうであることが推測できます。また、関数全体がつねに同じ動きを定期的に繰り返していますから、三角関数の利用も有効でしょう。
以上の発想から、適当に手を動かすと、条件を満たす関数としてを見つけました。これでのゼロ極限をとれば、2本の関数をばっちり同時に描写できるという算段です。
よって、が得られました。
実際に描いてみる
卍を書くためには、卍を先のに相当するように2つに分けなければいけません。そこでこのように分けることにします。青を、赤をということにしましょう。
それぞれ、ステップ関数を使って次のように書くことができます。
全部まとめて、卍関数(ということにしましょう)の全体像は
と書けそうだということがわかりました。終わりが近いぞ!!!!
ここで、こまったことが出てきます。卍関数はステップ関数を使いますから、全体的に適当な点がたくさん見えていればそれっぽく見えた先のと違い、ある1点の変化が見えなければ困ります。具体的には、については、についてはでの変化が見えないと困ります。つまり、を要求します。
このため先述のの式を改造し、とします。ただし、です。床関数に入れてあるので、が無限大に行く過程でどんな値をとっても、は必ず整数になりますから、このは奇数分の1の形になっています。
これですべて完成です。わたしの作った卍関数は以下の通りです。
おわりに
途中から見出しつけるの面倒になって大項目しか書いていないので読みにくいところもあるかと思います、、、ごめんなさい、、、、
あと、はてなブログのLaTeXが中途半端なところがあって、不自然なところがあるかもしれません。申し訳ない、、、
TEXコードも含めて18000字を超える長文になってしまいましたが、ご容赦ください。
ここで書いた内容は修正・補足・追加検討などして、学科の友人らと一緒に本にしてコミックマーケット99で出したいと思っています。
コミックマーケット99に「物理系いもむし」で申し込みました。サークルカットはびど豆腐(@thn09) pic.twitter.com/JCCWQgUFJZ
— 寝起き (@teimon0) 2020年12月7日
当選したらTwitterでお知らせするのでぜひ!!!