<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>数学</title><link>http://blogs.wankuma.com/izmktr/category/1786.aspx</link><description>数学</description><managingEditor>出水 洸太郎</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>出水 洸太郎</dc:creator><title>[数学&amp;hellip;算数？]算数オリンピック</title><link>http://blogs.wankuma.com/izmktr/archive/2011/01/26/196683.aspx</link><pubDate>Wed, 26 Jan 2011 23:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2011/01/26/196683.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/196683.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2011/01/26/196683.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/196683.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/196683.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://b.hatena.ne.jp/articles/201101/2261"&gt;はてな若手エンジニアが「算数オリンピック」の問題を解いてみた - はてなブックマークニュース&lt;/a&gt;&lt;/p&gt; &lt;p&gt;これの問題７に挑戦！&lt;br&gt;小学生でも2%の人が解いた問題ですね。&lt;br&gt;むむ、小学生に負けるわけには行きませんな！&lt;/p&gt; &lt;p&gt;さて、紙と鉛筆を用意・・・しないでVisualStudioを起動…っと！&lt;/p&gt; &lt;p&gt;変な見え張って解けないほうがよっぽど恥ずかしい！&lt;br&gt;聞くは一時の恥聞かぬは一生の恥！！&lt;br&gt;私は文明の利器で戦う！！&lt;/p&gt; &lt;p&gt;ということで、できました。&lt;br&gt;「25bitだな！」と言っているとおり、ビット操作を使うことにします。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2de0762a-acb3-4758-82e4-dcf7c2ac897c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;#include &amp;lt;iostream&amp;gt;

int numofbits5(unsigned int bits) {
  bits = (bits &amp;amp; 0x55555555) + (bits &amp;gt;&amp;gt; 1 &amp;amp; 0x55555555);
  bits = (bits &amp;amp; 0x33333333) + (bits &amp;gt;&amp;gt; 2 &amp;amp; 0x33333333);
  bits = (bits &amp;amp; 0x0f0f0f0f) + (bits &amp;gt;&amp;gt; 4 &amp;amp; 0x0f0f0f0f);
  bits = (bits &amp;amp; 0x00ff00ff) + (bits &amp;gt;&amp;gt; 8 &amp;amp; 0x00ff00ff);
  return (bits &amp;amp; 0x0000ffff) + (bits &amp;gt;&amp;gt;16 &amp;amp; 0x0000ffff);
}

bool Check(unsigned int board){
  if (numofbits5(board) != 6) return false;

  for(int i = 0; i &amp;lt; 5; i++){
    // 0x1b     = 11111
    // 0x108421 = 1 0000 1000 0100 0010 0001
    if ((board &amp;amp; (0x1f &amp;lt;&amp;lt; i * 5)) == 0) return false;
    if ((board &amp;amp; (0x108421 &amp;lt;&amp;lt; i)) == 0) return false;
  }

  return true;
}

