ぬるぽを見かけたら 全力でぶっ叩くのみ


by Denullpo Smasher Hammerson
カレンダー
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

革命的筆算 除算篇

某所で話が出てきたので、ちょいと考えてみた。
こういった現場の声は、改善のきっかけなのであります。
確かに、学校で教わる割り算の筆算は面倒で難しい。

というか割り算自体、四則演算のなかで最も面倒なのです。
コンピュータを使った計算でさえ、割り算は他の四則演算に比べて数倍の
負荷がかかる代物。(だから通常は逆数の乗算で代用する)
効率的演算で定評のあるインド式でも、除算についてはあまりパッとしない。

んでも、わかりやすさを追求するなら、もっとミクロに考えてみるといいんです。
割り算 a÷b がもつ意味は、
aから何回bを減算できるか
ということ。
例えば 20÷3=6…2 は、20から3を6回引けて2余る。
単純明快。これを筆算に応用していけばよい。

More
[PR]
by denullpo | 2009-03-29 20:43 | こっち関係
インド式の凄いところは、最適化の発想なんですな。
従来の常識を破りつつも、ちゃんと数学的に証明できる方法を見いだしたところね。
んでも、実際使ってみると別の面で今ひとつ面倒だったりする。
ならば、その発想を活かしつつ従来の手段に取り入れればいいのだ。

例えば、987×876という乗算を従来方式で計算すると

   987
  ×876
──────
  5922
 6909
7896
──────
864612

…とまあ、どうやっても暗算は無理そな。
何故この形で暗算ができないかというと、積和の手順が複雑だからなんです。
この計算を手順通りに分解すると、以下のようになる。

   987
  ×876
──────
    42
   48
  54
   49
  56
 63
  56
 64
72
──────
864612

こんな桁位置バラバラな手順で積和繰り返してたら暗算なんて無理。
もうね、計算途中でテンポラリ忘れるから。

More
[PR]
by denullpo | 2008-05-10 03:21 | こっち関係
[過去記事]
[壹] [弐] [参]

変数に相対的な計算を重ねていくと誤差が嵩むわけで、その対策として
リフレッシュ処理が要る。具体的にどーすりゃいーのかっつーと、誤差が嵩んで
きそーなところで精度を改善してやればいい。
前回で例示した2D回転ベクトル(c,s)を加法定理で回していく場合、誤差により
"回転ベクトル"としての要件を満たさなくなる可能性がある。
この要件ってのは、cとsの関係が成す法則。任意の回転角に対して cos と sin を
求めたとき、両者にはどんな関係が成り立っているのか?

c2+s2=12

が正解。
(1じゃなくて12なのは、2乗された値であることを強調しているん)

で、誤差が嵩むとこの式が成り立たなくなるんですよ。
回転させているうち、渦巻き状に狭まっていくかもしれないし、逆に広がるかも
しれない。この問題を防ぐには、前述の式が成り立つように修正してやればよい。
特に、単位ベクトル,単位マトリクスを回転したものに対してこの手のリフレッシュを
行うことはノーマライズといって、ベクトルやマトリクスを扱うときの基本技だったり。

More
[PR]
by denullpo | 2008-04-19 21:27 | こっち関係
[過去記事]
2D,3Dプログラミング向け我流数学 其之壹
2D,3Dプログラミング向け我流数学 其之弐

今回は、実践的なところで。

[お題]
平面上の任意点を原点周りでひたすら回転し続けるプログラムを考えるべし

普通に考えるなら、回転角を変数として変化させつつ、その都度回転公式を通して
いけばよい。以下の例では、ループの度に回転後の値が x2 と y2 に格納される。

x=INPUT_X;
y=INPUT_Y;
r=0.0; // 回転角
while(1){
    // 回転角のcos,sinを求める
    c=cos(r);
    s=sin(r);

    // 回転後の位置を求める
    x2=c*x-s*y;
    y2=s*x+c*y;

    // 回転角をずらす
    r+=0.1;
    }


…とまあ、こんな感じになるのだが、この例は処理効率の点でボツ。

More
[PR]
by denullpo | 2008-04-16 23:33 | こっち関係
[過去記事]
2D,3Dプログラミング向け我流数学 其之壹

ベクトルとマトリクスの乗算はベクトルをどちら側に置くかでマトリクスの意味合いが
変わってくるが、プログラミングにおいてはそれだけではなく、さらに重要な違いが
顕れる。それはハードウェアの性質に起因する要素であり、どう扱うかで計算効率が
大きく変わる。3DCGみたいに大量のベクトル演算を要する場合、これらを考慮して
設計しなければならない。

法則1: データをメモリ上に置くときは、何次元のデータだろうと必ず1次元に展開される
例えば、2次元であるマトリクスをメモリ上に置くときは通常、行単位でまとめられ、
それを1次元に並べ直した状態となる。
a0101404_0415245.gif

はメモリ上に
xx xy xz xw yx yy yz yw zx zy zz zw wx wy wz ww
と配置される。

一方、ベクトルはどっちでも内部構造的には変わらない。数学的には表記が変わって
くるものだが、1次元に展開しちゃえば(X,Y,Z,W)が X Y Z W の順に連続して置かれる
のは一緒。

More
[PR]
by denullpo | 2008-04-08 00:58 | こっち関係
2D,3D問わず、画像を動的に処理するためには座標等の計算、即ちベクトルや
マトリクスを使いこなすことが肝要。
このうち、ベクトルについては特に説明なくてもどんなものかすぐ理解できると思う。
単なるスカラ値の集合だかんね。座標とか向きとか、位置関係を表す何か。
或いは、色のRGB値とか。単純明快。

では、マトリクスとは何か。
ベクトル値の集合であることと、計算方法ぐらいは高校数学で教わるものだが、
実際に何を意味しているのかまで理解している御仁は意外と少なげ。

その答えは、ベクトルとマトリクスの乗算にある。
ベクトルにマトリクスをかけると、計算結果はベクトルで表れる。
例えば、位置ベクトルに回転マトリクスを乗算して、回転後の位置を得る。
つまり、ここでの両ベクトルは入力と出力の関係であり、マトリクスはベクトルを
処理する何かという位置付けになる。
で、大事なのはここから。

More
[PR]
by denullpo | 2008-04-06 01:28 | こっち関係