コンピュータサイエンス

コンピュータサイエンスの学生、研究者、実務家のためのQ&A

3
メルセンヌツイスターはなぜ良いと見なされているのですか?
メルセンヌツイスターは広く良いとみなされています。ちなみに、CPythonのソースによると、「現存する最も広範囲にテストされたジェネレーターの1つです」しかし、これはどういう意味ですか?このジェネレーターのプロパティをリストするように求められたとき、私が提供できるもののほとんどは悪いです: それは大規模で柔軟性がありません(例:シークなしまたは複数のストリーム)。 巨大な状態サイズにもかかわらず、標準的な統計テストに失敗し、 0付近に重大な問題があり、ランダム化がかなり不十分であることを示唆しています。 速くない 等々。XorShift *のような単純なRNGと比較すると、それは絶望的にも複雑です。 それで、なぜこれが良いと考えられたのかについての情報を探しました。オリジナルの論文は、「超天文学」期間と623次元の均等分布について多くのコメントを述べています。 多くの既知の尺度の中で、スペクトルテスト(Knuth [1981]を参照)や以下に説明するk分布テストなど、より高い次元の均一性に基づくテストが最も強いと考えられています。 ただし、このプロパティの場合、ジェネレーターは十分な長さのカウンターで叩かれます!これは、ジェネレーターで実際に気にしているローカル分布の解説を行いません(ただし、「ローカル」はさまざまなことを意味します)。そして、CSPRNGでさえ、それほど重要ではないので、このような長い期間は気にしません。 論文には多くの数学がありますが、私が知る限り、実際にはランダム性の品質に関するものはほとんどありません。そのほとんどすべての言及は、これらの元々の、ほとんど役に立たない主張にすぐに戻ります。 古い、より信頼性の高い技術を犠牲にして、人々はこの時流に飛び乗ったようです。たとえば、LCGの単語数を3(Mersenne Twisterの「たった624」よりもはるかに少ない)に増やし、各パスで上位の単語を出力すると、BigCrush(TestU01テストスイートのより難しい部分)を通過します)、ツイスターが失敗したにもかかわらず(PCG論文、図2)。これと、メルセンヌツイスターを支持して見つけることができた弱い証拠を考えると、他の選択肢よりも注目を集めたのは何ですか? これも純粋に歴史的なものではありません。メルセンヌツイスターは、実際には、少なくともPCGランダムよりも実際に証明されていると言われています。しかし、ユースケースは私たちの一連のテストよりも優れているほど識別力がありますか?一部のグーグルは、おそらくそうではないと示唆しています。 要するに、メルセンヌツイスターは、その歴史的背景とその他の両方において、どのようにして広く肯定的な評判を得たのだろうかと思っています。一方で私は明らかにその性質に懐疑的ですが、他方では、それが完全にランダムに発生したことを想像するのは困難です。

