「整数」を含む日記 RSS

はてなキーワード: 整数とは

2011-02-02

http://anond.hatelabo.jp/20110202211717

あー…。つまり、六角形がゆとりにとっての円だとしたいのね。そうすると、六角形が円として定義出来るような円の定義を与えればいいのだと思う。で、考えてみた。

ノルム||が定義された空間Sで、あるc∈Sに対してある正の実数rがあり、図形{x | |x-c|=r}を、「空間S中の半径rの円」と定義する。

で、R^2上の六角格子がうまく座標表示できているか全く自信がないんだが、複素平面上の点の集合で定義すると、{k/2*(cos nπ/3 + i sin nπ/3) | k,n∈N}∪{k√3/2*(cos (nπ/3 + π/6) + i sin (nπ/3 + π/6)) | k,n∈Z}になった。Zは整数の集合。

2010-11-20

補足

http://anond.hatelabo.jp/20101118060341

みなさん分かってると思いますが上のは嘘ですよ。

割り算の記号

これは豆知識の部類ですが、割り算の記号は国によってばらばらです。「÷」「/」「:」がほとんどだと思います

ピーターフランクルが「:」を使ってたので、東欧のほうではこれなんでしょう。

左から割る記号

左から割る記号に「\」を使うのは数学で一度だけ出会ったことがあります群論で剰余類で類別するところです。

参考: http://www.econ.hit-u.ac.jp/~yamada/algebra_pdf/2_2_subgroup.pdf 2ページ目の記号のところにありますね。

普通はこの意味で「\」を使うことはありません。差集合の意味で使うのが普通です。

参考: http://ja.wikipedia.org/wiki/%E5%B7%AE%E9%9B%86%E5%90%88

等分除と包含

整数どうしの割り算には大きく2種類の意味があります。等分除と包含除です。

上に書いたように5人で分けると1人分はいくつでしょうといった等分除と、3個ずつ分けると何人に分けられるでしょうといった包含除です。

参考: http://ja.wikipedia.org/wiki/%E9%99%A4%E6%B3%95

普通に算数を学んだ人は、この2つの違いを意識することはないと思います

どちらも同じ割り算という計算をすれば答えが出ることをすぐに思いつけるレベルになっているでしょう。

即座に割り算だと分からないと、割り勘も出来ないし生活で困るはずです。

むしろ、この2つの違いを意識して式を立てるほうが異常だと思います

3×5=3+3+3+3+3=5+5+5

3×5 の定義は3を5回足し合わせること。すなわち 3+3+3+3+3 である。もちろんこれは正しいことです。

よって、3×5 は3個のりんごを5組集めてきたときの総数という意味解釈しなければならず、5個のりんごを3組としてはならない。これは完全に誤りです。

定義は掛け算の計算方法を定めているのであって、意味を定めているものではありません。

たとえば、掛け算には面積を計算するという重要意味もあります。縦3m横5mの長方形の面積は何平方mでしょう?

3+3+3+3+3=15

により15平方mと解いたならこれは自信をもって×にできます

3mを5回足すことに面積を求めるという意味はありえません。大体、左辺と右辺で次元が違っています

3×5を定義で置き換えることで完全に意味が変わってしまいました。これは定義意味を示してるわけではないということです。

割り算も同じです。等分除で定義した割り算も包含除で定義した割り算も計算の結果は同じです。意味が違うだけです。

意味が違うからと違う記法を導入してはいけません。数学意味を捨て去って計算抽象化する学問です。結果が同じならみんな割り算と呼んでやればいいのです。

意味の違いを捨て去ることで算数のレベルひとつ上がりました。掛けられる数は常に左で必ず個数だと決めて覚えるのはもちろんレベルダウンですよ。

おわり

掛け算は何を意味するのか?それは定義ではなくて掛け算の性質(=定理)から得るのが自然だ。

3×5は定義から「3個×5組」という意味にとれるし、交換法則定義から「3組×5個」という意味にもなる。

3m×5m」なら面積だし、「3m×5本」なら長さの合計でもいい。

大事なのは上のように式の意味をたくさん見つけてくる能力を強化することと、逆に意味から式を作る引き出しを充実させることだ。

みんなこのプロセスを辿ってきたから、等分除とか包含除とか意識せずに割り算できるし、掛け算の左と右を区別するという引き出しの容量の無駄遣いなんてしなくなったはずだ。

わざわざ理屈で考えて式をひねり出させるような問題ではない。そんなことができるのは算数が得意な利口なのだけだろ。

2010-11-16

http://anond.hatelabo.jp/20101116131555

横だが、整数の積の可換性は公理じゃなくて定理だろ。頭悪いのはお前だ。

http://anond.hatelabo.jp/20101116135446

整数同士の掛け算は「複数回足す」でよいだろう。

有理数同士の掛け算は既約分数の分子同士、分母同士を掛けるとできる。(その妥当性は簡単に検証できる)

無理数同士の掛け算は既約分数近似の極限で定義かな。この辺から厳密には実数連続性とかの概念が必要になるだろう。

http://anond.hatelabo.jp/20101116140035

「100円のりんごを3個買うのと、100円のナシを3個買うのとでは、合計金額を計算するのは同じ式でよい」という程度の抽象化はするけど、

