• ベストアンサー

おもしろいアルゴリズム(数学初心者

 日曜プログラマーです。 自分で使うプログラムを作っているのですが、調べる事はあっても熟考することがあまりありません。 それほどまだ難しい事ができないので、練習のため数学の簡単なアルゴリズムを教えて欲しいです。 とりあえず、作ってみたのが素数を調べるソフト。 復号できない暗号の解析するソフト。 どちらも原理としては簡単なんですが、実際作る際に頭を使いました。 プログラムの事は分からなくても、数学でおもしろい考え方や法則があれば、教えてください。 フェルマーの定理とか、何重にも複雑な方程式を解くのではなく、簡単な数式で分かりやすい結果が出るものがいいのですが。 好きなのは、ランダム(サイコロ)なんですが、ランダムでなくてもかまいません。 素数の求め方とか数学的なものから、切符の4桁の数字で10ができるかどうかとか、そう言う簡単なもので結果の分かりやすいものでお願いします。

noname#17909
noname#17909

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsumi01
  • ベストアンサー率30% (976/3185)
回答No.5

面白くないかも知れません。 (1) ゴールドバッハの予想 6以上の偶数は二つの奇素数の和で表される。これをNまで実証せよ。 まだ証明はされていませんが、かなり大きな偶数まで実証されています。 昔、プログラムを作って100までは確認しました(って、手ももできますけど)。 34=3+31、5+29、11+23、17+17 など、複数の解があるものも全部求めてください。 (2) 8人の女王 チェスを知っていないと問題の理解が困難です。チェスの女王は日本将棋の飛車と角行の動きを合わせて持ちます。チェスの盤は8×8です。盤上に女王を8人置いて、お互いに取られないように配置して下さい。

noname#17909
質問者

お礼

 「ゴールドバッハの予想」おもしろそうです。 ランダムにもかなり惹かれるけど、素数もかなり惹かれます。 『「素数」を数えて落ち着くんだ。  「素数」は1と自分の数でしか割ることのできない孤独な数字  ・・・わたしに勇気を与えてくれる。』・・・ネタです。^^; Wikipediaで調べたけど、2×10^17まで証明されているんですね。 ある程度方法は想像がつくけど、いかに早く計算できるかが難しいです。

その他の回答 (6)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.7

昔、ベーマガか何かに数独(当時はナンプレのほうが一般的だった)の解答プログラムが載っていたなぁ…… 数独の条件に ・外枠の対角線に同じ数字が入らない を加えるものもあった気が。 もうご覧になってるかもしれませんが http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0 とりあえずWikipediaでもどうぞ。

noname#17909
質問者

お礼

 あまりPCの雑誌コーナーには行かないので、プログラム系の雑誌にはそう言った初心者の練習問題もあるのかな? 数学にも少し興味があったので、あえて数学のカテゴリーで聞きました。 少し時間がかかるので、事後報告はできませんでしたが、どこかのHPで見かけたら、そのソースをみて笑ってやってください。^^ 一応、Delphiで細々と、かなり局地戦用のソフトを公開しています。 とりあえず、「素因数分解」「ゴールドバッハの予想」「数独」、そして最終的には「ライフゲーム」を自作で作りたいと思います。

  • tatsumi01
  • ベストアンサー率30% (976/3185)
回答No.6

数独を解くのはどうでしょうか。 数独はよく週刊誌のクイズ欄に載っていますが、9×9の行列(そのうちのいくつかは数字で埋まっている)で空白で残っている各要素に(1) 1~9の数字を埋め (2) どの行にも同じ数字はない (3) どの列にも同じ数字はない (4) 9個に区切った3×3の小行列のどれにも同じ数字はない という条件で解くものです。 ただ、問題を解くより、問題を作る方が難しいような気がします。もし、問題を作るプログラムができたら、ニコリに持ち込んだらいかがでしょう。 欧米では数独のファンが増えているようで、専門の雑誌も出ています。先日海外出張の際に実見しました。

noname#17909
質問者

お礼

 魔法陣みたいなものなんですかね。 問題を作るプログラム、すでにあると思いますが。 でも、人気ならHPとかで発表したら、アクセスも増えるのかな? これはこれでおもしろそうですね。

noname#20377
noname#20377
回答No.4

#1です。何か書きたくなったから戻ってきた。 有名で簡単なの・・・ ●ハノイの塔 http://web2.incl.ne.jp/yaoki/hanoi.htm ●ソート(並び替え) ●迷路からの脱出 http://www.algolab.co.jp/~lum/pcnyumon/hosoku04.htm (類題:ソフトウェア開発技術者 平成16年度午後II http://情報処理試験.jp/index-H16.html) === 各予備校で配布されているセンター試験「情報関連基礎」の第3問あたりとかのアルゴリズムもそれなりに面白かったような気もする。 ===== 少し難しくなるけど・・・ 昔どこかでトランプのアルゴリズムが載っていたな。 同じ仕組みで麻雀とかもできるかな? 定期的にユーザーはキーを入力してゲームが進んでいく #VB6時代、ぷよぷよもどき作ろうとして挫折しました。重いし(DirectDrawでFlipしてたが)何か描写がちかちかしてたしし、ユーザーのコントローラ操作を見張るタイミングも最悪で、まともにプレイできるプログラムとは言えなかったけど、考えていた時期はそれなりに面白かった。

noname#17909
質問者

お礼

>考えていた時期はそれなりに面白かった。 私も、考えるのだけは楽しいです。 Delphiでプログラムを作っているのですが、今のところグラフィカルなものを作ったことがないです。(画像ビュワーや、線画なら多少。 トランプやぷよぷよは、まだまだ難しそうです。

noname#17909
質問者

補足

迷路からの脱出、挑戦してみました。 上下左右を決める。 分岐した位置と方向を記録する。 行き止まりなら、一つ前の分岐に戻る。 ・・・ただ、図形は行き止まらないんですよね。^^; そもそも、いきなり迷路に放り込まれる訳だから、行き止まりがあるとか、どのくらいの大きさとかさえわからないんですよね? そうなると、どの分岐が行ったことがあるかどうかを調べる方法を考えないと。 そうなると、最初に分岐した所を"1"と、分岐の数を記録。1-1,1-2 1-1を進んで分岐していたら記録保存1-1-1,1-1-2、記録したら分岐"1"に戻り1-1へ。 1-2を進んで分岐していたら記録保存1-2-1,1-2-2。 1段階の分岐をすべて記録したら、1-1-1に進む。 それが分岐していたら、1-1-1-1,1-1-1-2と記録。 1-1-1に戻って、1-2-1に進む。 1-2-1-1,1-2-1-2 (もちろん、3つの分岐ならその分増やす。) 分岐を見つけたら、記録して。 新しい分岐が見つかるまで進んで、前の分岐に戻る。 これを繰り返して行ったことのない道をシラミつぶせば、出口に出られるはず。 進化の樹状分岐図のように、1段階目の分岐、2段階目の分岐、3段階目の分岐・・・・と分岐をすべて保存して、そのすべての分岐に行くってのはどうでしょう? 考えつくのに30分くらいかかったし、どういうプログラム、データー構造にしていいのかもわかりませんが。^^

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

遺伝的アルゴリズムは動作の見た目が面白いです。 選択、交叉や突然変異の方法なんか、研究してみても良いですし。 アルゴリズム入門 : 第 5 章 知識情報処理入門 http://www.microsoft.com/japan/msdn/academic/Articles/Algorithm/05/ 他にはモンテカルロ法とか、ニューラルネットワークとか。

参考URL:
http://www.microsoft.com/japan/msdn/academic/Articles/Algorithm/05/
noname#17909
質問者

お礼

「遺伝的アルゴリズム」は、おもしろそうですね。 でも、ちょっと私にはまだレベルが高いかも。^^; 私は、Delphiなんですが、クラスが今ひとつピントきてなくって。 いや、便利なのはわかるんだけど、どう使うのが本当に便利なのかと。 ありがとうございます。

  • elttac
  • ベストアンサー率70% (592/839)
回答No.2

 簡単なものがご希望のようですね。  でしたら,いくつか掲げてみますので,必要ならお調べになってみてください。 ■ 素因数分解  エラトステネスのふるいができたら,与えられた数を素因数分解してみましょう。  ひたすら素数で割っていくのですが,素数表が用意できない場合どうしますか? また,ひじょうに大きい素数を入力するとひじょうに時間がかかります。うまく短い時間で終了させる方法はないでしょうか。 ■ エジプトの分数  古代エジプトでは,分子が 1 の分数(1/2,1/3,1/4,……)しか使いませんでした。それ以外の分数は,分子が 1 の分数の和として表していました。  1 つの分数に対して,この表し方は無数に存在しますが,自明(たとえば,3/5 = 1/5 + 1/5 + 1/5)でない組み合わせ以外で,与えられた分数を「分子が 1 の分数の和」に分解する方法を調べて,プログラムとして表してみてください。 ■ 2 次方程式を解く  2 次方程式 x^2 + ax + b = 0 は,中学校で習う「解の公式」で解を求められますが,単純な方法ではうまくいきません。「虚数解」が出ることがあるからです。そこで,これを考慮して,コンピュータに 2 次方程式を解かせてみましょう。 ■ ユークリッドの互除法  No. 1 のご回答にもありますが,ユークリッドの互除法は,最大公約数を求める方法です。数学的な証明は少しややこしいのですが,機械的に最大公約数が求められるということをお試しください。 ■ ピタゴラス数  三平方の定理 x^2 + y^2 = z^2 を満たす自然数は,(3, 4, 5) の組み合わせをはじめとして無数にありますが,その中で x,y,z の最大公約数が 1 のものを原始ピタゴラス数といいます。  原始ピタゴラス数は,特定の手順で無数に生み出すことができます。その方法を調べて,プログラムで表してみてください(途中にユークリッドの互除法が使うことになると思います)。 ■ 乱数で円周率  正方形を描いて,その中に内接する円を描きます。正方形の中にばらばらと石を落としていくと,全体の「円周率 ÷ 4」の割合で,円の中に石が落ちます。  乱数で石の落ちる位置を決めて,円の中・外を判定していくと,円周率が推定できることになります。  この方法は,「モンテカルロ法」といいます。ウェブを「モンテカルロ 円周率」で調べると,問題の詳細がわかります。 ■ 最強の 2 山くずし  碁石を 2 つの山に分け,片方の山からなら好きなだけ取ってよい,ただし最後の 1 個を取ったら負け,というゲームがあります。  これは,特定の手順をコンピュータに踏ませると,最強になります(条件によってはコンピュータは無敵,そうでない条件では人間が 1 度でもヘマをしたら人間は絶対敗北)。この手順を見つけて,最強の 2 山くずしプレーヤーを作ってください。

noname#17909
質問者

お礼

 まったくの文系なので、このくらいが練習としては楽しいです。^^; 素因数分解、エジプトの分数、乱数で円周率は、興味を覚えました。 「最強の 2 山くずし」は、古畑任三郎で出た15を答えた方が負けと同じ方法かな? >うまく短い時間で終了させる方法はないでしょうか。 数学の知識&プログラム経験があまりないので、うまくとか、短時間というのが、難しいです。 考えるのは楽しいのですが、。 最終的には、楽しいLifeGameが作れると楽しいのですが、そこまではまだ修行が続きそうです。^^; ありがとうございます。

noname#20377
noname#20377
回答No.1

ダイクストラ法 http://www5e.biglobe.ne.jp/~aji/3min/ex/sup03.html 逆ポーランド記法と電卓 http://www.di.takuma-ct.ac.jp/~miyatake/open/calc/calcsimu.html ユークリッド互除法 http://www2e.biglobe.ne.jp/~tanabe/kai20.htm 敢えてソースは出していません。これは有名すぎたかなぁ・・・

noname#17909
質問者

お礼

 ソースは、自分で考えますから必要はないです。 なんだかんだで「エラトステネスのふるい」もどきも1ヶ月くらいかかりました。 ただ、あげられた2つ意味が意味が分かりません。 すいません、完全な文系なもので。^^; 最短経路決定は、変数の与え方から考えないといけないので、面倒と言えば面倒。(これは私個人のプログラム的な問題なので、こういう回答も歓迎です。 鶴亀算もよく分からないくらい、数学は素人です。 ありがとうございました。

noname#17909
質問者

補足

 ちょっと「ユークリッド互除法」じゃないけど、最大公約数の求め方について考えてみました。 約数の定義が私の中で曖昧ですが・・・。^^; a , b , c の中で一番小さい数を求めて、その数(x)で3つを割る。 3つともあまりが0でなければ、x-1で再度繰り返して。 3つが割り切れたものが最大公約数って事かな。 xが1になれば、最大公約数はなしって事で。 低レベルな(PCの処理能力を当てにした力押しの)アルゴリズムだとは思いますが、このくらいのが考えるのが楽しいのですが。^^;

関連するQ&A

  • 暗号化・復号化のアルゴリズムにはどんなものがありますか?

    Cでプログラミングを勉強しており、20文字ほどの文字列を暗号化・復号化するプログラムを考えていますが、ネットを検索しても暗号化アルゴリズムでなかなかいいものが見つかりません。 私のリクエストとしては ・暗号化対象は半角英数字、半角記号のみ。 ・単に文字コードを1つずつずらしたような簡単な暗号ではなく、複雑なアルゴリズムを使用したい。 ・アルゴリズムは複雑でもプログラムは簡潔にできるものがいい。(長くても数百行程度)。 ・アルゴリズム自体の仕様が公開されている。 ・アルゴリズムは数学式で表せるものがいい。 ・スーパーコンピュータを使わなければ解けないほど時間がかかる暗号化アルゴリズムでなくてもいい。 ・暗号化のライブラリファイルは使わず、自前で全部コードを書きたい。 ・公開鍵や秘密鍵を使わなくてもいい。 上記の条件を満たす暗号化アルゴリズムでいいものがありましたら、教えてください。 以上、よろしくお願いします。

  • RSA暗号化の方法(具体的に)

    C++で、あるファイルを暗号化するプログラムを作成しようと思っています。 暗号はRSAで、と思っていますが、どのようにすればいいのか分かりません。 暗号自体のアルゴリズムは理解しているのですが、 「具体的に」どうすればいいのか教えて欲しいのです。 「文字」とか、そういう単位がなくて、単なるディスクファイル、またはメモリ上の bit列があったときに、それをどうやって暗号化するか、また復号するか。 鍵が分かったとして、bit列のどこからどこまでを1つの単位として計算するのか。 その暗号化単位は、公開鍵だけで判断できるのか。 素数で割った余りなので、1つの数字としてみたときに素数より小さい数でないと だめなことは分かります。 もしかしたら、このようなデータの暗号化は、他のアルゴリズムを 使用した方がいいのかもしれませんが、暗号について あまり詳しくないので、どうしたらいいのか分かりません。 ネットで調べた内容では、アルゴリズムは理解できても、 対象としているデータで、実際どうやるのか分かりませんでした。 よろしくお願いします。

  • 数学?統計?最適解を求めるアルゴリズムについて

    複数のパラメータによって結果が求められる関数があるとします。 result = fx(a,b,c,d,e,f) 各パラメータの値の範囲は決まってるとします。 このときのピーク値となるパラメータの組み合わせを求めたいのですが、どのようにしたら早いでしょうか? ※結果の値は連続した曲線的なものになるとし、あるパラメーターの組み合わせで突出したピークが出るような事は無いとします。 それぞれのパラメーターを総当たりでシミュレーションして結果を求めればもちろん算出できるのですが、総パターン数が多くなると総当たり方式では時間がかかって使い物になりません。 何かいい手段・アルゴリズム・定理的なものはありませんでしょうか?

  • RSA暗号

    どのトピックかがいまいちわからないのでこのトピックに質問を載せさせて頂きます。 いま、大学の課題でRSA暗号をパソコンで実装する という課題に取り組んでいます。 2桁以上の素数を選んで、その素数から暗号化鍵と復号化鍵を選んでアスキーコードを暗号化するという初歩的なものなので、実用性は全くありませんが… プログラムはできたのですが 暗号化鍵と復号化鍵を生成して 暗号化を行って複合化を行うと 元の平文に戻らない鍵のペアがあるらしいのです。 そういうときってあるのでしょうか?

  • 数学の学術誌で日本語で投稿可能な本を御教え下さい。

    私の質問欄、冒頭の犯罪被害を立件した貰う為に【400年間の数学最難問『フェルマーの最終定理』簡易解法を東京・大阪の検察特捜部に既に入れて在ります】。1系統のみ未完成品ですが、他は【12回・計24冊も修正版の確定日付冊子を入れ続けた解法(数式部はP126)】と【2回・計4冊のみの修正版の確定日付冊子しか入れて居ないが、訂正表は3回入れれてあるし、フェルマー自身の解法だろうと憶される3通りの解法(数式部P70+資料部P20の全部でP90のもの)】は完全に完成品で、特に前者は完全に承認レベルに達している筈です(後者も訂正表込みなら次回提出で既に承認レベルに達する筈)。数学者に見て貰おうにも無視されたり、盗作されそうになったり【見て上げよう】と承諾して下さった地元数学者への紹介状も前述犯罪被害に拠って【結果的に5年間も犯人に紹介状探しまで邪魔された形】です。残る道は【数学の学術誌に投稿する】事位で、複雑な犯罪事件に巻き込まれて最中なので【虚偽鑑定を避ける為にも】学術誌に投稿する事を、今は考えて居ます。しかし検察に送付した『フェルマーの最終定理』簡易解法は何れも【日本語に拠るので】【日本語の論文でも掲載可能な、日本語の論文でも投稿可能な数学・学術誌を探しているのです】。御専門が数学他の理系で、御存知の方はどうか御教え下さいますよう、宜しくお願い申し上げます。

  • アルゴリズムプログラミング

    アルゴリズムにおいて以下のような課題が出たのですかその実行結果を出すためのソースプログラム、または実行結果をどなたか教えてください! (1)バブルソート、選択ソート、挿入ソートプログラムに対して、実行時間(小数点以下2桁まで)、比較回数、代入回数をデータ数50000、100000、150000、200000の4つの場合でそれぞれ測定せよ。ただし対象データはランダム関数SFMTを利用して作成するものとする。 (2) ヒープソート、クイックソートとマージソートプログラムの実行時間(小数点以下2桁まで)、比較回数、代入回数をデータ数50000、100000、150000、200000の4つの場合でそれぞれ測定せよ。ただし対象データはランダム関数SFMTを利用して作成するものとする。 SFMTは以下のサイトからSFMT-srcー1.3.3.zipをダウンロードして解凍する。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html#SFMT そのうち必要なファイルは sfmt.h sfmt.c sfmt-params.h sfmt-params19937.h を使用する。 どうぞよろしくお願いします。

  • 【フェルマーの最終定理】専門の数学者を御教え下さい

    早稲田大学理工学部の名誉教授・足立恒雄氏の以外に【フェルマーの最終定理】が御専門の数学者の先生を御存知ならば、どうか御教え下さい。承認の為に【私が既に発見してある簡易解法】を見て頂きたいのです。東大と東大院の数学科を出られた地元・和歌山大学の数学者・田川教授に拠ると【東大や東大院を出て居ても、専門が違うと全く判らない】のが【フェルマーの最終定理】なんだそうです。田川教授は【フェルマーの最終定理】と聞いただけで【鬼門だ】と直ぐ電話を切ったり、田川教授に何度か電話した時は、大変でした。東大や東大院の数学科を出て居ても、それ程に【震え上がる難問】なんだそうです。ところが、私は過去【7科目一括受験】時代の公認会計士試験の受験生をして居た時期が相当に永く在り、電卓が全く叩けないので受かりませんでしたが【覚える事の多い会計士試験に比べれば全くの楽勝】であって【理系大学数学の初歩を使って解いてあるので】幾ら同じ会計士試験の受験生でも【一般の文系大学卒の方々には到底、解けない】問題ですが、私は或る程度の理系大学数学を自分で勉強して知って居たので、それ程に難しい問題ではなかった次第です。私の質問欄・冒頭の質問通り、同じ慶應義塾・出身のYahoo智恵袋の職業回答者に何千件と威力・脅迫他のネット犯罪被害に遭い、現実に昨年春には母校・開成学園に脅迫状まで投函されているのですが、その犯罪被害に遭って検察特捜部に何度も修正版の解法・確定日付冊子を入れて在ると、早稲田大学・名誉教授の足立恒雄氏に説明した所、怖れて返事が来なかったので、承認に関して、他の相談できる数学者の先生を探して居る状況です。

  • 暗号化ソフトはどうしてファイルサイズを減らすの?

    前々から疑問だったので質問させてください。 最近はそれほど棚を占有しなくなりましたが、メールの暗号化ソフトについてです。 いくつかパッケージの裏を確認するのと、暗号化ソフトは同時にファイルの圧縮効果をうたっている製品ばかりでした。 昔ブルーバックスの暗号化の仕組みの本などを読んでみて大まかな暗号化の仕組みは把握したつもりなのですが、暗号化と同時にファイルのサイズが減るように見えませんでした。 どうしてこれらのソフトはファイル圧縮を行えるのでしょうか? 自分なりに考えたのは下の4つです 仮説1:暗号化の高速化のために、事前にファイルを圧縮してしまう。 暗号化自体が計算量の大きい処理なので、事前に全然別の方式で圧縮することでファイルサイズを減らして暗号化の計算量を減らす。 仮説2;私の誤解で暗号化アルゴリズムはそもそもファイル圧縮が自然におきる様なアルゴリズムである 仮説3:単純に使い勝手が良いから 普通メールを暗号化するときは手間がかから無いなら圧縮もやりたいものなので 単純にサービスとして発展していった。 仮説4:ユーザーを自社製品に囲い込むため 暗号化のアルゴリズム自体は 公開鍵暗号方式とかやり方が決まっているので、事前に自社のフォーマットに変換してから暗号化とかをして、他社製品では完全に復号でき無いようにすれば、囲い込みができるから。 いくらかわかる方いらっしゃいましたら教えていただければ幸いです

  • 数学の論文作成支援ソフト

    よろしくお願いします。数学は、微積分、ベクトル、複素数など独特の記号を使いますし、座標内の図形なども描く必要があります。当然、そういう事が可能なソフトもあると思いますが、大学生が購入可能なリーズナブルな価格で販売されていますか。

  • 不完全性定理から証明された「真理性 Ω は、ランダムである」とはどういうことですか?

    ゲーデルの不完全性定理の応用でチャイティンが、 「任意のシステム S において、そのランダム性を証明不可能なランダム数G が存在する」 という事を証明し、その後「真理性 Ω は、ランダムである。」という定理を発表したようですが、 この「真理性 Ω は、ランダムである。」とはどういう意味なのですか? 論理学も数学もほとんど無知ですが感覚的に分かるように説明して頂けませんか。よろしくお願いします。