2011年12月31日

【数学】順列出力関数の作成(3)〜文字列化でメモリー対策

 前稿では、個別の順列をlistで生成したものをtuple化することで、メモリー不足から9要素9桁迄だったものを9要素9桁迄実用可能にすることでtuple型の利用の有用性を示すことが出来たのではないかと思う。list型はtuple()関数でtupleに、tuple型はlist()関数でlistにいつでも簡単に変換出来るので、編集不要なシーケンスについては初めからtuple型を利用し、編集が必要に成った段階でlist()関数で変換する様な癖付けが大切だということだ。
 さて、一般のシーケンスの扱いの結論としてはこういうことになる次第だが、順列出力という課題に対しては、出題の要素オブジェクト自体のシーケンスで毎回処理する必然性がないので、本稿では要素数と同じ数の文字に置換して個別の順列をその連続文字列で表現することで、tuple化よりメモリー効率の良いものに順列出力関数を改善して試ようと思う。
 技術的には、処理関数本体での前項でtuple()関数でtuple化していた箇所を文字列の標準メソッドjoin()を使い連続文字列化することと、処理関数に渡す前に各要素に対し1対1で対応する文字に置替えることの発想が出来るならは簡単にコーディング出来る筈である。
 例えば、['Alice', 'Ben', 'Charry']という要素に対する順列を処理する場合には、それ自体の文字列をつないで処理するのではなく、['0', '1', '2']といった1文字を要素とする順列のリストを作成し、「''.join(['2', '1', '0'])」とすることで文字列'210'を順列データとして生成して行くけば良いということである。
 具体的には次の様なコードとなった。
続きを読む
posted by Mire at 03:15 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年12月29日

【数学】順列出力関数の作成(2)〜tuple化でメモリー対策

 前稿では、再帰関数で定義した単純な順列出力関数を掲載させて頂いた。本稿では出来るだけ少ない修正で9要素9桁の順列迄しか出来なかった点を改善して試ようと思う。
 当方のPythonコーディングではデータ要素の配列を扱う方法としてはlistを多用することが多い。listオブジェクトなら、append(), remove(), sort(), reverse()等多彩なメソッドが使えてとても使い勝手が良いからである。しかし、今回の順列出力関数の様に大量のlistオブジェクトを含むリストを生成し返す関数の場合の様に実メモリー空間を越えてメモリー消費が膨大に増やしてしまう原因となってしまうことがある。それを小手先で回避するにはtuple化することが考えられる。tupleオブジェクトの場合、一切変更不可のオブジェクトの為使い勝手は悪いものの、その分シンプルな為、メモリー消費が抑えられる様だ。
 本稿のコードでは、オブジェクトの構造は別としても10要素10桁の全順列、3628800個×19バイト以上のデータ実体の収納が必要だが計算してもまだ20倍迄なら大丈夫そうである。そうであればlistで作成している順列の並びをtupleに変更することで僅かでも改善の可能性がある筈なので、その点を変更して試た次第だ。
 変更箇所は極めて少ないが変更後のコードは以下の通りだ。
続きを読む
posted by Mire at 00:06 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年12月27日

【数学】順列出力関数の作成(1)〜再帰関数で汎用化

 このBlogの「たけしのコマ大数学科」のお題に対するPythonコードは原則発想が簡単で、あまり試行錯誤せずに素早く完成出来る仕様とする様に心掛けている。従って、これ迄盛んに数字や記号の組合せから作る順列は、その並びの桁数分のループを入れ子で直書きし、順列としては不要な要素重複分もループさせる形式を採らせて頂いた次第だ。そちらの方が実践的だし、何といっても皆様にとって解読し易いからである。
 でも、ここの所似た様な順列問題を続けてコーディングしていて、処理時間の待ちが発生すると、心に引っかっていた「再帰関数で汎用化」という想いが大きくなってしまった。

 ということで結果として作成には結構な時間を要したものの、CPU負荷が少ないかなり軽快なまだ自己満足の域を出ないレベルの試作品ながらも、順列リストの生成の汎用関数を作成出来たので、ここに掲載させて頂く。実用上の課題があるバージョンではあるが一度に全ての実装をすると他人には判り辛いものなので、今回はそのままの掲載とさせて頂いた。

続きを読む
posted by Mire at 03:30 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年12月15日

たけしのコマ大数学科 「みっちの隠れ家さんからの問題」

たけしのコマ大数学科 テーマ: 視聴者からの挑戦状

みっちの隠れ家さんからの問題」
1から10までの数を次の規則に従って並べます。
最初から2つずつ区切って出来る数のペアを「組」ということにします。
(1)各組の中には偶数・奇数が1つずつ入っています。
(2)前の組の大きい方の数が奇数なら、次の組の最初は奇数
(3)前の組の大きい方の数が偶数なら、次の組の最初は偶数
(4)最初の組は(1,6)となっていて最後の組は8で終わります。
このような並べ方は何通りあるでしょうか?

 1〜10の整数ペアなので、[[a, b], [c, d], [e, f], [g, h], [i, j]]の様な5つの整数ペアの組合せを漏れなく生成し、条件を満たすものをリストすれば良いとも言える。
 そんな数列の組合せ問題なので、「数オリなでしこジャパン」と基本的に同様の方針で解決出来る問題であるが、全く同じにして試ると答えのリストが出てからも処理が続きなかなか終わらない。

 いくら今のPCが早く処理するとしても10の10乗階のループを真面目に廻せば尋常な時間で終わる筈もないので、今回は全ループで1〜10の数を廻すのではなく、最初の組の数字と最後の数をループ範囲に入れた処理としたことを予めお断りさせて頂く。これで1000倍程早く処理出来ることになる。

 今回のソースコードと処理結果は以下の通りである。続きを読む