馬鹿は「整数集合上でいくつかの性質を満たす演算を積と定義する」というような抽象化は理解できないと思う。

http://anond.hatelabo.jp/20101116131059

頭悪いな。

りんごだとか皿だとか、物理的な実体が出てきた時点で数学じゃなくて物理の領域なんだよ。

純粋数学だと言うなら整数集合上の積演算公理からa×b=b×aでそれ以上の構造は何もない。

数学なら3×5でも5×3でも一緒!(キリッ

(※ 追記しました。)

なわけありません。元ネタ

http://alfalfalfa.com/archives/1374811.html

で、

http://togetter.com/li/68853

http://kidsnote.com/2010/11/15/35or53/

とかで議論されている。この問題は

  • 初等教育で掛け算をどう教えるべきか
  • 3×5と5×3の違いそのものついて

の話が混じりあい、おかしな事になっている。

だがそんな中で、「これは数学では全く同じものだから、くだらない、国語の問題だ」とか言って思考放棄してる連中が多すぎて反吐が出そう。おまえら、どうやって掛け算計算しているんだ?3×5=5×3は、定理より導かれる帰結なんであって3×5と5×3が同じ意味なわけがない。

ここでは、「高等教育を習った人向け」に、数学的に5×3と3×5を区別するべきことを説明する。

前提:数式は言葉である

suzusuke氏も算数科学習指導要領解説から引用していることであるが、数式とは思考過程を表現する言葉(ツール)である。

Aさんがりんごを1個、Bさんがりんごを3個、Cさんがりんごを2個持っていました。合計は?

これに対して、

4+2=6、よって6個

と書いたら、だれにも伝わらない。4って数字がどっから来たのかわからないからだ。

いくら「1+3=4なのは数学的に等価だ!」といっても、それはお前の頭の中であって別の話である。

6であるということを証明するには合計を計算するにはすべてを足せばOKという共通認識を持った上で

1+3+2=4+2=6

と示さなければいけないのである。無論、バックグラウンドで了解が取れるなら

1+3+2=6

といきなり書くことは何ら問題がない。大事なのは「1+3+2」と「1+3+2=6」は言葉として意味が違う、ということだ。どう考えたか、をできるだけハッキリした形で表現できるツールが、数式なのである。

掛け算とは何か

お前らは「3×5も5×3も同じじゃないか」とか言うかもしれない。じゃあ聞きたい、「その同じと言ってる3×5とはなんなのか」を。まさか九九を信用して「3×5=15」のことだ、とは言わないだろう。

ここで、「定義」の必要性が出てくるのだ。掛け算はあまりに普遍的すぎて、そこを忘れやすい。そこで我々は×という記号を

3×5 = 3+3+3+3+3

のような略記である、と「定義」するのである。

ここで、お前らは英語圏では

3×5 = 5+5+5

定義しているぞ、バカが。と言うかもしれない。そのとおりである。それで一向にかまわない。だが大事なのは「数学は可能な限り簡潔な定義でなくてはならない」ということだ。つまり、

3×5 = 3+3+3+3+3 または 3×5 = 5+5+5

なんて自由度を与える定義はあってはならないのだ。そもそも、計算してみないとほんとに等しいかわからない3+3+3+3+3 と 5+5+5 のどっちでもいいよ、ていうのはwell-definedにならない危険性さえある。とにかく、定義は一つで済むなら一つにするべきなのである。

あくまで定義の仕方が2通りある、ということだ。定義の仕方自体に絶対性はない。そして、日本では前者のほうがしっくりくるから、とりあえず前者で定義している。定義なんだから、ローカルルール小学生限定もない。そこを履き違えてはいけない。

ちなみにそんなこと数学で習ったことない、という奴もいるだろうが、当たり前である。高等数学では上記のような略記であるとは定義しない。それは0とか負の数とか、小数とかが入ってくると上記の定義では不足するからである。だが、はじめは自然数だけの世界で議論するなら上の定義が一番素直なのである。

例の文章題に対する正答例と誤答例

では、上記の定義を教えた、という文脈で数学的に「5皿でそれぞれ3つのりんごが乗っている、りんごは合計で?」の解答を考えよう。

その1

15個。

誤答。これは回答になってない。文章中に15という数が書いていないので、どこから15が出現したかわからない。

その2

3+3+3+3+3 = 15、よって15個

正答。3個のものを5皿あるんだから足し合わせるのは自然。式変形は当たり前なので省略したのであろう、当然

3+3+3+3+3 = 6+3+3+3 = ...

としてもOK。

その3

6+3+3+3+3 = 15、よって15個

誤答。たしかに3+3=6だが、それを計算したかどうかが伝わらない。数学的に等価だ、なんて理由にならない。

その4

5+5+5 = 15、よって15個

誤答。文章中に「5個」という言葉が出てない以上、はじめの式の5は「5個」と解釈できない。だから足しあわせた結果はりんごの数を表現しない。

その5

同じ数ずつ乗っているなら1個ずつ配っていくことで数えられる。一周で配れる量は5個で、3こずつ配るから三周する。よって

5+5+5 = 15、よって15個

正答。数式中に現れる5をリンゴの数だと説明しているからである。

その6

3×5 = 15、よって15個

正答。我々の定義に従えば、その2の略記でしかない。

その7

5×3 = 15、よって15個

誤答。我々の定義に従えば、その4の略記でしかない。すると同じ理由で間違い。

3×5と5×3は数学的に等価だ、なんてもう言わないよな?それを認めるとその3でさえ正しい。

そんなわけで

数式とは「定義」という共通認識のうえで言葉を話すものであって、別の記述をしたら「偶然正しい」のか「根拠があって正しい」のかわからんのである。

結論は

  • 自然数限定では)3×5は二通り定義できて、日本では3+3+3+3+3とするのが普通
  • 数式はどう考えたかの言葉(意思表明)であって、等しければいいわけじゃない
  • よって5×3は3×5とは区別される