int main(){
  int count = 0;
  for(unsigned int i = 0; i &amp;lt; (1 &amp;lt;&amp;lt; 25); i++){
    if (Check(i)) count++;
  }
  std::cout &amp;lt;&amp;lt; "count = " &amp;lt;&amp;lt; count &amp;lt;&amp;lt; std::endl;

  return 0;
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;まずはコマが６個なので、立っているビットを数えます。&lt;br&gt;ぐぐる様に聞いたら、&lt;a href="http://www.nminoru.jp/~nminoru/programming/bitcount.html"&gt;このサイト&lt;/a&gt;を教えてくれたのでコピペ…。&lt;br&gt;ええい、文明の利器で戦うと言ったではないか！！&lt;/p&gt;
&lt;p&gt;そのかわり、縦横のいずれかのマスにコマがある部分は考えました。&lt;br&gt;論理積（AND）を使えば、関係ないビットをすべてオフにできるので、&lt;br&gt;一列(or 一行)だけのビットを取り出します。&lt;br&gt;もし、取り出した結果が0ならば、その列(or 行)にはコマがないことになります。&lt;/p&gt;
&lt;p&gt;あとはこれを2^25回forでぶん回すだけ！&lt;br&gt;Releaseなら1秒以内で答えが出たよ！！&lt;/p&gt;
&lt;p&gt;小学生でも解ける問題なだけに楽勝でしたね！&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/196683.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学]小さいことから大きいとこまで その７</title><link>http://blogs.wankuma.com/izmktr/archive/2010/02/26/186490.aspx</link><pubDate>Fri, 26 Feb 2010 08:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2010/02/26/186490.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/186490.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2010/02/26/186490.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/186490.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/186490.aspx</trackback:ping><description>&lt;p&gt;たまに良くある計算で、１＝２を証明する、と言うものがあります。&lt;br&gt;こういう式の考え方からいきましょうか。&lt;/p&gt; &lt;p&gt;１と２が等しいわけがないのです。&lt;br&gt;つまりどこかに計算式におかしい部分があります。&lt;/p&gt; &lt;p&gt;もし計算式にどこもおかしいところがなかったらどうでしょう。&lt;br&gt;なら、前提が間違っています。&lt;/p&gt; &lt;p&gt;これを「背理法」って言います。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;と言うことで、前回の計算を厳密にやっていきましょう。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session13.png"&gt; &lt;/p&gt; &lt;p&gt;ここまでは問題がありません。&lt;br&gt;前回、ここから先に０×０を計算したところから何かがおかしくなってます。&lt;/p&gt; &lt;p&gt;ここで、計算順序に関する２つの法則を見ていきましょう。&lt;br&gt;交換法則と結合法則です。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session15.png"&gt; &lt;/p&gt; &lt;p&gt;前後を入れ替えても特に問題はありません。&lt;br&gt;交換法則は成り立つようです。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session14.png"&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;次は結合法則。&lt;br&gt;前回のおかしい点はここですね。&lt;/p&gt; &lt;p&gt;このｈという数を導入すると結合法則が使えない、つまり計算の順序を入れ替えることができません。&lt;br&gt;結合法則が成り立たないと、交換法則が成り立っても何の意味もありません。&lt;/p&gt; &lt;p&gt;この結合法則が使えないとどうなるか…。&lt;br&gt;良く見る方程式を見てみましょう。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session16.png"&gt; &lt;/p&gt; &lt;p&gt;これは良くやる計算ですが、これはさりげなく結合法則を使って計算順序を変えています。&lt;br&gt;0除算を範疇に含めて結合法則を捨てると、一気に世界が狭くなってしまいます。&lt;br&gt;結局、面白い法則も見つかりそうにないし、0除算の世界まで拡張しない方が良さそうです。&lt;/p&gt; &lt;p&gt;ということで、数を数えるところから始まり、ここまで拡張されていきました、と言う話でした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/186490.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学]小さいことから大きいとこまで その６</title><link>http://blogs.wankuma.com/izmktr/archive/2010/02/25/186441.aspx</link><pubDate>Thu, 25 Feb 2010 04:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2010/02/25/186441.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/186441.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2010/02/25/186441.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/186441.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/186441.aspx</trackback:ping><description>&lt;p&gt;複素数でどんな結果も表せるようになった、と以前書きましたが、&lt;br&gt;実は表せない数だってあります。&lt;br&gt;それが、0除算と0の0乗です。&lt;/p&gt; &lt;p&gt;では、0除算の中でも0÷0と、0の0乗を見てみましょう。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session10.png"&gt; &lt;/p&gt; &lt;p&gt;これらは２つの法則が真っ向から対立しています。&lt;br&gt;どちらも言っていることは正しいだけに、どちらを採用するかも困ります。&lt;/p&gt; &lt;p&gt;と言うことで、どういう道を選んだか。&lt;br&gt;「時と場合による」&lt;/p&gt; &lt;p&gt;0÷0と、0の0乗というのは、いきなり出てきたりしません。&lt;br&gt;その計算が出てくる背景を考え、そこで適切な答えを出そう、って事です。&lt;/p&gt; &lt;p&gt;例えば、a÷aという式がもともとあり、そこにa=0を入れてしまったのなら、&lt;br&gt;その時に出てきた0÷0は1じゃね？というわけです。&lt;/p&gt; &lt;p&gt;逆に言えば、その計算の背景がわからないのなら、答えは出せません。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;さて、1÷0はどうでしょう？&lt;br&gt;無限大、と答えたくなるこの計算結果、とりあえずｈと置いてみましょう。&lt;br&gt;すると、こんな式ができます。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session11.png"&gt;&lt;/p&gt; &lt;p&gt;0には何をかけても0、という法則を打ち破る数字が出てきました。&lt;br&gt;今までなかった新しい数字のようです。&lt;/p&gt; &lt;p&gt;これを使って、ちょっと計算してみましょう。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session12.png"&gt; &lt;/p&gt; &lt;p&gt;１＝ｈです。いきなりｈの正体がわかりました！&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;…そんなわけありませんね。&lt;/p&gt; &lt;p&gt;次回で最終回、この謎に挑みましょう。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/186441.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学]小さいことから大きいとこまで その５</title><link>http://blogs.wankuma.com/izmktr/archive/2010/02/23/186372.aspx</link><pubDate>Tue, 23 Feb 2010 23:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2010/02/23/186372.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/186372.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2010/02/23/186372.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/186372.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/186372.aspx</trackback:ping><description>&lt;p&gt;虚数は一つなのか…。&lt;/p&gt; &lt;p&gt;そもそも、虚数というのは目で見えない数です。&lt;br&gt;同じ数を2回掛けたら－１になる数が、今使われている&lt;em&gt;i&lt;/em&gt; の他にあるんじゃないか？&lt;/p&gt; &lt;p&gt;とりあえず、それを&lt;em&gt;j&lt;/em&gt; とします。&lt;br&gt;そして、&lt;em&gt;i&lt;/em&gt; と&lt;em&gt;j&lt;/em&gt; を掛けたときを計算します。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session06.png"&gt; &lt;/p&gt; &lt;p&gt;途中ぶっ飛ばしてますが、&lt;em&gt;i&lt;/em&gt; と&lt;em&gt;j&lt;/em&gt; を掛けた結果も－１という事がわかります。&lt;br&gt;これでは、&lt;em&gt;i&lt;/em&gt; と&lt;em&gt;j&lt;/em&gt; を２つ作って分けた意味がないですね。&lt;/p&gt; &lt;p&gt;ところが、もうひとつ、k という新しい虚数を加え、虚数は３つあった！という事にするとうまくいきます。&lt;br&gt;これを１つの実数と３つの虚数、全部で４つあることから四元数（クォータニオン）といいます。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session07.png"&gt; &lt;/p&gt; &lt;p&gt;先ほどの問題、&lt;em&gt;i&lt;/em&gt; と&lt;em&gt;j&lt;/em&gt; を掛けるともうひとつの文字、&lt;em&gt;k&lt;/em&gt; になる、という風に法則を作ります。&lt;br&gt;しかし、これにはからくりがあって、こんな式も存在します。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session08.png"&gt; &lt;/p&gt; &lt;p&gt;そう、計算式の前後を入れ替えると結果が変わります。&lt;br&gt;四元数は交換法則が成り立たないという条件でようやく成立する世界で、&lt;br&gt;もし、交換法則を成り立つように作ると虚数が１つしか存在できません。&lt;/p&gt; &lt;p&gt;四元数のさらに上には八元数、十六元数というものがありますが、&lt;br&gt;そのたびに今まで使えていた法則が使えなくなってきます。&lt;/p&gt; &lt;p&gt;例えば、八元数は結合法則が成り立ちません。&lt;br&gt;結合法則が成り立たない、と言うことは計算の順序をかえてはいけない、と言うことです。&lt;/p&gt; &lt;p&gt;四元数は3D空間における回転、姿勢制御などに使われているのですが、&lt;br&gt;八元数以上となると理論はあるものの、使い道がないそうです。&lt;/p&gt; &lt;p&gt;次回は、複素数でも埋められなかった穴の話です。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/186372.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学]小さいとこから大きいとこまで その３</title><link>http://blogs.wankuma.com/izmktr/archive/2010/02/21/186288.aspx</link><pubDate>Sun, 21 Feb 2010 01:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2010/02/21/186288.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/186288.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2010/02/21/186288.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/186288.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/186288.aspx</trackback:ping><description>&lt;p&gt;自然数と足し算だけの世界から、こんな計算を行う必要がありました。&lt;/p&gt; &lt;p&gt;□＋３＝５　□に入る数はなに？&lt;/p&gt; &lt;p&gt;ここで、足し算の逆をする計算が出てきます。&lt;br&gt;引き算ですね。&lt;/p&gt; &lt;p&gt;「繰り返す」の次は「逆を行う」という方法で計算方法が増えていきます。&lt;br&gt;足し算からは引き算、掛け算からは割り算、累乗（ダガー表記）からは根です。&lt;/p&gt; &lt;p&gt;最後の根は平方根、立方根という名前の方が有名でしょう。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;しかし、自然数しかない世界から新しい数を作らなければならなくなります。&lt;br&gt;たとえば、引き算ができたことで、「３－５」の結果はどうなるのかわからなくなりました。&lt;/p&gt; &lt;p&gt;ここで、マイナスの数という物導入し、「３－５」には－２を割り当てることにしました。&lt;/p&gt; &lt;p&gt;「足し算の逆を作ったら、負の数という新しい数が出来た」&lt;br&gt;これは、掛け算の逆にも言えます。&lt;/p&gt; &lt;p&gt;５÷２は２．５、または&lt;img src="http://izmktr.wankuma.com/201002/session01.png"&gt; です。&lt;br&gt;これは整数の範疇にない数であり、またもや新しい数ができる、という訳です。&lt;/p&gt; &lt;p&gt;最後は累乗、ここでは二乗すると２になるという無理数や、&lt;br&gt;二乗すると－１になる虚数が登場しました。&lt;/p&gt; &lt;p&gt;虚数とそれまで発見された数（実数）をあわせて複素数と言うのですが、&lt;br&gt;複素数は数の拡張を終わらせてしまいました。&lt;/p&gt; &lt;p&gt;終わらせた、というのはこれ以上数を拡張する必要がなくなった、という意味です。&lt;/p&gt; &lt;p&gt;例えば…「二乗すると虚数になる数」や「虚数の虚数乗」という&lt;br&gt;一見そんなのあるの？と思ってしまう数ですら複素数の範疇で計算できてしまうわけです。&lt;br&gt;式で表すとこんな感じです。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/201002/session02.png"&gt; &lt;/p&gt; &lt;p&gt;なぜこんな値になるのか、ってのは教科書数冊分になるので飛ばします。&lt;br&gt;ただし、「複素数さえあればこれ以上数の拡張をしなくて済む事になった」ってことです。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;逆に、「これ以上数を増やさずに済んだ」事と、&lt;br&gt;先程上げたような不思議な式ですら計算出来た、と言うことが虚数を受け入れられた理由の一つです。&lt;/p&gt; &lt;p&gt;次回は、もう一つの複素数のお話。&lt;br&gt;今回ついてこれなかった人も原点から別の角度で解説します。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/186288.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学]小さいとこから大きいとこまで その１</title><link>http://blogs.wankuma.com/izmktr/archive/2010/02/11/185981.aspx</link><pubDate>Thu, 11 Feb 2010 09:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2010/02/11/185981.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/185981.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2010/02/11/185981.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/185981.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/185981.aspx</trackback:ping><description>&lt;p&gt;お蔵入りらしいので、ブログ用にリライトしました。&lt;/p&gt; &lt;p&gt;数式の成り立ちのお話です。&lt;/p&gt; &lt;p&gt;もともと、数と言うのは物の個数を数えるところからやってきています。&lt;br&gt;リンゴが1個だの、バナナが5本だのそんな感じですね。&lt;/p&gt; &lt;p&gt;この時には自然数しかありません。&lt;br&gt;もともとないものは数えなくてもいいので、0という数字だってありません。&lt;/p&gt; &lt;p&gt;さて、こんな世界でも計算が必要になります。&lt;br&gt;3個のリンゴと5個のリンゴを合わせると何個になるか、実際にリンゴを並べて数えるのは大変です。&lt;br&gt;そこから、足し算が生まれました。&lt;/p&gt; &lt;p&gt;足し算には「＋」という記号を使います。&lt;br&gt;この「＋」は演算子と呼ばれ、足し算の場合は２つの数を伴うことから二項演算子と言います。&lt;br&gt;２つの数を１つの数に変換するルールを定めた物です。&lt;br&gt;＋の場合は、右と左の数を足します。&lt;/p&gt; &lt;p&gt;３＋３＋３＋３＋３ のように、同じ数を何度か足すと便利だと言うことで&lt;br&gt;掛け算の概念が生まれました。&lt;br&gt;掛け算に使う「×」も二項演算子です。&lt;/p&gt; &lt;p&gt;掛け算の時に、繰り返しという作業を行いました。&lt;br&gt;この繰り返しを行うと、新たな演算子を生み出すことを覚えます。&lt;/p&gt; &lt;p&gt;早速、掛け算と繰り返しを使って、新しい演算子を作ります。&lt;br&gt;３×３×３×３×３と、掛け算を繰り返してみました。&lt;br&gt;３を５回かける、３の５乗といい、累乗が生まれました。&lt;/p&gt; &lt;p&gt;累乗を表記するときは右上に小さく書くことで表すので、演算子がないようにみえます。&lt;br&gt;しかし、コンピュータで表記するときは３＾５という表記をすることがあり、この「＾」が演算子になります。&lt;/p&gt; &lt;p&gt;実はこの「＾」の記号は、「↑」の代わりに使っているもので、&lt;br&gt;この矢印のことを「タワー表記(または、クヌースの矢印表記)」と言います。&lt;/p&gt; &lt;p&gt;半角の文字コードには、「↑」がないので代わりに「＾」を使っているわけですね。&lt;/p&gt; &lt;p&gt;この「↑」（「＾」）も二項演算子です。&lt;/p&gt; &lt;p&gt;さて、このタワー表記になって足し算、掛け算には考える必要がなかった事を考える必要ができました。&lt;br&gt;それは、次回の話。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/185981.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学][C]直線交差点</title><link>http://blogs.wankuma.com/izmktr/archive/2009/10/14/182117.aspx</link><pubDate>Wed, 14 Oct 2009 20:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2009/10/14/182117.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/182117.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2009/10/14/182117.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/182117.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/182117.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/izmktr/archive/2009/10/09/181994.aspx"&gt;[数学]捻じれて縺れてこんがらかる&lt;/a&gt;の続き、計算編です。&lt;/p&gt; &lt;p&gt;まず、お互いの直線をベクトルと見なし、その外積を求めます。 &lt;br&gt;この外積は何を意味するかというと、前回の平行な面における法線となっています。  &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/200910/nejire03.png"&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;この法線がわかれば、平行な面どうしの距離を計算する事が出ケイます。&lt;br&gt;それぞれの面から適当な点を１つづつ取り、bの面からaの面へ向かうベクトルを作ります。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/200910/nejire04.png"&gt;&lt;/p&gt; &lt;p&gt;この時、cと法線ベクトルの内積を求めれば、お互いの面の距離がわかります。&lt;br&gt;内積は、あるベクトル成分をどれだけ持っているか、という計算にも使えるわけです。&lt;/p&gt; &lt;p&gt;この辺のからくりがわからなくても、cと法線ベクトルが直角ならば、&lt;br&gt;aの面とbの面がぴったりくっついている、というのがわかればいいです。&lt;/p&gt; &lt;p&gt;ということで、こんな感じのソースになります。&lt;/p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8d2ca18e-dff0-48e5-ac18-bc234c7ff46f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;int LineHitCheck(const Vec3 &amp;amp;a1, const Vec3 &amp;amp;a2, const  Vec3 &amp;amp;b1, const Vec3 &amp;amp;b2){
  Vec3 va = a1 - a2;
  Vec3 vb = b1 - b2;
  Vec3 nv = outer(va, vb);
  Vec3 vc = a1 - b1;

  if (nv.x == 0 &amp;amp;&amp;amp; nv.y == 0 &amp;amp;&amp;amp; nv.z == 0){
    // 平行or同一の場合
    Vec3 nv2 = outer(va, vc);
    if (nv2.x == 0 &amp;amp;&amp;amp; nv2.y == 0 &amp;amp;&amp;amp; nv2.z == 0){
      return 同一;
    }else{
      return 平行;
    }
  }else{
    // 交差orねじれの場合
    if (inner(vc, nv) == 0){
      return 交差;
    }else{
      return ねじれ;
    }
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;平行だったときの場合は飛ばしましたが、直線Aと直線Bが同一ということは、&lt;br&gt;直線B上にあるすべての点が直線A上にあるということです。&lt;br&gt;ですから、直線Aの一点と直線Bの一点を結ぶベクトルは、常に直線Aベクトルと0度or180度であり、&lt;br&gt;外積を求めると必ず零ベクトルになります。&lt;/p&gt;
&lt;p&gt;ねじれの直線の距離は、法線ベクトルを正規化してcベクトルとの内積を求めると出ます。&lt;br&gt;カプセルの当たり判定で求める事があるかもしれません。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/182117.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学][C]内積と外積を軽く分析</title><link>http://blogs.wankuma.com/izmktr/archive/2009/10/14/182088.aspx</link><pubDate>Wed, 14 Oct 2009 09:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2009/10/14/182088.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/182088.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2009/10/14/182088.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/182088.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/182088.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/izmktr/archive/2009/10/09/181994.aspx"&gt;[数学]捻じれて縺れてこんがらかる&lt;/a&gt; の続きです。&lt;/p&gt; &lt;p&gt;今回は軽くおさらいです。&lt;br&gt;ベクトルを使うに当たり、三次元空間の内積、外積を解説します。&lt;/p&gt; &lt;p&gt;・内積&lt;br&gt;別名、スカラー積ともよばれ、ベクトルaとベクトルbの内積は一次元の数値となります。&lt;br&gt;要は、ベクトルじゃないよ、ってことです。&lt;/p&gt; &lt;p&gt;なお、内積が0になるときは、掛け合わせたベクトルが直交するときです。&lt;br&gt;これは二次元における内積と同じです。&lt;/p&gt; &lt;p&gt;なお、計算式は以下のようになります。&lt;br&gt;ｘ、ｙ、ｚそれぞれを掛け合わせてたします。&lt;/p&gt; &lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f8053fa1-eb21-4eb9-aa71-88556bc75a86" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;struct Vec3{
  int x, y, z;
};