7
PRNGを使用して魔法のように圧縮できますか?
この考えは、プログラミングを学び、最初にPRNGに出会った子供として私に思いつきました。どれほど現実的かはまだわかりませんが、今ではスタック交換があります。 これは驚くべき圧縮アルゴリズムのための14歳のスキームです: PRNG sを取得し、シードでシードして、疑似ランダムバイトの長いシーケンスを取得します。そのシーケンスを別のパーティに送信するには、PRNGの説明、適切なシード、およびメッセージの長さを伝えるだけです。十分に長いシーケンスの場合、その説明はシーケンス自体よりもはるかに短くなります。 ここで、プロセスを逆にできると仮定します。十分な時間と計算リソースがあれば、ブルートフォース検索を実行して、目的のシーケンスを生成するシード(およびPRNG、つまりプログラム)を見つけることができました(猫のいたずらの面白い写真を見てみましょう)。 PRNGは十分な数のビットが生成された後に繰り返されますが、「典型的な」サイクルと比較すると、私のメッセージは非常に短いので、これは問題のようには見えません。 Voila、データを圧縮する効果的な(ルーベゴールドバーグ式の場合)方法。 したがって、仮定: 圧縮したいシーケンスは有限であり、事前にわかっています。 現金も時間も不足していません(両方の有限量が必要である限り) 知りたい: スキームの背後にある推論に根本的な欠陥はありますか? この種の思考実験を分析する標準的な方法は何ですか? 概要 良い答えが答えを明らかにするだけでなく、私が本当に求めていたのは何であるかを明らかにすることはしばしばあります。皆の忍耐と詳細な回答に感謝します。 答えの要約に対する私のn回目の試みは次のとおりです。 PRNG /シード角度は何も寄与せず、目的のシーケンスを出力として生成するプログラムにすぎません。 ピジョンホールの原則:長さ<= kの(メッセージを生成する)プログラムよりも、長さ> kのメッセージが多くあります。そのため、一部のシーケンスは、メッセージよりも短いプログラムの出力にはなり得ません。 プログラム(メッセージ)のインタープリターが必ず事前に修正されていることに言及する価値があります。そして、その設計は、長さkのメッセージが受信されたときに生成できるメッセージの(小さな)サブセットを決定します。 この時点で、元のPRNGのアイデアはすでに消滅していますが、解決すべき最後の質問が少なくとも1つあります。 Q:幸運にも、長い(しかし有限の)メッセージがたまたま<kビットの長さのプログラムの出力であることがわかりますか? 厳密に言えば、可能性のあるすべてのメッセージ(プログラム)の意味を事前に知っておく必要があるため、偶然ではありません。それは <kビットのメッセージの意味であるかそうでないかです。 > = kビットのランダムメッセージをランダムに選択した場合(なぜですか?)、いずれの場合でも、kビット未満で送信できる確率はゼロになり、送信できないことはほぼ確実になります。使用するビット数はkビット未満です。 OTOH、kビット未満のプログラムの出力であるメッセージからkビット以上の特定のメッセージを選択すると(そのようなメッセージがあると仮定して)、実際にはすでに送信されたビットを利用していますレシーバー(インタープリターの設計)。転送されたメッセージの一部としてカウントされます。 最後に: Q:このエントロピー / コルモゴロフ複雑性ビジネスとは何ですか? 最終的に、両方とも、(より単純な)鳩の巣の原理が圧縮できる量について教えているのと同じことを教えてくれます:おそらくまったくない、おそらくいくつかですが、確かに私たちが空想するほどではありません(チートしない限り)。

6
非対称遅延のあるネットワークでのクロック同期
コンピューターに初期化されていない正確なクロックがあると仮定します。つまり、コンピューターの時計の時刻は、リアルタイムに一定のオフセットを加えたものです。コンピューターにはネットワーク接続があり、その接続を使用して定数オフセットを決定します。BBB 簡単な方法は、コンピューターがタイムサーバーにクエリを送信し、現地時間です。タイムサーバは、一度にクエリを受信と含む応答送信時間でそれを受けて、クライアントに戻って。次に、、つまりです。 T T B + C 2 B + C 1 ≤ T ≤ B + C 2 T - C 2 ≤ B ≤ T - C 1B + C1B+C1B + C_1TTTTTTB + C2B+C2B + C_2B + C1≤ T≤ B + C2B+C1≤T≤B+C2B + C_1 \le T \le B …

3
関数型言語のアルゴリズムの複雑さはどのようにモデル化されますか?
アルゴリズムの複雑さは、下位レベルの詳細に依存しないように設計されていますが、命令型モデルに基づいています。たとえば、ツリー内のノードへの配列アクセスや変更にはO(1)時間かかります。これは、純粋な関数型言語では当てはまりません。Haskellリストへのアクセスには直線的な時間がかかります。ツリー内のノードを変更するには、ツリーの新しいコピーを作成する必要があります。 次に、関数型言語のアルゴリズムの複雑さの代替モデリングが必要ですか?

8
プログラミング言語の「速度」を決定するものは何ですか?
プログラムが2つの異なる言語で記述されているとします。それらを言語Xと言語Yとします。コンパイラーが同じバイトコードを生成する場合、なぜ言語Yの代わりに言語Xを使用する必要がありますか?1つの言語が他の言語よりも高速であることを定義するものは何ですか? 「Cが最も速い言語であり、ATSはCと同じくらい速い言語である」というようなことを人々がよく目にするので、これを尋ねます。プログラミング言語の「高速」の定義を理解しようとしていました。

3
素因数乗算よりも効率的な階乗アルゴリズム
繰り返しと再帰の両方を使用して階乗をコーディングする方法を知っています(n * factorial(n-1)たとえば)。教科書を読んで(詳細な説明はありません)、階乗を半分に再帰的に分割することで、階乗をコーディングするさらに効率的な方法があることを読みました。 なぜそうなるのか理解しています。しかし、私は自分でそれをコーディングしてみたかったのですが、どこから始めればいいのかわかりません。友人は、私が最初にベースケースを書くよう提案しました。数値を追跡できるように配列を使用することを考えていましたが、そのようなコードを設計する方法が実際にはわかりません。 どのようなテクニックを研究すべきですか?