数の概念整数一般に拡張させると、掛け算の定義は上記では不十分で、分配結合則など環の性質にその本質があることに気がつき、そこに定義を移すことになるがまた別の話。そこまで行くと公理とは何か、整数とはなにかを考え直す必要が出てくる。そこで可換性自体は代数構造には不要であることにも気づくはずだ。

大事なのは定義を尊重する姿勢と、定義そのものに着目する(そして、定義そのものを疑う)姿勢を合わせ持つこと。ローカルルールだ、とか押し付けだ、とか言っているやつらが、実は一番思考停止してる。

まぁ小学生にここまで考えさせるのは、正直厳しいが上記正答例、誤答例を示してみるくらいはいいんじゃないか、と思う。

追記

トラバが付きまくってるwみんな好きだね。

論理的でゴメンナサイ、これでも理系です。

言いたいことが伝わらなくて、もどかしい。

ここまできて、根拠が「それが普通」だからてお前・・・。

今度はそれが普通であるという根拠を主張しなきゃイカんでしょ。

普通」には根拠はないだろう。「慣習」と言い換えてもいい。だから、この定義を疑うことが大事。ただ、一番最初に習う定義として、これを使うことが多いということである。

結局元増田が書いてたくそ長い文章は

「それが普通だから正しい、それ以外は間違い」に集約される、と。

バカみたいだな。

普通だから」ではなく、今の文脈では「3×5 = 3+3+3+3+3 を定義として採用するから」である。まずは定義を信用し、それ以外は知らないものとして扱わなければ数学じゃない。

m×0=0

m×(n+1)= m×n+m

まー俺なんぞが独力で導入できるような概念じゃないけど

それで定義すると、m × n = m + m + ... + m (n times) = n + n + ... + n (m times) = n × m が定理になるんだろう。

ようするに、どれが定義かって話じゃん。

だからこんなにも美しい定義存在するのになんでわざわざ便所のゴミみたいな定義を新しく考える必要があんのよ、って話。

そう、上記の「普通」は普通じゃないだろと気がついたときに定義に変更が加わる。そしてこちらの定義のほうが美しい。だから「これが掛け算の定義だ、そしてこれを定義にすればこの定理は明らかだ」という「文脈」では、5×3と書いても3×5と書いてもいい。

文脈についても議論がされているようだが、文脈こそ数式を語る上で重要なものだ。何を定義にするのかというのも文脈だし、どの定理を認めるかも文脈だからだ。

たぶん、5×3も3×5も同じ物と主張する人は可換性を自明としている。それこそが文脈である。しかし数学で何が文脈なのかは、状況によるし、今回は掛け算を定義したばかりなのだから可換性を自明とするのはおかしい。

「1皿につきりんご3個」と表現した時点でそれは3個/皿という比率しか現していない。3個+3個+3個+3個+3個=15個と言いたいらしいが、前処理を済ませない限りその3につけるべき単位は個ではなく個/皿でしかない。3(個/皿)+3(個/皿)+…、おいおい、比率って足せるのかよ?

単位の話をすると少し難しくなる、というか物理がわかんないのでそこを正確に語れない。だが、あなたの主張を通すと 3+3+3+3+3=15 は間違いだ、ということにならないか?これを否定されるとどうしようも無い。

まぁなんつーか、もっと皆語るといいと思うよ。教育不毛とかはどうでもいいし、小学生が理解できなくていいから。

2010-10-05

http://anond.hatelabo.jp/20101004204759

デジタルのデジは、ディジットのデジ。数字の事。

離散数学って知っているか?連続した値ではなく、飛び飛びの状態、整数のような値を扱うんだ。

量子力学を知っているか?エネルギーは離散的で連続していない。デジタルなのだよ。

物質と量子のレベルまで細かく観測すると、そこはデジタルだったのだ。

つまりこの世はすでにデジタルなのだよ。

2010-07-31

23歳既卒ニート国立大学卒)が全国学力テストに回答してみたよー

注:国語は小中ともに100点だったので割愛。

ただし、中学校数学は間違いましたよ?ww

間違えた問題その1

(2) -10より大きい負の整数を1つ書きなさい。

即答で「-11」と答えた俺は勝ち組

間違えた問題その2

(1) 一次関数y =2x-3 の変化の割合を求めなさい。

そもそも「変化の割合」ということばが記憶にないでござる。傾きと言いたまえ!(まいなすにぶんのさんってこたえたじぶんはずかしい)

ほか全問正解。15分かかったかどうか。