int inner(const Vec3 &amp;amp;a, const Vec3 &amp;amp;b){
  return a.x * b.x + a.y * b.y + a.z * b.z;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;・外積&lt;br&gt;別名、ベクトル積で、ベクトルaとベクトルbの内積はベクトルとなります。&lt;br&gt;この外積で出てくるベクトルはベクトルa、ベクトルbの両方に直交します。&lt;/p&gt;
&lt;p&gt;前を表すベクトルと、上を表すベクトルから右を表すベクトルを作り出せます。&lt;br&gt;ここで、前と上を表すベクトルは必ずしも直行しなくてよいことが重要です。&lt;/p&gt;
&lt;p&gt;なお、外積の結果が零ベクトルになることがありますが、&lt;br&gt;これは掛け合わせたベクトルが同一方向か逆方向を向いているときです。&lt;/p&gt;
&lt;p&gt;先ほどの例だと、前を表すベクトルが真上を向いてしまうと、&lt;br&gt;北極点における東方向という感じで、右方向というのが決まらなくなってしまいます。&lt;br&gt;こういう場合に零ベクトルとなるわけです。&lt;/p&gt;
&lt;p&gt;外積の計算式は以下の通りです。&lt;br&gt;x→y→z→x というローテーションを意識して、別々を掛けて引くというという形になります。&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:76cda1fd-16c6-4fe2-bc99-1ba01cff78f2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;Vec3 outer(const Vec3 &amp;amp;a, const Vec3 &amp;amp;b){
  Vec3 c;
  c.x = a.y * b.z - a.z * b.y;
  c.y = a.z * b.x - a.x * b.z;
  c.z = a.x * b.y - a.y * b.x;
  return c;
}&lt;/pre&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/182088.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学]捻じれて縺れてこんがらかる</title><link>http://blogs.wankuma.com/izmktr/archive/2009/10/09/181994.aspx</link><pubDate>Fri, 09 Oct 2009 16:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2009/10/09/181994.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/181994.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2009/10/09/181994.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/181994.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/181994.aspx</trackback:ping><description>&lt;p&gt;某会社の入社試験でこんな問題が出ました。&lt;br&gt;「線分A,Bが交差しているか調べる方法を書きなさい」&lt;/p&gt; &lt;p&gt;ははぁ、外積をつかってあーだこーだするんですな。&lt;br&gt;わんくま大阪勉強会で私がスピーカーをしたやつじゃないですか。&lt;br&gt;楽勝、楽勝…とはいかず、うだうだ書いてたら時間切れになってしまいました。&lt;/p&gt; &lt;p&gt;「ふふふ、簡単と思っているようだが…誰も二次元とは言ってない！！」&lt;br&gt;「な、なんだって！！三次元だと！！！」&lt;/p&gt; &lt;p&gt;ということで、線分は厳しいので、三次元空間で直線A,Bが交わるか調べる方法です。&lt;/p&gt; &lt;p&gt;その前に三次元空間における線の関係をおさらいしましょう。&lt;br&gt;線が2つあるとき、「同一」「平行」「交差」「ねじれ」のどれかになります。&lt;/p&gt; &lt;p&gt;「同一」は文字通りまったく同じ線です。&lt;br&gt;「平行」、「交差」は二次元でも出てくる関係なので問題ないでしょう。&lt;br&gt;残った「ねじれ」、これはなんでしょう。&lt;br&gt;一言で言うと、「平行」でも「交差」でもない状態です。&lt;/p&gt; &lt;p&gt;立方体の各辺において、図示しました。&lt;br&gt;ねじれの関係の辺は平行でもないし、交差もしてないことに注目してください。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/200910/nejire01.PNG"&gt; &lt;/p&gt; &lt;p&gt;で、どうすればいいのか。&lt;/p&gt; &lt;p&gt;直線同士が最も近づく距離を測ってやって、その距離が0なら交差、&lt;br&gt;そうでないならねじれ、ということにしましょう。&lt;/p&gt; &lt;p&gt;直線Aを含む平面を平面α、直線Bを含む平面を平面βと名付けます。&lt;br&gt;そして、平面α、平面βは平行です。&lt;br&gt;こうして、平行な平面αと平面βの距離を測ってやります。&lt;/p&gt; &lt;p&gt;&lt;img src="http://izmktr.wankuma.com/200910/nejire02.png"&gt; &lt;/p&gt; &lt;p&gt;なお、この平面α、平面βの組は必ず１つしかありません。&lt;br&gt;存在しなかったり、複数あったりすることはありません。&lt;/p&gt; &lt;p&gt;ということで、方針は決定したので&lt;br&gt;次回は実際のプログラムを書きつつ解説します。&lt;/p&gt; &lt;p&gt;数学好きの人は、実際にどんなプログラムを書けばいいか想像してください。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/181994.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[数学]割り切った関係</title><link>http://blogs.wankuma.com/izmktr/archive/2009/07/22/178808.aspx</link><pubDate>Wed, 22 Jul 2009 12:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2009/07/22/178808.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/178808.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2009/07/22/178808.aspx#Feedback</comments><slash:comments>53</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/178808.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/178808.aspx</trackback:ping><description>&lt;p&gt;たまには頭の体操を。&lt;/p&gt; &lt;p&gt;ある数を特定の数で割り切れるか、を調べる方法の話です。&lt;/p&gt; &lt;p&gt;例えば、2で割り切れるか、は偶数かどうか見ればよいので下1桁が偶数かどうかみます。&lt;br&gt;同様に5で割り切れるかも、下1桁が0か5か見ればよいです。&lt;/p&gt; &lt;p&gt;他に有名なのは3で割り切れるかですね。&lt;br&gt;各桁の数字を足していって、その合計が3で割り切れれば元の数も3で割り切れます。&lt;br&gt;これも同様に各桁の合計が9で割り切れれば、元の数も9で割り切れます。&lt;/p&gt; &lt;p&gt;さて…これを踏まえて…。&lt;br&gt;ある数が37で割り切れるか調べる簡単な方法を考えてください。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/178808.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>