posted by Mire at 00:42 | Comment(0) | TrackBack(0) | 数学 | このブログの読者になる | 更新情報をチェックする

2011年12月14日

【CentOS6.0】EPSON複合プリンタEP-801Aの純正並みInstall

 CentOS6.0では、標準でもxsaneを使えば、取り敢えずは75,300,1200,2400dpiの解像度でスキャン出来る様にはなる。でも、その作りは、Windows等でEPSONが提供している機能とは比較にならない程シンプルなので、いったいどの設定をどれだけ組合せると同じ画質に持って行けるのかが、画像処理の素人には判らないのが現実である。

 そんな場合EPSONユーザに対する救世主がアヴァシス株式会社の「Image Scan! for Linux」である。これをInstallすることで、WindowsでのSCAN操作に近いGUI操作による利用環境が整備出来る。
Image Scan! for Linux EPSON EP-801A
 残念なことにスキャン領域は逐次イメージの角から角を指定しなければならなかったりと、かったるいところもあるものの、「イメージタイプ」には当方の良く使う「カラー書類」が選択出来るし、不足なら濃度補正で影を消し元の線画の書類により近いイメージをプレビュー時にWindows環境と同じ様に対処することが出来る。解像度も50,75,96,150,200,240,300,360,400,600,720,800,1200,1600,2400,3200,4800と、ほとんど不要なくらい選択出来る様になる。インストール方法は次の通りだ。

続きを読む
posted by Mire at 17:11 | Comment(0) | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする

2011年12月05日

たけしのコマ大数学科 「数オリ予選問題」改め「数オリなでしこジャパン」

 前稿のプログラムで解いた方が楽な問題を投稿して、心に引っかかるものがあった。その数週前のお題である。前稿は恐ろしくプログラム向きのもの゛だったが、9桁の数字の順列に対する処理は、9の階乗分ありコンピュータと言えどもそんなに直ぐには解答を出すことは出来ない手合いのものである。そんな問題でも組むことは出来るので実用性は別として、コーディング時間が数分以内と言う前提ならば、数学の達人達にも太刀打ち出来そうなので、一応挑戦し掲載することにした。
 そんな問題は次の通りである。

問題:
3×3のマス目があり、1以上の9以下の整数が
それぞれ1回ずつ現れるように書くマスに1つずつ書かれている。
各列に対し、そこに書かれた3つの数のうち
2番目に大きな数にそれぞれ印をつけると
印のついた3つの数のうち2番目に大きな数が
5になる確率を求めなさい。

 但し、この問題、元の数学オリンピック予選問題は、最後の行が、確率ではなく、
5になった。そのとき、6個の整数の配置として考えられるものは何通りあるか?
と言うものであった。

 まぁ、番組的に、コマ大的に人力で解くには、1〜9の数の丁度中間値の5がそうなる場合は少なくとも9!の半分程度はありそうに素人目も思えるし、番組企画としては絵にならないからやむなしだろう。だか、しかし、プログラムでの解法としては逆に確率の方が分母の全数列のカウントも必要だし、最後に出た数字を分数としい約分する手間も増えるので、より嫌になる。
 でも愚痴っても仕方がない。約分は確かどっかでやってたので、それを流用してもいいのだし。

 さて、先ずは、条件整理をして試よう。
数字: 1〜9 が1つずつ
マス目: 3×3の9箇所
 従って、数字をマス目に埋め込むので、9の階乗とおりの数列を生成し、
マス目の各列で2番目に大きいもので、さらに2番目に大きいものが5である
ものをカウントすればよい。

 後は、それをどうコーディングするかだけだ。ハードルを下げて考えたら
大したことではない。具体的には次のコーディングとなった。



続きを読む
posted by Mire at 00:40 | Comment(0) | TrackBack(0) | 数学 | このブログの読者になる | 更新情報をチェックする

2011年12月03日

たけしのコマ大数学科 非負整数 下上2桁の数の和の平方が等しい4桁整数

 この問題はプログラムする方が余りに簡単過ぎて書くのも迷ったけれど、そんな例として掲載するのも悪くないかもと思い、ここに書留めることにする。

 先ずはお断りから、お題の「非負整数」とは、負でない整数と言うことで0以上の整数のことで、それ自体がこの問題の本質を表している訳ではないので悪しからず。さて、問題は、次の通りである。

問題: 下2桁の数と上2桁の数との和の平方と等しくなる4桁の整数は?

 この問題では4桁の整数は勿論、10進数の4桁の整数のことだろうから、各桁の数字をそれぞれ
a, b, c, dとして変数式を組めば自ずと方向性が決まってしまう。つまり、

4桁の整数 = a×1000 + b×100 + c×10 + d

ということであり、さらに、

下2桁の数 = a×10 + b
上2桁の数 = c×10 + d

となる。そうであれば、この問題の条件「4桁の整数=(下2桁の数+上2桁の数)の平方」は

a×1000 + b×100 + c×10 + d = ((a×10 + b) + (c×10 + d))の2乗

が成立し且つ、4桁の整数という条件から aは1〜9の整数であり、他は0も含む非負整数で構成される全候補に対し素直にテストすればよいだけと、プログラムの視点では極めて易しい問題である。

 例によりこれをPythonで書くと以下の通りで、書くのも実行も多分数学的に解くより早くなる。尚、今回もコーディングは誰でも分り易いことを念頭にべき乗演算子「**」やpower()関数は使っていないし、演算子の優先順位に関係なく丸括弧を多用し分り易くしているつもりだ。続きを読む
posted by Mire at 04:43 | Comment(0) | TrackBack(0) | 数学 | このブログの読者になる | 更新情報をチェックする
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2011年12月 >>
        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
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune
  • ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。