数学Bは「数学ってなんの役に立つんですか」の文科省からの答えですな。

まあ大学生でも間違えちゃう問題ということで、ここはひとつ

2010-07-24

google発のProtocol Buffersについて

オブジェクトシリアライズツールであるプロトコルバッファについて書きます。

プロトコルバッファって何って方はこちらへ

Protocol Buffers 本家

http://code.google.com/apis/protocolbuffers/

XMLはもう不要!? Googleシリアライズツール「Protocol Buffer」

http://journal.mycom.co.jp/articles/2008/07/18/protocolbuffer/index.html

Protocol Buffers (Protocol Buffers の内部解説記事。とても参考になります)

http://dodgson.org/omo/t/?date=20080712

内容

プロトコルバッファは異種言語間でオブジェクトのやりとりをするための規格です。

独自の言語によりオブジェクトインターフェースを規定することで、多言語対応を行っています。

例えばこんな感じ。

  • address.proto
package tutorial;

message Person {
  required string name = 1;
  required int32 id = 2;        // Unique ID number for this person.
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

// Our address book file is just one of these.
message AddressBook {
  repeated Person person = 1;
}

以上のようなprotoファイルから各言語ソースコード、または何らかのデータ操作ライブラリを使いオブジェクトの処理を行います。

googleによってC++, Java, Python用のライブラリ作成されましたが、他の言語対応したサードパーティー製のライブラリがいくらでもあるので、実質的にほぼすべての言語で使えると言っても過言ではありません。

以下はこのライブラリを使ってみた感想などです。

整数型はVarintという可変長型でバイナリに保存される

数字が多きければ大きいほど、長いバイト長で保存されます。ただし、負数の場合符号ビットが立つ関係で、ほとんど常に変換後のバイト数が最長バイト数(10)になってしまいます。フィールドの型をsint32, sint64で宣言しると、各数値にzig-zags変換が行われるため、負数であってもその値の絶対値で使用バイト数が決まるようになります。

保存されるデータは各メッセージID/型/値のみ

バイナリに保存されるデータは各メッセージID/型/値のみです。なので、同じ定義の二つのメッセージ型は、プロトコルバッファ上では全く同じように扱うことが出来ます。例えば、片方からシリアライズしたデータを、もう片方の型でデシリアライズすることが可能です。

またオブジェクト連続シリアライズ/デシリアライズすることもできます。

継承されたクラスマッピング

すでに存在する継承関係のあるクラスを、Protocol Buffersでシリアライズ/デシリアライズしたい場合は次のようにします。

(Base, Derived はすでに存在するとします)

(ソースコード中になぜか日本語が書けないので、コメントはすべて英語になっています)

message PbBase {
        require int32 id = 1;
        require int32 value = 2;

        require Derived derived = 10; // - Point !!!
}

message PbDerived {
        require string string_value = 1;
}

継承元のメッセージ定義に、継承先のメッセージを持たせます。Base継承するクラスシリアライズ/デシリアライズしたい場合は、PbBaseメッセージを中心に処理を行うことで、比較的簡単に処理を実装することが出来ます。

例えばこんな感じ

Base *Base_DeserializeFrom(PbBase &pbobj)
{
    // Arrange the classes which inherits from Base.
    if (pbobj.has_derived()) {
        return new Derived(pbobj);
    }
    else
    ...
}

class Base {
    ...
    virtual void Base::SerializeTo(PbBase &pbobj) {
        // Set the fields of 'pbobj',
    }
    ...
};

class Derived {
    ...
    virtual void Base::SerializeTo(PbBase &pbobj)
    {
        PbDerived *derived = pbobj.mutable_derived();

        Base::SerializeTo(pbobj);
        // Set the fields of 'derived',
        ...
    }
    ...
};

protoファイルを以下のように書くと、メッセージの扱いが非常に難しくなります。

message PbBase {
        require int32 id = 1;
        require int32 value = 2;
}

message PbDerived {
        required PbBase base = 1; // - Here is the point !!!
        require string string_value = 2;
}

2010-06-19

http://anond.hatelabo.jp/20100619150228

痴漢に遭遇したくない人に、男性が乗れない車両がありますよ、と環境を提示するのだから問題ない。

そこに乗らない人が痴漢を許容しているとかの理論は成立しないが、犯罪者の割合なんて、%で言っても整数にならんだろうから、仕方が無い。

個人的には、男性車両、かっぽぉ車両女性車両を、6:1:3くらいで導入してくれればいいかなと思ったりもする。

2010-01-24

0はどちらかといえば正の整数

2の補数表現符号ビットが0だから

2009-11-05

http://d.hatena.ne.jp/tikani_nemuru_M/20091104/1257322803

「可能な点の個数の最大値」はわからないが、「可能な点の個数の例」なら割と簡単にできる。

整数環 Z に対し、自然数 n を法とする剰余環 Z/nZ をとる。  Z/nZ = { 0 , 1 , 2 , 3 , ... , n-2 , n-1 }
二つの元 a , b が線で結ばれているとき、L( a , b ) と表すこととする。

このとき n = 3N-1 として、Z/nZ の任意の元 k から
L( k , k+1 ) , L( k , k+4 ) , L( k , k+7 ) , ... , L( k , k+3N-2 )
のN本の線を引く。

これで 「任意の2点を取り出すと、その2点は直接、あるいは、別の1点を経由してつながっている」 という状況は満たしている(ただし最大値かどうかは不明)。
これだと線の本数 N に対して 3N-1 個の点になるので、N=150 ならば点の個数は449。tikani_nemuru_M氏が想定する500という数字には近い。

2009-10-17

戸籍廃止、夫婦別姓賛成派は、相容れない二派に分かれている。

 最近増田でも、夫婦別姓戸籍廃止についての話題が多い。例えば下記とか。

夫婦別姓の賛成派は親子別姓に耐えれるのか

http://anond.hatelabo.jp/20091017192625

 私も、戸籍廃止、夫婦別姓賛成派である。しかし、戸籍廃止、夫婦別姓廃止派は、相容れない二派に分かれている。

 一つは、国が個人情報管理すべきでないとおもっている派閥だ。

 もう一つは、国にが個人情報を、適切に管理すべきだと思っている派閥だ。

 私は、後者である。戸籍や姓というあやふやなものは廃止して、整数で個人を識別すべきだと思っている。例えば、生年の西暦4桁+届け順8桁の12桁の整数を、個人に割り振ることで、現状の戸籍や姓という制度より、厳密な管理ができる。そして、効率的でもある。

 一方、国が個人情報管理すべきでないから、戸籍廃止、夫婦別姓賛成派の人もいる。

 戸籍廃止、夫婦別姓を論じる際は、以上のことを頭においてほしい。

2009-06-21

PHP「$a="0x0A";++$aは11ですがよろしいですか」

ぼく「えっ」

PHP「$a="0x0A";++$aは11になりますが」

ぼく「いえ"0x0B"です」

PHP「えっ」

ぼく「えっ」

PHP「まだインクリメントしたことがないということでしょうか」

ぼく「えっ」

PHP「えっ」

ぼく「変化するってことですか」

PHP「なにがですか」

ぼく「型が」

PHP「ああ文字列でも整数っぽい文字列なら自動で型変換されますよ」

ぼく「そうなんだすごい」

PHP「ではインクリメントいたしましょうか11ですよ」

ぼく「でも"0x0A"は明示的にキャストしたら0になりますよね」

PHP「えっ」

ぼく「えっ」

PHP「ああ16進数のことなら10進数自動で変換してから演算するんですよ」

ぼく「なにそれこわい

PHP「for($i="0w9Z";$i<12;$i++){echo $i;}と書くと $i="0w9Z", "0x0A", 11と変化します」

ぼく「なにそれきもちわるい」

PHP「えっ」

ぼく「えっ」

http://d.hatena.ne.jp/fbis/20090618/1245297557

2009-06-17

PHPの比較の素晴らしさ加減は正常


if ("0x0A" == "10") {
    print '(´ε` )チュッ';
}

チュッ。されちゃいます。

文字列であっても整数解釈できる文字列の場合は勝手に型変換しやがる今世紀最大の愚行を犯してしまうってのは有名な話だよね。

文字列であっても整数解釈できる文字列の場合は自動的に整数に型変換してくれる超便利機能があるってのは有名な話だよね。

だけどなんでコレが一致するかわけがわからんかった。

0x0Aは10進数で10になるので一致する。と、言いたいところなんですがそう単純な話じゃないんだ。

以下の例を目ん玉見開いて見て欲しい。


var_dump(0x0A);
var_dump("0x0A");
var_dump((int)"0x0A");
var_dump((float)"0x0A");
var_dump(intval("0x0A"));

実行結果
int(10)
string(4) "0x0A"
int(0)
float(0)
int(0)

つまり文字列の"0x0A"ってやつはどう考えても0と解釈されるはずなんだ。だから上記if文が本来一致するはずがいない。

でも実際は何故か10と解釈されて一致してしまう。

そう、つまり演算子で比較した場合、やらんでもいいのにわざわざ16進表記かどうかまでチェックして余計なお世話的うんこ変換しやがるということになる。

そう、つまり演算子で比較した場合は、16進表記かどうかまでチェックして10進数に変換してくれているということになる。

明示的に書くならこんな感じだ。


if (intval("0x0A",16) == "10") {
    print '(´ε` )チュッ';
}

クソが。

なるほどねー。

ただでさえ文字列同士の比較なのにintに変換されるだけでもミソ糞うぜぇのに、わざわざ16進数の場合は10進数に変換してくれる超糞尿仕様

文字列同士の比較であってもintに自動変換してくれるだけでも素晴らしいのに、それに加えて16進数の場合は10進数に変換してくれる超便利仕様

ってこたぁ、8進数表記の場合も糞糞マジ死ぬほど余計なお世話するんだろうなぁと思ってしぶしぶ試してみた。

ということは8進数表記の場合もこの素晴らしい自動変換しれくるのかなと思って試してみた。


if ("0x0A" == "012") {
    print '(´ε` )チュッ';
}
else {
    print '\(^o^)/';
}

実行結果
\(^o^)/

おー、さすがPHP!、やっぱ8進数の場合は10進数と似てるから8進数と見なすよりも10進数と見なしたほうが効率いいですもんね。いやーわかってるなー。ますますPHPが好きになりました。I Love PHP. We Love P☆H☆P!

はは、はははっ、ははははっ。やるならやる!やらないならやらない!どっちかに統一せーやこのプリンシパル校長ヘッドハンティンピープルぺーぺーぽりんき味噌マッチョ変態改造エアガン陵辱-2くらいのスカンク殺ろうがぁああああああ★ああああああああああああああああああああああああああああああああああああああfじょ★えいjfsきじぇいつつしまじいのそるいつのだ★ひろけがきちもするけけけそあいんぼろうれあああぁあああああaaaaaa


プログラ増田のあなぐら

2009-05-12

音の高さは周波数で表現される。周波数が2倍になったとき,われわれは音色が保たれたまま1段「高く」なったと感じる。4倍で2段。2^n倍でn段となる。これに必然性はなく生物的所与条件にすぎない(たとえば,3倍を1段と感じたり,100Hzごとに1段と感じる生物がいてもよい)。人間の耳は20Hz~20000Hzまでの音を知覚できるので,最大10段程度(2^10=1024倍)の音色を聞き分けられることになる。

1段を細分化する制度音階である。分割の仕方には2つの論点がある。まず,いくつに分割するか。一般によく知られているのは12階に分割する方法(12音階)だが,これが「正しい」わけではない。5音階や3音階採用した音楽文化も存在する。次に,どのように分割するか。先述のとおり音色は比で決定されるので,差で分割するのは普遍性に欠ける(1段内のみなら可能だが,2段目以降に適用したときに破綻する)。人間の耳は最小で周波数の0.3%が変化したときにその変化を感知できることが知られている。よって1.003以上の比で分割することになる。各音の比を可変にして,常に整数値になるようにしたものを純正律,また各音の比が一定になるようにしたものを平均律という。平均律12音階制を採用した場合,各音の比は12√2になる。これは無理数であるので,これをもとに音楽を奏でるときには近似値を用いなければならない。

平均律12音階を前提としたとき,ある音の周波数Fは

F = f * 2^(x/12)

と表すことができる。なおfは基準音,xは基準音からの隔たりを示す整数音程)である。前提から自明であるが,これは離散的な値をとる。