2
ライスの定理が当惑
要約:ライスの定理によれば、すべては不可能です。それでも、私はこの不可能と思われることを常にやっています! もちろん、ライスの定理は単に「すべては不可能」とは言いません。「コンピュータープログラムのすべての特性は計算不可能です。」 (ヘアを分割したい場合は、すべての「重要な」プロパティ。つまり、すべてのプログラムが所有する、またはプログラムが所有しないプロパティは、簡単に計算できます。しかし、他のプロパティは計算できません。) それは定理が言うこと、または言うように見えます。そして、おそらく非常に多くの非常に賢い人々がこの定理の正しさを慎重に検証したでしょう。しかし、ロジックを完全に無視しているようです!計算するのは簡単なプログラムの多くのプロパティがあります!! 例えば: 停止する前にプログラムは何ステップ実行しますか?この数が有限であるか無限であるかを決定することは、計算できないホールティング問題です。この数が有限のより大きいか小さいかを判断するのは簡単です!プログラムを最大ステップ実行し、停止するかどうかを確認します。簡単!nnnnnnn 同様に、プログラムは最初の回実行ステップでユニットより多いまたは少ないメモリを使用しますか?簡単に計算できます。mnnnmmm プログラムのテキストはという名前の変数に言及していますか?些細なテキスト分析で答えが明らかになります。kkk プログラムはコマンド呼び出しますか?再度、そのコマンド名を探してプログラムテキストをスキャンします。σσ\sigma 計算できないように見えるプロパティもたくさんあります。たとえば、プログラムの完全な実行は何回追加されますか?まあ、それはプログラムが実行するステップ数を尋ねることとほぼ同じです。これは実質的に停止の問題です。しかし、非常に簡単に計算できるプログラムプロパティが大量にあるようです。それでも、ライスの定理は、それらのいずれも計算可能ではないと主張します。 ここに何が欠けていますか?

6
量子コンピューターが通常のコンピューターよりも高速である理由と方法
私は現在、量子物理学に関する本(および多くのウィキペディア)を読んでいますが、量子コンピューターが現在のコンピューターよりも高速である方法をまだ理解していません。 量子コンピューターは、従来のコンピューターでは指数時間でしか解けない準指数時間の問題をどのように解決できますか?

