数学

ベルヌーイ数をテンプレートメタプログラミングで頑張ってみた。

ベルヌーイ数の説明は大変なので省きます。wikipediaとかに詳しく書いてあるのでそちらを参照してください。とりあえず、計算する際には以下の漸化式が便利だそうです。 ここで縦の括弧はコンビネーションです。 今回はこれをそのまま使おうと思います。まず…

多角形の重心

2次元平面状の多角形の頂点座標 r_t = (x_t,y_t) がある。この内部の重心はどうすれば求まるか?仕事で必要になった。 最初は適当な画像を用意してそこに多角形を描いて中を塗ってそのピクセルと位置を掛け算して足し合わせて最後にピクセル数で割れば一応出…

行列の平方根

今日はじめて知ったorzまず、(エルミート)行列は以下のように変形出来る。 λは固有値、ブラケットはその固有ベクトルである。証明は難しくて出来なかったが試しに固有ベクトルを作用させてみれば同じ結果になることは簡単に確認できるだろう。 で、ここでλを…

確率に応じてboolを返す。その2

探したら普通にありましたorz std::bernoulli_distributionというクラスです。使い方は以下の通り。確率0.2でtrueを返します。 std::mt19937 random; std::bernoulli_distribution bd( 0.2 ); for( int i = 0; i < 100000; ++i ){ if( bd( random ) ){ count…

確率に応じてboolを返す

引数として確率を渡したらその確率でtrueが返るような関数です。モンテカルロ計算したい場合とか必要になる機能です。 まあ理論も実装も特に難しくなく、0〜1の半開区間な分布をデデキント切断すればいいだけです(謎) template< class PRECISION > class Pr…

数独をプログラムで解いてみる。

とりあえず、一番単純な方法で、各マスに関して1〜9のうち一つだけしか入れない数値を入れていく方法。 template< int SIZE_ = 3 > class Sudoku2DSolver { public: enum{ SIZE = SIZE_, SIZE_2 = SIZE * SIZE, }; Sudoku2DSolver(); virtual ~Sudoku2DSol…

行列式をテンプレートメタプログラミングで頑張る

「行列式って何?」という人は線形代数の教科書でも読んでください(ぉ まあ最近は教科書を買わなくても教科書レベルは大抵webにあるので調べれば簡単に出てきます。行列式を解く場合は大抵はLU分解して対角要素を掛け算して出すと思います。しかし今回は以…

球のフーリエ変換

半径R以内が1でそれ以外が0という関数dのフーリエ変換を解析計算してみた。 まずは極座標変換。ただし普通の極座標でなく、kからの角度をθとした極座標。φは適当でよい(球対称なのでなんでもよい) ここで、-cosθ=tと置換する。sinθdθ=dtとなる。また、φ…

パズルをコンピュータにやらせてみた。

先日、実家に帰ったときにパズルを渡された。64個の立方体がヘビのように連なっており、それぞれの立方体の面同士が合わさるように繋がっていてその部分は回すことが出来る。で、その部分を回して組み立てることにより4^3の立方体に組み上げるというパズ…

3次元ヒルベルト曲線

前回の記事からちょくちょく頑張っていて一応「長さ→座標」部分は出来ました。同じ対応で「座標→長さ」も出来るかと思いきやどうもダメっぽいのでとりあえず諦めました(ぉ class HilbertCurve3 { public: HilbertCurve3( int order ):m_order(order){} virt…

2次元ヒルベルト曲線

なんとなく作ってみました。と言っても、wikipediaの英語版のサンプルをほぼコピペです。なので詳細はそちらを見てください(ぉ class HilbertCurve2 { public: HilbertCurve2( int order ):m_order(order){} virtual ~HilbertCurve2(){} int GetAllCount()co…

積分計算

なんとなく必要になりそうなのでなんとなく移植しました。 http://d.hatena.ne.jp/n-trino/20091124#p1 元がhaskellなので関数型言語っぽい実装になりました。 //台形 struct Trapezoid{ template< class FUNCTION > double operator()( const FUNCTION& fun…

式を展開せよ

中学1年生あたりで習うと思うのだが、いわゆる分配法則とか頑張って多項式に落とす作業です。 等々。 やり方は完全に決まっているので覚えてしまえば誰でも出来るのですが式が大きくなってくると割と大変です。なのでそういう作業はコンピュータにやっても…

分配法則で掛け算を先に行う。

分配法則とは、以下のような法則である。 a * ( b + c ) = a * b + a * c ( b + c ) * d = b * d + c * d まあ中学校あたりでやることなのでいちいち説明も必要はないと思うけど。 で、実際に計算する場合は左辺が足し算1回掛け算1回に対し、右辺が足し算1回…

直線と点の距離

いきなりですが問題。 空間上に3点ABCがある。点Cから直線ABにおろす垂線の長さLを求めよ。 この問題、3次元以下なら外積を使えば簡単に出せる。ベクトルABとACがつくる平行四辺形の面積を考えると、ひとつは外積の絶対値、もう一つは底辺×高さで求…

n進数表現をm進数表現に読み替える関数の積分

昨日の続き。 大変だと思ったけどよくよく考えたら簡単だった。式自体は10進数特有の部分は殆ど使ってないので最後の部分だけちょっと修正すればいいだけでした(^^;最後の部分を持ってくると となってます。ここで0.11111・・・というのが10進数では1/9…

2進数表現を10進数表現に読み替える関数の積分

大学のときに友人から出された挑戦状(?)である。当時、区分求積で上下に挟んで解いた覚えがある。そもそも収束するかどうか怪しい関数だったのでわりと厳密に扱ったので苦労した気がする。最近ふとしたことで思い出したのでまた解いてみようと思う。同じやり…

3の倍数で偉くなる

10進数で表した自然数の各桁を足し合わせた結果3の倍数になる場合、元の整数も3の倍数になる。わりと有名な話だが証明ってどうやるんだろう・・・と、とある電車の中で友人と話していた。遥か昔にやった気がするのだが数論とかそんな凄いことはやっていな…

とても強い型付け

プログラム言語を型で分類すると「強い型付け」と「弱い型付け」があるらしい。型というのは、intとかdoubleとかstringとか。強い型付けの言語だとこれらの型が厳しく、弱い型の場合はわりと適当でもコンパイラが解釈してくれる。まあ詳しくはネット上にいっ…

固定小数点の平方根

別に平方根自体は固定小数点とは何の関係もないけど固定小数点を使うことにより必要性が出てきた。 平方根自体は標準関数のstd::sqrtを利用すればいいのだがこれは浮動小数点用なので固定小数点は使えない。まあ適度にキャストすれば使えなくもないのだが今…

行列のできるサイコロ屋さん

小学生の頃の趣味の一つにサイコロ作りがあった。ボール紙に展開図を描いて目と糊代部分を付け加え、切り取って組み立てる。工作や数学が好きだったので結構楽しかった。なんてマニアックな小学生だろう、全く。 ちなみにサイコロと言っても立方体とは限らな…

音量調節

DirectSoundを扱ったことがある人なら大抵困るんじゃないかと思われる音量調節。や、そんなの困ったのは私だけかもしれないけど(^^; http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/directx9_c/directx/htm/idirectsoundbuffer8setv…

増加曲線

勘違いされたら困るので念の為書いておくけど増加曲線というのは私の造語で数学用語ではないのでお間違いなく(^^; んで何が言いたいかというと、RPGツクールとかで出てくるパラメタ増加の度合いを曲線で表す奴。平均的なキャラは直線的で早熟なキャラは…

とある級数

ちょっととある事情により以下のような級数が出てきた。 ためしにプログラムでごり押し計算させてみたら答えは1/2になった。実はこの式が出てきた背景を考えると1/2になるのはわかっていたのだが実際に収束したら感動した(何)折角答えがわかっているのだか…

左右対称で周期的な関数の原点を見つける方法

ちょっと事情があって方法を考えていた。すぐ出来るんじゃないかと思ったけどなかなか思いつかなかった。や、厳密に左右対称が保障されていて計算時間も十分あるならいくらでも方法はあるけど元が実験データとかで誤差があり計算時間もあまりない時間の場合…

なんとなく積分計算

久々にやってみた。レベルは大学受験程度。 問題 ひょっとしたら定番の計算かもしれないけど久々にやったらちょいてこずった。方針は部分積分して漸化式に持ち込む。 というわけで一つ飛ばしの漸化式になります。というわけであとは初期値だけですね。 とい…

多次元極座標

極座標とは、動径の長さ(原点からの距離)とその方向(角度?)で表す座標系のことです。厳密な定義は知らんけど多分遠くは無いはず。普通の正規直交座標の次によく使われるんじゃないかと思われる座標系です。 とりあえず、2次元の場合 ですね。3次元の場合は…

AdaBoost

ぐーぐる様にでも聞けばいくらでもあるんじゃないかと思ったけど意外とないんですよね。あれば楽だったんですけど・・・。というわけで主に自分用メモとして(^^;まずそもそも何をやるものかというと、ある物体の特徴量から分類を行なう方法の一つ。例え…

ラグランジュの未定乗数法

拘束条件がある場合の極値を求める方法なんですが、これも探せばいくらでも詳しいサイトがあるんですがあえてトピックに取り上げます。何気に私が大学に入ってから初めて学んだ内容だったり(^^; 微妙に思い入れがあります。さて、早速ですが問題(ぉ とある…

ルンゲ=クッタ法

微分方程式を数値的に解くための方法です。実用的には4次のルンゲ=クッタ法を用いるのが普通らしいです。まあ、詳しく書いてあるサイトはたくさんありますがなんとなく取り上げてみました(^^;1階微分方程式 について解く場合、 という差分方程式になる。…