音階に基づく音を時系列に沿って表示する記号体系として五線譜が広く用いられている。周波数の高低を視覚的な上下に置き換えて示すため直観的にわかりやすい。この五線譜周波数グラフとして考えることができる。各々の線は等比的な増大を示すため,対数グラフである。ただし一般的な五線譜記法は7音階+5半音という古典的な考え方に基づいているため完全な対数グラフではない。

2009-04-15

http://anond.hatelabo.jp/20090415173841

「f(x,y)を最大にする整数x,yを求めよ」

これを遺伝アルゴリズムでやるとこうなる。

 うーん、これはイプシロンーデルタ論法の一変形のような気がする。

間違いだらけの遺伝的アルゴリズム


うん、ごめん。タイトル釣り。っていうか今から書くことも間違ってるかもしれない。

識者のフォローを待ちたい。

http://b.hatena.ne.jp/entry/http://wiredvision.jp/news/200904/2009041523.html

これの話なんだけど

遺伝的アルゴリズム」って出たときに、もうこれは人工知能ではないと一応考えていい。それはソートプログラム人工知能ではないのと同じみたいな。

「f(x,y)を最大にする整数x,yを求めよ」

これを遺伝アルゴリズムでやるとこうなる。

  • ランダムで(x,y)の組をいくつか作る。これが個体。xyは遺伝子になる
  • すべての個体に対してf(x,y)を計算する。このときf(x,y)は評価関数という。
  • 評価の低い個体の何割かは子孫を残さず死ぬ。
  • のこりの個体は以下の方法で子孫を作れる。
    • コピーを残す。
    • 自分のもってるx,yを交換した子孫を残す
    • 他の個体とx,yのどちらかを交換する
    • ランダムで生成したx,yと置き換えた子孫を残す
  • 次世代に対してf(x,y)を計算する