2
本質的に曖昧で決定論的なコンテキストフリー言語はありますか?
決定論的プッシュダウンオートマトンで受け入れられる場合にのみ、コンテキストフリー言語を決定論的と呼び、そうでない場合は非決定的と呼びます。 言語を生成するすべての文脈自由文法が曖昧であり、それ以外では曖昧でない場合にのみ、本質的に曖昧な文脈自由言語を呼び出しましょう。 決定論的で明確な言語の例は次の言語です。 非決定的で明確な言語の例は次の言語です。 { W ∈ { 、B } * | w = w R }{ anbn∈ { a 、b }∗| N≥0}{anbn∈{a、b}∗|n≥0}\{a^{n}b^{n} \in \{a, b\}^{*} | n \ge 0\}{ W ∈ { 、B }∗| w= wR}{w∈{a、b}∗|w=wR}\{w \in \{a, b\}^{*} | w = w^{R}\} ウィキペディアから、本質的に曖昧なコンテキストフリー言語の例は、コンテキストフリー言語の以下の結合であり、これもコンテキストフリーでなければなりません: L = { anbmcmdn∈ { …

3
決定問題と「はい」または「いいえ」ではない「実際の」問題
私はいくつかの問題は、(近似することが困難であることを多くの場所で読ん NP-ハード近づけるために それらを)。しかし、近似は決定問題ではありません:答えは実数であり、YesまたはNoではありません。また、各望ましい近似係数に対して、正しい多くの答えと間違った多くの答えがあり、これは望ましい近似係数によって変わります! それでは、この問題はNP困難であると言えるのでしょうか。 (第二弾に触発有向グラフ内の2つのノード間の単純なパスの数をカウントしているどのようにハード?)

3
ロジックとは正確には何ですか?
前提条件について別の質問をすることで謝罪するかもしれませんが、出発点については混乱していました。「モーダルロジック」、「テンポラルロジック」、「1次ロジック」、「2次ロジック」、「高次ロジック」などのさまざまな用語に遭遇しました。 この文脈で「論理」とは正確に何を意味するのでしょうか?「論理」という言葉をどのように厳密に定義しますか? 数冊の本の最初のページを読んだ後、「ロジックは何から何を決めるかであり、プログラムを自動的に推論し理解するプログラムの設計を指示し促進するため、プログラミング言語の設計において重要であると結論付けることができます。 2番目の点について少し詳しく説明します。 今、これらのロジックに来ています。 これらのすべての論理、「時相論理」、「モーダル論理」、「一次論理」、「高次論理」は互いに独立していますか、またはこのグループの他のいくつかを理解するためにこれらの論理のいくつかを理解する必要がありますか?一言で言えば、それらの前提条件は何ですか?(いくつかの資料についても提案が得られれば素晴らしいと思います。) PS:親切にしてくれてありがとう

3
Martin-Löf型理論の紹介
型理論に関するPerMartin-Löfsのアイデアの最良の紹介は何でしょうか?私はオレゴンPLサマースクールからのいくつかの講義を見てきましたが、私はまだ次の質問に戸惑っています: タイプとは何ですか? 通常のZF公理で定義でき、非常に直感的な具体的なモデルがあるため、セットが何であるかを知っています。物がいっぱい入ったバスケットを考えてみてください。しかし、型の合理的な定義はまだわかりません。このアイデアをダミーに変換するソースがあるかどうか疑問に思っていました。

6
基数10を経由せずに基数から基数に変換する背後にある数学は?
任意のベースから任意のベースへの変換の背後にある数学を調べてきました。これは、何よりも結果の確認に関するものです。mathforum.orgで私の答えと思われるものを見つけましたが、正しいかどうかはまだわかりません。大規模なベースから小規模なベースへの変換は大丈夫です。なぜなら、最初の桁に次の桁の繰り返しを追加したいだけであるためです。私の問題は、小さなベースから大きなベースに変換するときに発生します。これを行うとき、彼らはあなたがあなたが持っている小さなベースに必要な大きなベースを変換する必要があるかについて話します。たとえば、ベース4からベース6に移動すると、6をベース4に変換して12を取得する必要があります。その後、大から小に変換するときと同じことを行います。私がこれに関して持っている難しさは、あなたが他のベースにある数字が何であるかを知る必要があるようです。したがって、ベース4に6が何であるかを知る必要があります。テーブルが必要になるため、これは私の頭に大きな問題を引き起こします。誰もがこれをより良い方法で行う方法を知っていますか? 基本的な変換が役立つと思いましたが、そのような機能が見つかりません。そして、私が見つけたサイトから、ベース10を経由せずにベースからベースに変換できるようですが、最初にベースからベースに最初の数値を変換する方法を知る必要があります。それはちょっと無意味になります。 コメンターは、文字を数字に変換する必要があると言っています。もしそうなら、私はすでにそれを知っています。しかし、それは私の問題ではありません。私の問題は、大きなベースを小さなベースに変換するために、最初に持っているベース番号を必要なベース番号に変換する必要があることです。これらのベースを他のベースに変換する能力があれば、すでに問題を解決しているので、これを行うことで目的を無効にします。 編集:10以下のベースから10以下の他のベースに変換する方法を考えました。10以上のベースから10以下のベースに移動することもできます。この問題は、10を超えるベースから10を超えるベースに変換するときに開始されます。または、10未満のベースから10を超えるベースに移行すると、コードが不要になります。コードに適用されます。

11
コンピューターサイエンスのデータが離散的であると見なされるのはなぜですか?
データの「構造」はブール代数に完全に依存していることを理解していますが、 なぜデータは連続的なものではなく、離散的な数学的実体と見なされるのですか? これに関連する: 次元の連続したエンティティとしてデータを構造化する際に違反する欠点または不変条件は何ですか?rrr 私は学部の数学の学生なので、この分野の専門家ではないので、誰かが私に5歳のように説明してくれたら本当に感謝しています。

6
漸近成長による関数のソート
たとえば、関数のリストがあるとします nloglog(n),2n,n!,n3,nlnn,…nlog⁡log⁡(n),2n,n!,n3,nln⁡n,…\qquad n^{\log \log(n)}, 2^n, n!, n^3, n \ln n, \dots どのようにそれらを漸近的にソートするのですか? f≤Og⟺f∈O(g)f≤Og⟺f∈O(g)\qquad f \leq_O g \iff f \in O(g)、 それらが実際にペアワイズ比較可能であると仮定すると(こちらも参照)?の定義を使用するのは厄介に思えますが、適切な定数および存在を証明するのは難しい場合がよくあり。OOOcccn0n0n_0 これは複雑さの尺度に関するものであるため、としての漸近的な挙動に興味がありn→+∞n→+∞n \to +\infty、すべての関数が非負の値()のみを取ると仮定します。∀n,f(n)≥0∀n,f(n)≥0\forall n, f(n) \ge 0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.