週末にかけて、I/O レイヤーに関する多くの作業が行われました。物事はよりクリーンになり、より多くのことが機能します。増え続けているバグのバックログに戻ります。
4月30日
I/O バグを修正するためのさらなる作業。
4月29日
T、TL、TR、および X が正常に動作し、I/O ライブラリが 1 つにまとまりました。
4月28日
Doug Cox は先週、T、TL、および TR 編集記述子が実装されていないことを指摘するために書き込みました。私はそれらを半分ほど実装しましたが、ライブラリの他の部分を壊してしまいました。まだアップロードがありません。
4月24日
Joost VandeVondele は昨日、2 つの問題を報告しました。ICHAR() が誤動作し、構造内のポインターの一部であるスカラーの割り当てに問題がありました。両方の問題が修正されました。
Francois Jacq さんが、一般的なインターフェースとモジュールに関する問題を報告しました。この修正により、インターフェースのロード方法に関するフロントエンドの本当に厄介な問題が明らかになりました。私は問題の完全な範囲を理解していません。根本的な変更を修正する必要がないことを願っています。
4月23日
数学的な余談。g95 で使用される乱数ジェネレーターは、George Marsaglia によって発明されました。私はこの数日間、彼にメールを送り続け、それがどのように機能し、どこから来たのかを調べました。ソースコードは次のとおりです。
static unsigned long x=123456789, y=362436069, z=521288629; static unsigned long xorshf96(void) { /* 期間 2^96-1 */ 符号なし long t; x ^= x << 16; x ^= x >> 5; x ^= x << 1; t = x; x = y; y = z; z = t ^ x ^ y; z を返します。 }
これは、個々の機械語命令に直接マップされる排他的論理和、シフト、および移動を含むため、非常に高速なジェネレーターであることがわかります。ジェネレーターの実部は、(x,y,z) を新しい (x’, y’, z’) に変換し、ユーザーが z を取得できるようにする変換です。明らかに、(0,0,0) は (0,0,0) に変換されます。すべてが 32 ビットであり、3*32=96 であるため、ジェネレーターは (0,0,0) を除くすべての可能な (x,y,z) を循環します。
コードを一瞥しただけでは明らかでないことは、変換が線形であることです。これは mod 2 です。排他的論理和は単純に mod 2 です。96×96 変換は行列 T で表すことができます。
| | 0 0 (I+L^16)(I+R^5)(I+L) | T = | 私 0 私 | | | 0Ⅱ |
ここの各要素は 32×32 の行列です。左下隅にある I は、x=y および y=z の割り当てを処理します。L と R は、ビットを左右にシフトする行列で、主対角線から外れた対角線 1 を持ちます。T は、シフト数である 0 < a,b,c < 32 の 3 つの数値によって実際にパラメーター化されます。Marsaglia が行ったことは、T の次数を 2^96-1 にする (a、b、c) のセットを見つけることです。
次の問題は、T の連続適用がすべての可能な (x,y,z) を循環することを証明する方法です。これを行う簡単な方法は、T^(2^96-1) を計算することです。
T を 2 回適用する代わりに、T^2 を計算し、(x,y,z) を 1 ステップではなく 2 ステップ進める新しい演算子として表示できます。T^2 が得られたら、それを再び 2 乗して T^4 を得ることができます。2 乗して乗算することで、実際に T^(2^96-1) を計算する手間をあまりかけずに計算できます。
T^(2^96-1) が恒等行列 ((x,y,z) をそれ自体に循環させる) 場合、T は候補です。より短いサイクルが存在する場合、サイクルの長さは 2^96-1 の偶数の除数でなければなりません。したがって、2^96-1 の素因数を計算し、T をこれらの素数まで上げて、恒等行列が得られないようにする必要があります。2^96-1 は 79228162514264337593543950335 ですが、因数分解が困難なこれらの暗号合成数の 1 つではありません。実際、ご覧のとおり、5 で割り切れます。
Marsaglia は、彼の PC が約 3 分で周期 2^64-1 の 2200 個の 2 語ジェネレーターをすべて見つけたと言います。彼は、より大きなジェネレータの特性多項式を含むより洗練された手法を使用し、周期が 2^128-1 の 4 つのワード ジェネレータに取り組んでいます。彼は、Journal of Modern Applied Statistical Methods の次号でこれを説明する招待論文を持っています。
より優れた乱数発生器を想像するのは困難です。生成された数値がランダム性の統計テストに合格する限り (それらはすべて、彼のDIEHARD スイートのテストに合格します)、このジェネレーターのファミリは非常に高速で、ステート ワードを最大限に活用します。