これを上昇しなくなるまで繰り返したら終り。これだけ。

単純化の為にxyとしたけど、x,yを「素数の和」と考えて素数の列abcdefghを遺伝子なんてするとよりそれっぽくなる。要は遺伝的アルゴリズムとはランダムサーチをちょっと改良した奴ってことだ。

記事中のプログラムは現象をモデル化しては考えてない。文字列のなかから現象に近い値を示す数式とおなじ文字列を選び出すだけだ。

あと、どれくらいの率で子孫を残すか、交換が起こるか、突然変異が起こるか等は計算の収束に影響を与える遺伝子とは独立したパラメータで、それをプログラムがいじるのであれば、まあ一応人工知能と呼んでも怒られないかもしれない。

以上、あっちの記事タイトル(邦訳のみ)も釣りっぽいよねって話でした

2009-01-29

http://anond.hatelabo.jp/20090129211626

1÷3=1/3

から

「三分の二個のリンゴを四分の一個で割るってどういうこと?」

に行くのが急なのかも。

1÷3=1/3

が出来たら

1÷1/3=3

をやってみると1より小さい分数で割ると答えが大きくなるのが実感しやすいか。

整数の割り算なら

6÷2=3

6÷3=2

みたいに、割る数と答えを入れ替えても式は成り立つ。

