1 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 20:42:23 ] 前スレ創設者 FeaturesOfTheGod ◆UdoWOLrsDM の言葉 >プログラム板の皆さん、こんにちは。 >無謀にもこんなスレを立ててみました。 >四則演算、初等関数、その他の関数の関数値を求めるアルゴリズムについての話をしましょう。 >人間にとって計算しやすい方法についても別途語ることにしましょう。 前スレ↓ pc8.2ch.net/test/read.cgi/tech/1090227743/
528 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:24:10 ] >>527 誰が怒っているの?
529 名前:デフォルトの名無しさん [2007/08/19(日) 03:52:13 ] >教科書とか論文 できればこれのポインタ教えてください。
530 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 07:29:10 ] >>527 B-plus-tree とか B-star-tree で検索すればいくらでも出るんだけどね。 教科書については、そんな一般的なアルゴリズムの本には あまり出てなくて、データベースよりの本を見ないとダメ。 R. Ramakrishnan, J. Gehrke, "Database Management Systems", 3rdEd. McGlaw-Hill, 2002 まあ次のサーベイ論文がよくまとまってるので、これを読んでおけば十分だろうけど。 D. Comer, "Ubiquitous B-Tree", ACM Computing Surveys, 1979 (www.cl.cam.ac.uk/~smh22/docs/ubiquitous_btree.pdf )
531 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 18:25:09 ] 便乗だけど、B木と赤黒木どっちがいいか、 って判断はどこら辺ですればいいですか? 使い分ける時の基準みたいなのが知りたい。
532 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:19:15 ] >>531 どんな用途に使おうとしてるか分からないので、普通の設定で一般的な話をする。 赤黒木は、本質的にはブロックサイズの小さな B 木なので、 あなたの質問は B 木のブロックサイズをどう選ぶか、という質問と同じ。 普通の実装では、n 個の要素を格納するブロックサイズが b の B 木から 要素を検索には O(log (n/b)) 回の木上の探索(ランダムアクセス)と O(b) 回のブロック内の探索(シーケンシャルアクセス)が必要となる。 ここで雑な計算をするとブロックサイズは、木上の探索の速度と ブロック内の探索の速度の比くらいに選ぶのがよいことが分かる。 木が丸ごと全部メモリに乗るような場合は、木のアクセスもブロックの アクセスも同じくらいなので、ブロックサイズも小さく選ぶのが良い。 一方、ハードディスクやネットワーク上のデータベースのような 木のアクセスが遅く、ブロックのアクセスが早い場合は、 ブロックサイズも大きく選ぶのが良い。
533 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:50:28 ] >>528 参考にすんな→この人怒ってる怖いよぉ
534 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 19:54:51 ] どこぞの園児じゃあるまいし。
535 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 21:04:07 ] なんでそんな偉そうなんですか
536 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 21:04:43 ] どこが偉そうなの
537 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 21:37:32 ] 質問を質問で返すな わかりませんと言え
538 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 21:40:56 ] なんでそんな偉そうなの
539 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 21:41:29 ] そういうのは質問の体をなしてから言え
540 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 22:26:02 ] 順序付きコンテナは、どうもトライが最強っぽいんだけど、 メモリが・・ なんとかなりませんか?
541 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 22:59:51 ] つ パトリシア
542 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 05:58:02 ] 2Dの多角形ポリゴン2個(n個)を合成して1個(?)の多角形にするアルゴリズム ネット上にこれを実装したソースコードが公開されてない(見つからない・・・)のでどなたか教えてください。 __ _|_ | | |_|_| |__| ポリゴン1 = (0,0)-(2,0)-(2,2)-(0,2)-(0,0) ポリゴン2 = (1,1)-(3,1)-(3,3)-(1,3)-(1,1) ↓ __ _| | | _| |__| ポリゴン1+2 = (0,0)-(2,0)-(2,1)-(3,1)-(3,3)-(1,3)-(1,2)-(0,2)-(0,0) というような感じです。 中抜き( 合成後のポリゴンの内側に穴が開いている )まで考えると、結構むずかしそうで・・・ これでやりたいことは、国土地理院の市町村別のポリゴンデータを県ごとに合成して、県別のポリゴンデータにすることです。 Excel VBAで精細な都道府県地図を描きたいなーと思って、 都道府県の無料のポリゴンデータを探したけど市町村別しか見つからなかったので じゃあ合成して作ろうか、と思ってたんですが・・・詰まりました。 Java の awt パッケージでポリゴンの合成をしているクラスのオリジナルのソースコードを見ればアルゴリズムがわかるかも とも思ってみてみたけどソースコードは入っておらず・・・orz 宿題とか課題とかではなくて、あくまで趣味的なものなので急ぎません。 VBでもcでもc++でも良いので、どなたか、お知恵を拝借させてください。
543 名前:542 mailto:sage [2007/08/28(火) 06:00:14 ] >>542 図形ずれちゃった・・・ __ _|_ | | |_|_| |__| ポリゴン1 = (0,0)-(2,0)-(2,2)-(0,2)-(0,0) ポリゴン2 = (1,1)-(3,1)-(3,3)-(1,3)-(1,1) ↓ __ _| | | _| |_| ポリゴン1+2 = (0,0)-(2,0)-(2,1)-(3,1)-(3,3)-(1,3)-(1,2)-(0,2)-(0,0) こうです。
544 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 09:44:30 ] >542 悪いこと言わないから別の方法考えたほうがいいと思う。 塗り分けるだけなら市町村別のデータでも構わないわけだし。 で、 コンピュータ・ジオメトリ―計算幾何学:アルゴリズムと応用 ISBN 476490277X の第 2 章にアルゴリズムは載ってる。でも、ここから実装まで持っていくのもそう単純じゃないと思う。 あと、オープンソースライブラリの CGAL にそういう機能はある。 www.cgal.org/ Reference Manual の VI Polygon and Polyhedron Operations 辺り。
545 名前:542 mailto:sage [2007/08/28(火) 21:33:57 ] >>544 コンピュータ・ジオメトリ―計算幾何学:アルゴリズムと応用 ISBN 476490277Xの第2章 早速読んできました。 例題に挙げられてるのも地図でよさそうだったけど、 プログラミング言語を限定してないアルゴリズムとしての本なんで、 やろうとしていることを実装するには、どういうプログラムを書けばよいのかまでは踏み込めなそうです。 せめて i ← S1 と S2 の交点 みたいなのがあればなぁ。 CGALのマニュアルも読んでみました。joinあたりのコードか数式が出ていればVBAでも実装できそうなんですが・・・ >悪いこと言わないから別の方法考えたほうがいいと思う。 そうですねー。 ただ、ポリゴンをくっつけるのはもうちょっと粘ってみます。考えるのも楽しいので。 市町村同士は重ならないので、 ・辺と辺が重なっている(隣り合っている)ところを見つけてくっつけていく ・中抜きはこの際無視 というように簡単なものを作る方針で考えてみます。 重なりまで考えて汎用的なアルゴリズムにしようと思ったけど、結構しんどそうですので・・・ どうもありがとうございましたー。
546 名前:デフォルトの名無しさん [2007/08/29(水) 01:21:12 ] 今日から専門学校のほうで授業アルゴリズムが始まったんですが 時間計算 分時間を入力して○時○分に変換して出力するフローのaとbに該当する処理を記述しなさい。 なお、計算結果は整数部のみとし、小数部は切捨てとなる。 余り(X%Y)で除数の余りを求めることができる。[例、余り(100%3)は1となる] 例:117分の時 1時間57分 (開 始) 何方かa bに入る答えがわかる方いましたら教えてください ↓ (データ)・・分時間を入力 ↓ (処理)・・a 時を求める ↓ (データ)・・時を出力 ↓ (処理)・・b 残りの分を求める ↓ (データ)・・分を出力 ↓ (終了)
547 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:28:01 ] aとbに入るのは数字?式?言葉?
548 名前:デフォルトの名無しさん [2007/08/29(水) 01:39:28 ] 式です^^;
549 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:54:03 ] a・・・分時間/60 b・・・分時間%60
550 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 03:31:39 ] >>546 宿題はスレ違い しかも回答もらって礼も無しかよ
551 名前:デフォルトの名無しさん [2007/08/29(水) 19:38:32 ] 三角関数はマクローリン展開して計算しますよね。 単純に考えればsinθのθが何であれ計算時間は変わりませんが、 速度面でチューニングが施されているであろうライブラリではどうなんでしょう?
552 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:22:57 ] >三角関数はマクローリン展開して計算しますよね。 ここで間違ってる 関数近似の教科書読むべし
553 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:30:11 ] >>552 すみません、悠長に教科書読んでる暇がないので結論をお願いします
554 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:36:55 ] CPUのアーキテクチャ等やライブラリ作った奴の腕に依存して色々な可能性がある ただ,どれもθを0〜π/2の範囲に正規化してるだろうから その範囲なら少し速いはず これ以上は本嫁
555 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 01:07:36 ] ぶっちゃけ、今時の単精度演算アクセラレータはテーブル参照プラスリニア補間で済ませている希ガス。
556 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 07:24:15 ] >>554 絶対的な速度が問題なのではなく、速度のむらを気にしているのです。 たとえばsin(0.1)を計算するのに1μsかかったとして、sin(0.2)では5μsかかったりするのか?ということです >>555 ターゲットはマイコンなのでそういう容量食いな方法は取らないような気がします。 ターゲットはSH7145 ルネサスのコンパイラを使ってます。 ただ、ピンポイントでこのコンパイラに通じている方がいるとは考えにくいので VCやgccだったらどうなのかという意見でもいいのでお願いします。
557 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 09:28:07 ] 後出し多いな
558 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 10:04:11 ] 5倍の差はないだろうけど,1〜2割位なら充分あり得る 実測するのが手っ取り早いかと
559 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 17:45:37 ] >>556 マイコンの方がむしろテーブル変換使用すると思うが
560 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 17:47:40 ] >>554 いっそπ/8に正規化するとか
561 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:05:26 ] >>553 >悠長に教科書読んでる暇がないので そうか。残念だったな。
562 名前:デフォルトの名無しさん [2007/09/12(水) 02:03:16 ] 差異のアルゴリズムでレーベンシュタイン距離を求めていますが、 結局これ求めてどうなるんですか? 馬鹿でも分かるようにく教えてください。
563 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 08:42:09 ] >>562 そんな限られた分野でしか使わないようなものを さも誰もが知ってるかのように聞かなくても。 自然言語処理とかで使う。 Google 先生とかがよくやってる もしかして: ○○ を出したりとかに使える。
564 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 00:02:29 ] >563 レスどうも。 2つの文字列を比較して"n文字違います"とかは想像できるんだけど、 diffみたいに異なるものを表示するとかの処理にはどうやって組めばいいんだろうと思って、、、
565 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 00:05:36 ] >>564 ja.wikipedia.org/wiki/Diff
566 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 23:51:51 ] 今、ロバスト解について勉強しています。 ロバスト解発見手法にはシックスシグマ法のDesign For Six Sigma[Brue 03]やDesign For Multi-Objective Six Sigma[Shimoyama 06]、またはガウスノイズがあるということが分かりました。 しかし、上に述べた手法の利点・欠点がほとんど分かりません。 どなたか他の手法と比べた場合の利点・欠点を教えてはいただけないでしょうか? 下に今分かっていることを書きます。 ---------------------------------------------------------------------- Design For Six Sigma[Brue 03] ロバスト解を1つ発見する場合に有効。 Design For Multi-Objective Six Sigma[Shimoyama 06] Design For Six Sigma[Brue 03]を拡張したもの。複数のロバスト解を同時に発見する場合に有効。 ガウスノイズ アルゴリズムは簡単。 ガウスノイズは上に述べたシックスシグマ法を使ったときよりもすばやく収束できる。 吸収現象などのせいでロバスト解からずれた位置に収束するかもしれない。
567 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 03:20:29 ] 質問させてください. y=Ax (x,y:ベクトル, A:マトリックス,大きさ数百〜数万) に対し, x = inv(A) * y を解く問題を考えています. ここで,逆行列演算inv(A)がO(N^3)のコストが掛かり,ネックになっています. いま,Aは疎な帯行列(しかも対称)という条件があるので, 大幅な計算削減ができるのではないか?と考えております. 例えば,計算コストをO(N^2)にするといったことは可能でしょうか? キーワードだけでも良いので,知恵を貸していただけると幸いです.
568 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 03:49:22 ] つ[特異値分解]
569 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 07:22:57 ] >>567 LU使っているのか? 対称行列だと、LDL分解でOK 帯行列だとさらに、0要素を見ないことで、さらにスピードアップ
570 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 17:36:11 ] そんな話,数値計算の本見ればいくらでも載ってるだろ
571 名前:567 mailto:sage [2007/09/20(木) 01:53:07 ] >>568 キーワードありがとうございます! 調べてみます. >>569 LU分解→直接法で逆行列としていました. LDL分解というものがあるのですね. 解法は反復法に持って行くのですかね・・・調べてみようと思います. 反復法は精度の面が少し気になりますが,勉強含めて試してみます. 多謝! >>570 数値計算の門外漢なもので・・・勉強してきます.
572 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 22:11:26 ] kd木で、近い領域を何度も連続して調べたい時、毎回根から辿らないようにショートカットするような技法ってありますか?
573 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 09:44:52 ] 二つの整列済みリストのマージで 要素数が一方がk個,もう一方が2個の場合, n回の比較でマージできる最大のkをanとすると a[n] = [sqrt(2*a[n-1]*(a[n-1]+1))] # []: Gauss記号 で与えられるらしいのですが これがどういうアルゴリズムでマージしたときの物なのか, またこれが最良値なのか知りたいのですが, 誰か知りません?
574 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 14:28:02 ] >>573 a[n] = [sqrt(2*a[n-1]*(a[n-1]+1))] # []: Gauss記号 この式を見るとnが1増えると√2倍でa[n]は指数的な増加。 ソート済みk個と2個のマージは 2分探索を2回使えば2logk回。 詳しくは見てないが、2logkの係数の2が√2になりそうだし、 kが指数的に増加して比較回数が線形増加もa[n]の式とオーダーは合っている。
575 名前:573 [2007/09/30(日) 13:03:48 ] >>574 考えてくれてありがとう. 2分探索だけだと最良値にはならないみたい. 573の式だと最初の10個位までは最良値になってるのは 確認できた(虱潰しで) さらに知らべて,もう一方のリストが3個の場合みっけた. Optimal Merging of 3 Elements with n Elements っていう論文のAbstructで f3(1)=0, f3(2)=1, f3(3)=1, f3(4)=2, f3(5)=3, f3(6)=4, f3(7)=6, f3(8)=8 r >= 3 f3(3r) = [(43/7)*2**(r-2)]-2 f3(3r+1) = [(107/7)*2**(r-3)]-2 f3(3r+2) = [17*(2**(r-3)-6)/7]-1 との事.
576 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 01:16:41 ] 各データの値がかなり近い時に ハッシュのみだとデータの衝突回数 多い場合ってどうやってみんななら解決する? あとね、kd木で何の本に詳しく載ってますか?
577 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 01:55:31 ] 値近くてハッシュが衝突するって、どんなアルゴリズムだよ
578 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:27:51 ] 8byteの16進データを 完全ハッシュ化するソースコード置いてある とこないですか?
579 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 21:09:37 ] 区分サンプリング法やラテン超方格法のアルゴリズムを教えてください。
580 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 05:05:51 ] 二点で定義されてる直線上に、ある点があるかどうかを判定するにはどうすればいいですか、教えてください。
581 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 06:17:51 ] 要は3点が一直線に並んでいるかを知りたい、と解釈し直してみた。 1点を基準に他2点へ直線を引くときの傾きが一緒だったらOK。 x軸と垂直だった場合なんかも考慮すると、 (x1-x0)*(y2-y0)==(x2-x0)*(y1-y0)
582 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 13:05:52 ] あ、なるほど、ありがとうございます
583 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 21:54:02 ] [N][N]の2次元配列を3つ [N]の配列を2つ使ってる場合の使用領域のオーダーってO(n^2)におさまります?
584 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 22:02:42 ] うん
585 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 21:31:14 ] 3N^2+2N = O(N^2) が分かってないのか?
586 名前:デフォルトの名無しさん [2007/12/14(金) 13:42:55 ] グレブナ基底を求めるプログラム、誰か持っていませんか? C言語でおねがいしたいです。
587 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 02:12:22 ] >>586 23457円になります。
588 名前:デフォルトの名無しさん [2007/12/29(土) 03:46:49 ] 均一なセル上に分割した空間で、円(または球)を配置して、円と交差する セルを全て見つけたいのですが、どうしたら効率よく求まるでしょう?
589 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 06:33:27 ] セルってのはよくわからないのだが、格子なの? 格子が座標と平行になるように回転変換して 格子間隔が1になるように伸縮して 円の中心座標の小数点以下座標を見ればいいだけでは?
590 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 07:51:56 ] あ、格子です。あ、最初から座標軸並行を仮定してます。 さらに辺の長さを1で仮定してしまいましょか。 えーと意味がいまいちつかめないんですが、 >格子が座標と平行になるように回転変換、格子間隔が1になるように伸縮 これは元々が単位格子であるなら何もしないでOK? >円の中心座標の小数点以下座標 これで、なぜ全ての格子が求まるかがわかりません。 整数部をみれば、中心を含む格子は求まると思いますが。
591 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:33:11 ] 欲しいのは「円周」と交わるセルだろ? そこがちゃんと書いてないから勘違いされたと思われ
592 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 17:06:31 ] あ、そうです。申し訳ない。
593 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 12:13:13 ] DDA(digital diffrential analyzer)というのがあるが使えないかな? 3次元は分からんが
594 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 12:39:28 ] 3次元も、半径が違う円で切り出したものと考えればイケルんじゃないの?
595 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:56:42 ] ある年月日が与えられ、そのn日後の日付を求めたいのですが、 1,fairfieldの公式で西暦1年1月0日からの経過日数daysを求める 2,days+nを西暦年月日に変換する という方法を考えました。 2は1の式を変形して解けるだろうと見当を付けていましたが、 小数点以下を切り捨てたりしているためうまく式を求められません。 素直に最初の日付にnを足し、年・月に順次繰り上げていくほうが賢明でしょうか? 日付は最近のものに限定して考えています。 ユリウス暦とグレゴリオ暦の判断が面倒になるので…
596 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 08:25:44 ] >>595 日付を1日進めるプログラムは書けるかい? おk。ならば、1日進める部分をn回実行するんだ。
597 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 08:49:10 ] つーか、なんで既存ライブラリを使わないのだろう。 大抵の言語に日付け処理系の関数があると言うのに。
598 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 11:47:35 ] >>595 ttp://ufcpp.net/study/algorithm/o_days.html
599 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:25:41 ] >>595 ちょっと検索してみたらこんなのがあった delphiだけど、c言語に変換するのはこどもあそびにひとしい ttp://kwikwi.cocolog-nifty.com/blog/2005/12/delphi_266f.html ところで前々から思ってたんだけど、fairfieldの公式って誰が考案したの? 日本のサイトしか引っかからないんだよね
600 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:29:16 ] >>596 なるほど。 ただ、(情報が小出しになってすみません)n日前の日付も求められるようにしたいので 上に書いたような方法だとdays+nを-に変えるだけで実現できるかなーと・・・ >>597 Cなのでそういった関数はもちろんあるのですが、若干不便なので 勉強も兼ねて自前で実装してみようというわけです。
601 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:51:11 ] >>598 おおお÷4を右シフト演算できるのは考えが及んでませんでした >>599 (mjd - 15078.2) / 365.25 …? もはや何がなんだか。 ttp://cl.is.kyushu-u.ac.jp/Literacy/PP/H14/adp/program/date.html こんなの見つけたので読んできます。
602 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:18:34 ] >>600 ttp://www.tensyo.com/urame/date/day_c.shm ここの int YMD_AddD(int *Y,char *M,char *D,long d) って関数を見ると 負数を渡した場合は 400年循環を使って正に直せばいいみたい。
603 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 10:28:35 ] つまり、-3日なら 400年前から(146097-3)日後と計算するわけか
604 名前:デフォルトの名無しさん [2008/01/02(水) 02:09:27 ] 除算のシフト演算化はコンパイラの最適化段階で 自動でやってくれるものだと思ってたんだが、そうでもない?
605 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 08:29:27 ] コンパイラの性能がソレなりならって事でしょう。 固定値の除算ならさらに、掛け算で代用してくれるのも多いね。
606 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 10:22:11 ] >>604 2のべきの定数ならね。
607 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 12:18:44 ] という事で 1、カレンダを1日進める関数関数を作る 2、+N日は1の関数をN回呼ぶ 3、-N日は、年数を400日戻してから、146097-N回 1の関数を呼ぶ
608 名前:595 mailto:sage [2008/01/02(水) 20:05:17 ] これでいいのかな? struct Date{ int year,month,day; }; /* 1日進める */ void tomorrow(Date& x) { int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; if((x.year%4==0 && x.year%100!=0) || x.year%400==0){ days[2]++; } x.day++; if(x.day>days[x.month]){ x.day=1; x.month++; } if(x.month>12){ x.month=1; x.year++; } }
609 名前:595 mailto:sage [2008/01/02(水) 20:06:50 ] /* n日後の日付 */ Date after(Date x,int n) { for(int i=0;i<n;i++){ tomorrow(x); } return x; } /* n日前の日付 */ Date before(Date x,int n) { n=146097-n; for(int i=0;i<n;i++){ tomorrow(x); } x.year-=400; return x; }
610 名前:595 mailto:sage [2008/01/02(水) 20:39:23 ] 「1にちずつ遡りながら日付を表示」とかやるとbefore()の処理量が馬鹿にならないので、 >>601 に載ってるのを参考に書き換えてみました /* 西暦1年1月0日からの経過日数から、日付を求める */ Date make_date(int n) { int y=(n+305)/146097*400 +(n+305)%146097/36524*100 +(n+305)%146097%36524/1461*4 +(n+305)%146097%36524%1461/365; int diff=n-(365*(y-1)+y/4-y/100+y/400+31+28); // 3月0日からの経過日数 if(diff==0){ //2月29日 diff=366; y--; } int m; for(m=3;;m++){ //3月0日からm月0日までの経過日数, 30*(m-3)+3*(m+1)/5-2 の変形 if(153*(m+1)/5-122<diff && diff<=153*(m+2)/5-122){ break; } } int d=diff-(153*(m+1)/5-122); if(m>12){ m-=12; y++; } Date x={y,m,d}; return x; }
611 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 03:16:56 ] 漸近的上界とか下界っての何なの締め切り明後日\(^o^)/オワタ
612 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 03:17:24 ] 誤爆です。 ごめんなさい
613 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 13:01:23 ] >>611 そのまんまの意味じゃなーの。 f(x)=sin xで1,-1は明らかに漸近的ではないが g(x)=1/x(x≥0)で0は漸近的。
614 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:18:07 ] 質問させてください。 「ハッカーのたのしみ」p137 で多倍長のかけ算のサンプルがあったのですが、 わからない部分があります。 void mulmns( unsigned short w[], unsigned short u[], unsigned short v[], int m, int n ) { unsigned int k, t, b; int i, j; for( i = 0; i < m; i++ ) { w[ i ] = 0; } for( j = 0; j < n; j++ ) { k = 0; for( i = 0; i < m; i++ ) { t = u[i] * v[j] + w[ i + j ] + k; w[ i + j ] = t; k = t >> 16; } w[ j + m ] = k; } } u と v がかける数、かけられる数、w に結果が入ることはわかるのですが、k は何に使われているんでしょうか?
615 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:31:46 ] 繰り上がり
616 名前:614 mailto:sage [2008/02/09(土) 20:41:09 ] >>615 すばやい回答ありがとうございます。 くりあがりですね。 このプログラムの結果って、w に short で表せる数を法としたそれぞれの桁が入ると思うんですけど、 この理解で合っていますか?10 進数で表示したいときには変換するルーチンも別に必要でしょうか?
617 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:44:43 ] >>616 そのとおり。 10進数で画面に表示する回数が、普通の計算を行う回数よりも 圧倒的に少ないと考えると、そういう数の表現になる。
618 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 16:13:21 ] w[ i + j ] = t; k = t >> 16; この部分を k = t/10; t -=k*10; w[ i + j ] = t; とすれば、10進法になるんじゃない? 8bitなら100進数 16bitなら10000進数なんてのがオススメだよ
619 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:37:33 ] HLISP だっけ,32 bit int 使って radix 10^8 で多倍長整数実装してた
620 名前:デフォルトの名無しさん [2008/02/18(月) 17:15:48 ] 行列計算するときに、掃き出し法、ガウスザイデル法、SOR法、等ありますが、 調べると掃き出し法は他の計算方法に比べると誤差が大きいと書いてありました。 なぜ誤差が大きくなるのでしょうか?
621 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:15:28 ] 誤差についてはほとんど知識がないので調べてみました。 たまたま今やっていることに関係あるので。 さて、分かったことは小数演算は必ず誤差を含むと言ってもいいこと。 なので、10^n倍で整数に変換したり、ライブラリを使ったり対策を しなければいけないこと。まぁ大体こんな感じです。 ではなぜ掃き出し法が誤差が大きいかというと、予測ですが 単純に計算量が他に比べて多いからではないでしょうか。 誤差を含む演算はやればやるほど誤差が大きくなるというわけです。 ちゃんとした理由ではないかもしれませんが、それよりも どうすれば誤差を小さくできるか考えた法がいいと思います。 まぁ原因が分からなくては始まりませんが。
622 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:42:00 ] >>621 そんなに詳しくないから適当に書くけど、 基本的にはその通り。 収束性が悪いほど誤差は積もりやすい。 あと、除算があると誤差大きくなる。 なので、掃き出し法みたいな手計算的手法のものよりも、 ガウスザイデル法みたいな反復計算の方が誤差少ない。
623 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 02:13:06 ] >>620 一概にそうとは言えない。というか、単純に比べることは不適当。 そもそも掃き出しは(解けるならば)必ず A x = b を解くが、 ガウスザイデル、SOR は特殊な A に対してしか一次方程式を解かない。 したがって、無条件で比較することはできない。 次に、生じる誤差が違う。掃き出し法は直接解法なので、考える誤差は丸め誤差のみ。 一方のガウスザイデル、SORは反復解法なので考える誤差は丸め誤差と打切り誤差。 反復法の打切り誤差をどの程度に設定するかということを述べないと、比較はできない。
624 名前:デフォルトの名無しさん [2008/02/19(火) 13:21:15 ] >>623 掃き出しで解けるものでもガウスザイデル、SORで解けないものもあるということでしょうか? 新たな課題ですね( ̄□ ̄;)!! 実は、エクセルマクロで書いた掃き出し法で計算した回帰分析と、 エクセルの分析ツールの回帰分析した結果、 後者の方が精度がよかったので分析ツールの回帰分析は別のアルゴリズムなのかなと考え調べていました。 後者はガウスザイデルなのかもしれません。
625 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:20:26 ] >>624 マクロでやってるなら、ピボットの選択してる?
626 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 18:31:45 ] >>624 掃き出しで解けてガウスザイデルで解けない問題なんて いくらでもあるよ.たとえば x + 2 y = 1 2 x + y = 1 をこの順番で連立方程式と考え,ガウスザイデルを 初期値 x = 0, y = 0 で適用すると,発散する. ガウスザイデルが収束する必要十分条件は,未解決のはず.
627 名前:デフォルトの名無しさん [2008/02/21(木) 22:41:32 ] >>625 > マクロでやってるなら、ピボットの選択してる? いえ、まず中心をすべて1にしてから掃き出しています。 これではダメでしょうか?
628 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:59:46 ] >>627 ダメ