私は最近、創造的な基盤での数字の巧妙な使用に部分的または全体的に基づいた非常に多くのアルゴリズムがあることに気づきました。例えば:
私の質問は次のとおりです:直感または証明の重要なステップとして巧妙な記数法を使用する他のアルゴリズムはありますか?。私はこのテーマについて話をまとめることを考えているので、私が引き出さなければならない例が多ければ多いほど良いです。
クリス・オカサキは、彼の著書に非常に優れた章を持っています純粋関数型データ構造「数値表現」について説明しています。基本的に、数値の表現を取り、それをデータ構造に変換します。フレーバーを与えるために、ここにその章のセクションがあります:
蒸留された最高のトリックのいくつか:
その章のリファレンスリストもあります。
「3進数を使用して、シェルピンスキー三角形やカントール集合などの自己相似構造を便利に伝えることができます。」 ソース
「2Dヒルベルト曲線の表現には4進数が使用されます。」 ソース
「4分の1の架空の記数法は、1955年にドナルド・クヌースによって高校の理科の才能の検索に提出されて最初に提案されました。これは、架空の数2iをベースとして使用する非標準の位置記数法です。 0、1、2、および3の数字のみを使用してすべての複素数を表します。」 ソース
「ローマ数字は二五進法です。」 ソース
「2と3を除くすべての素数は、基数6で表されると、最後の桁が1または5になるため、六進法は素数の研究に役立つと考えられます。」 ソース
「六十進法(基数60)は、60を基数とする記数法です。紀元前3千年紀の古代シュメール人に端を発し、古代バビロニア人に受け継がれ、現在でも測定に使用されています。時間、角度、および角度である地理的座標。」 ソース
等...
このリスト は良い出発点です。
先日あなたの質問を読みましたが、今日は問題に直面しました。セットのすべてのパーティションを生成するにはどうすればよいですか?私が思いついた解決策、そして私が使用した解決策(おそらくあなたの質問を読んだため)はこれでした:
(p)パーティションが必要な、(n)個の要素を持つセットの場合、基数(p)のすべての(n)桁の数字を数えます。
各番号はパーティションに対応しています。各桁はセット内の要素に対応し、桁の値は要素を配置するパーティションを示します。
それは驚くべきことではありませんが、きちんとしています。それは完全で、冗長性を引き起こさず、任意のベースを使用します。使用するベースは、特定のパーティショニングの問題によって異なります。
正確には巧妙な基本システムではありませんが、基本システムの巧妙な使用法: Van der Corput シーケンスは 低離散シーケンス 数値のbase-n表現を逆にすることによって形成されます。これらは、2-d ハルトン列 を構築するために使用されます。これは this のように見えます。
行列の乗算を高速化するためのダブルベースシステムについて、漠然と覚えています。
ダブルベースシステムは、1つの番号に2つのベースを使用する冗長システムです。
_ n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}
_
冗長とは、1つの番号をさまざまな方法で指定できることを意味します。
TodorCooklevのVassilDimitrovによる記事「行列多項式の計算のためのハイブリッドアルゴリズム」を探すことができます。
私ができる最高の短い概要を提供しようとしています。
彼らは行列多項式G(N,A) = I + A + ... + A^{N-1}
を計算しようとしていました。
Nを支持することは複合G(N,A) = G(J,A) * G(K, A^J)
であり、J = 2に適用すると、次のようになります。
_ / (I + A) * G(K, A^2) , if N = 2K
G(N,A) = |
\ I + (A + A^2) * G(K, A^2) , if N = 2K + 1
_
また、
_ / (I + A + A^2) * G(K, A^3) , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 1
\ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2
_
これらの方程式のいくつかは最初のシステムでは高速であり、2番目のシステムではより優れていることは(冗談めかして)「明らか」なので、N
に応じてそれらの中から最良のものを選択することをお勧めします。ただし、これには2と3の両方で高速のモジュロ演算が必要になります。これがダブルベースが登場する理由です。基本的に、両方のモジュロ演算を高速に実行して、結合されたシステムを実現できます。
_ / (I + A + A^2) * G(K, A^3) , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
| (I + A) * G(3K + 1, A^2) , if N = 2 mod 6
\ I + (A + A^2) * G(3K + 2, A^2) , if N = 5 mod 6
_
私はこの分野の専門家ではないので、より良い説明については記事を見てください。
RadixSortは、さまざまな基数を使用できます。 http://en.wikipedia.org/wiki/Radix_sort bucketSortの非常に興味深い実装。
ここに良い投稿があります 「偽造コイン」問題を解決するために3進数を使用することについて(通常のコインの袋の中の1つの偽造コインを検出する必要があり、バランスをできるだけ少なく使用する必要があります)
文字列のハッシュ(たとえば、 Rabin-Karp アルゴリズム)では、文字列をn桁で構成される基数bの数値として評価することがよくあります(nは文字列の長さ、bは選択された基数です。十分大きい)。たとえば、文字列「ABCD」は次のようにハッシュできます。
'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0
文字にASCIIの値を代入し、bを256にすると、次のようになります。
65*256^3+66*256^2+67*256^1+68*256^0
ただし、ほとんどの実際のアプリケーションでは、結果を十分に小さく保つために、結果の値は適切なサイズの数値を法として取られます。
2乗によるべき乗 は、指数の2進表現に基づいています。
Hackers Delight
(すべてのプログラマーが私の目に知っておくべき本)ベースとしての-2(はい、右負のベース)や-1 + i(虚数単位sqrt(-1)としてのi)などの異常なベースに関する完全な章があります。ベースとして。また、私は最良のベースが何であるかを計算します(ハードウェア設計の観点から、それを読みたくないすべての人のために:方程式の解はeなので、2または3で行くことができます、3は少し良いでしょう(係数2)の1.056倍優れていますが、技術的にはより実用的です)。
私の頭に浮かぶ他のことは、グレーカウンター(このシステムで1ビットの変更のみを数える場合、メタスタビリティの問題を減らすためにハードウェア設計でこのプロパティを使用することがよくあります)またはすでに述べたハフマンエンコーディングの一般化-算術エンコーディングです。
暗号化では、整数環(モジュラー算術)と有限体を幅広く使用します。これらの演算は、整数係数を持つ多項式の動作に直観的に基づいています。
私は2進数をグレイコードに変換するためにこれが本当に好きです: http://www.matrixlab-examples.com/gray-code.html
素晴らしい質問です。リストは確かに長いです。時間を伝えることは、混合ベースの単純なインスタンスです(日|時間|分|秒|午前/午後)
興味があれば、メタベースの列挙型n-Tupleフレームワークを作成しました。これは、ベースナンバリングシステムにとって非常に甘い構文糖衣です。まだリリースされていません。私のユーザー名を(Gmailで)メールで送信します。
基数2を使用した私のお気に入りの1つは、 算術符号化 です。アルゴリズムのハートが0から1までの数値の表現を2進数で使用するため、これは珍しいことです。
[〜#〜] aks [〜#〜] の場合があります。