これは、

6個のリンゴを2人に分けたら何個づつになるのか

6個のリンゴを3個づつ配ったら何人に配れるのか

という2つの考え方のどちらも成り立つということ。

このことが理解できていなかったのなら、これも復習する。

リンゴと人の場合は、リンゴは分数にできても人は分数にできないので別の例を考える。

然別でもいいけどリンゴにこだわるのなら

1分間でリンゴを1/4個食べられる人が、2/3個のリンゴを食べるのにかかる時間は?

とか。

これで難しかったらまず

1分間でリンゴを1/4個食べられる人が、1個のリンゴを食べるのにかかる時間は?

でやってみるとか。


わからないことがあったら、わかるところまでもどってからやり直したほうが結局のところ早いのかも。

http://anond.hatelabo.jp/20090129193722

分数同士の割り算の前に、分数を整数で割る、整数を分数で割るというのをやると理解しやすいかも。

1/2÷3=1/6

4÷2/5=10

といったのが理解できれば、そこから分数÷分数に進むのもあと一歩。

もっと基本的に、整数同士の割り算の結果が分数になるということからやり直すと割った数が分母にくるというのが改めて実感できるかな

2008-12-23

今年の情報オリンピック予選のこの問題、

冬の寒いある日,JOI太郎君は広場にはった薄氷を割って遊ぶことにした.広場は長方形で,東西方向に m 個,南北方向に n 個,つまり, m × n の区画に区切られている.また,薄氷が有る区画と無い区画がある. JOI太郎君は,次のルールにしたがって,薄氷を割りながら区画を移動することにした.

薄氷があるどの区画からも薄氷を割り始めることができる.

東西南北のいずれかの方向に隣接し, まだ割られていない薄氷のある区画に移動できる.

移動した先の区画の薄氷をかならず割る.

JOI太郎君が薄氷を割りながら移動できる区画数の最大値を求めるプログラムを作成せよ.ただし, 1 ≦ m ≦ 90,1 ≦ n ≦ 90 である.与えられる入力データでは,移動方法は20万通りを超えない.

入力

入力はn+2行ある. 1 行目には整数 m が書かれている. 2 行目には整数 n が書かれている. 3 行目から n+2 行目までの各行には、0 もしくは 1 が, 空白で区切られて m 個書かれており,各区画に薄氷があるか否かを表している.北から i 番目,西からj番目の区画を (i,j) と記述することにすると (1 ≦ i ≦ n, 1 ≦ j ≦ m),第 i+2 行目の j 番目の値は,区画 (i,j) に薄氷存在する場合は 1 となり,区画 (i,j) に薄氷存在しない場合は 0 となる.

のいい最適化の方法が思いつかない。

一応プログラムは書けたけど90*90の時にまともに動く気がしない。

単なる深さ優先検索。

array = [
  [1, 1, 1, 0, 1],
  [1, 1, 0, 0, 0],
  [1, 0, 0, 0, 1]
]
result = []
def get(x, y):
  if (0 <= x < len(array)) and (0 <= y < len(array[0])):
    return array[x][y]
  else:
    return -1
def func(x, y, route):
  route = route[:]
  # print x, y, get(x, y)
  if get(x, y) == 0:
    result.append(route)
    return
  if (x, y) in route:
    return
  route.append((x, y))
  if get(x - 1, y ) >= 0: func(x - 1, y , route)
  if get(x , y + 1) >= 0: func(x , y + 1, route)
  if get(x + 1, y ) >= 0: func(x + 1, y , route)
  if get(x , y - 1) >= 0: func(x , y - 1, route)
func(0, 0, [])
for i in result:
  print i

2008-10-30

http://anond.hatelabo.jp/20081025202001

いまさらだがFizzBuzz

1から100まで、3の倍数5の倍数云々って、全部定数の計算じゃね?

というところに気付き、自称メタプログラマー(略してメタグラマー)俺の血が騒いだ。

定数計算なら、それは実行時ではなくコンパイル時に行なわれるべきだ……。

というわけでC++テンプレートメタプログラミング召喚。

#include <iostream>

const int FIZZ_NUM = 3;
const int BUZZ_NUM = 5;
const int BEGIN_NUM = 1;
const int END_NUM = 101;

template<int N> struct Fizz {
    enum {PRINT = 0, NEXT = N + 1};
    static void print() {}
};

template<int N> struct Buzz {
    enum {PRINT = 0, NEXT = N + 1};
    static void print() {}
};

template<int N, bool ForB> struct Number {static void print() {std::cout << N;}};

template<> struct Fizz<FIZZ_NUM> {
    enum {PRINT = 1, NEXT = 1};
    static void print() {std::cout << "Fizz";}
};

template<> struct Buzz<BUZZ_NUM> {
    enum {PRINT = 1, NEXT = 1};
    static void print() {std::cout << "Buzz";}
};

template<int N> struct Number<N, true> {static void print() {}};

template<int N, int F, int B> struct FizzBuzz {
    static void print() {
        typedef ::Fizz<F> Fizz;
        typedef ::Buzz<B> Buzz;
        
        Fizz::print();
        Buzz::print();
        Number<N, Fizz::PRINT || Buzz::PRINT>::print();
        std::cout << std::endl;
        
        FizzBuzz<N + 1, Fizz::NEXT, Buzz::NEXT>::print();
    }
};

template<int F, int B> struct FizzBuzz<END_NUM, F, B> {static void print() {}};

int main(int argc, char **argv)
{
    FizzBuzz<BEGIN_NUM, 1, 1>::print();
    return 0;
}

ifなし%なしループ系なし、しかも実行時オーバーヘッドなし!(多分)

あ、これを見て理解する人間オーバーヘッドは無視ね。

ああ、久しぶりにC++を触ったけど、やっぱC++テンプレートってダメダメだな。20世紀の遺物といわざるを得ない。

君がもし21世紀モテイケメンメタグラマーなら、21世紀プログラミング言語D言語を使うべきだ!

驚くべきことに、D言語コンパイル時に関数が実行でき、その結果をソースコードとして取り込める!

ただし実行できるのは簡単な関数だけだけど……。

以下、それを使ったD言語によるメタプログラミング的実装。

import std.stdio;

// これでFizzBuzzを全部出力するコードを作るぜ!
string makeFizzBuzzCode() {
    string code;
    for(int i = 1; i <= 100; ++i) {
        // 効率? コンパイル時にそんな配慮は要らん!
        if(i % 3 == 0 &amp;&amp; i % 5 == 0) {
            code ~= "writefln(\"FizzBuzz\");\n";
        } else if(i % 3 == 0) {
            code ~= "writefln(\"Fizz\");\n";
        } else if(i % 5 == 0) {
            code ~= "writefln(\"Buzz\");\n";
        } else {
            code ~= "writefln(" ~ static_itoa(i) ~ ");\n";
        }
    }
    return code;
}

int main(string[] args) {
    // おまけで生成されたコードも見せるよ。
    pragma(msg, makeFizzBuzzCode());
    
    // 生成したコードを埋め込む。コピペみたいな感覚
    mixin(makeFizzBuzzCode);
    return 0;
}

// 以下ユーティリティ。このぐらい標準で欲しいな……。

/// 整数文字列変換(コンパイル時)
string static_itoa(int n) {
    if(n == 0) {
        return "0";
    }
    
    // 10で割りながら余りを文字にして追加。桁が逆転した文字列になる。
    string s;
    for(; n; n /= 10) {
        s ~= ("0123456789")[n % 10];
    }
    
    // 桁位置を正常にする。相変わらず効率無視。
    return static_reverse(s);
}

/// 配列リバースコンパイル時)
/// 実行時ならarray.reverseが使えるんだけどね……。
T[] static_reverse(T)(T[] s) {
    T[] result;
    foreach_reverse(c; s) {
        result ~= c;
    }
    return result;
}

// 心配なので静的ユニットテスト(笑)
unittest {
    static assert(static_itoa(0) == "0");
    static assert(static_itoa(10) == "10");
    static assert(static_itoa(999) == "999");
    static assert(static_itoa(9999) == "9999");
    static assert(static_itoa(12345) == "12345");
    static assert(static_itoa(314159265) == "314159265");
}

コンパイル結果

$ dmd -unittest fizz_buzz.d
writefln(1);
writefln(2);
writefln("Fizz");
writefln(4);
writefln("Buzz");
writefln("Fizz");
writefln(7);
writefln(8);
writefln("Fizz");
writefln("Buzz");
writefln(11);
writefln("Fizz");
writefln(13);
writefln(14);
writefln("FizzBu(ry

出力結果は略。

さすがD言語C++JavaC#にできない事を平然とやってのけるッ

そこにシビれる!あこがれるゥ!

というか、

writefln(1);
writefln(2);
writefln("Fizz");
writefln(4);

もうwritefln(出力関数)要らなくね?

修正。

// これでFizzBuzzを全部出力するぜ!
string makeFizzBuzzCode() {
    string code;
    for(int i = 1; i <= 100; ++i) {
        // 効率? コンパイル時にそんな配慮は要らん!
        if(i % 3 == 0 &amp;&amp; i % 5 == 0) {
            code ~= "FizzBuzz\n";
        } else if(i % 3 == 0) {
            code ~= "Fizz\n";
        } else if(i % 5 == 0) {
            code ~= "Buzz\n";
        } else {
            code ~= static_itoa(i) ~ "\n";
        }
    }
    return code;
}

int main(string[] args) {
    // もうコンパイル時のメッセージしか出さない。(笑)
    pragma(msg, makeFizzBuzzCode());
    return 0;
}

コンパイル結果。

$ dmd -unittest fizz_buzz.d
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBu(ry

実行するまでもなく結果が出力された。つまり実行時間ゼロ、ということは……

世 界 最 速

以上、世界最速なD言語宣伝でした。

みんな使おうD言語

D言語リファレンス日本語

http://www.kmonos.net/alang/d/1.0/index.html(1.0。こっちの方が安定してる?)

http://www.kmonos.net/alang/d/2.0/index.html(もっと凄い2.0)

D言語本家配布元(無料コンパイラが入手できます)

http://www.digitalmars.com/

それにしても、ちゃんとD言語シンタックスハイライトを実装しているはてなは偉い。(笑)

ログイン ユーザー登録
ようこそ ゲスト さん