long gcd(long m, long n)
{
if (m<0) m=-m;
if (n<0) n=-n;
if (m==0) return n;
if (n==0) return m;
int d = 0;
while ((m & 1)==0 && (n & 1)==0) { m >>= 1; n >>= 1; ++d; }
while ((m & 1)==0) m >>= 1;
while ((n & 1)==0) n >>= 1;
while (m!=n) // while (true) // старый вариант if (m < n)
{
n -= m;
do n >>= 1; while ((n & 1)==0);
}
else// if (n < m) это теперь без надобности
{
m -= n;
do m >>= 1; while ((m & 1)==0);
}
// else break; // старый вариантreturn (m <<= d);
}
ビットシフトによって、ある(2の倍数とは限らない)ものを別の(2の倍数とは限らない)もので割るのか?
よし、私が持っているものを投入するから、あとは自分で必要かどうか判断してくれ。
gcd(2n + 1, 2(n + k) + 1) = gcd(2(n + k) + 1, 2n + 1) = gcd(2n + 1, k)
--
STL作者Alexander Stepanov氏によるYandexでの2つの講演会
// NODの計算を題材に-2回目の講義。でも、両方見る・聴くことをお勧めします。かっこいい講義、賢い人、とにかく素敵です。はい、そして便利です。ビットシフトがあれば、それでいい。モジュロ割り算の場合、しない。
連続したオフセットによる除算
最後に興味深い数字を紹介します。
このアルゴリズムは最悪の場合、(n-1)!の繰り返しで実行される。ここでnはdivisibleのビット深度である。まとめると、逐次加算アルゴリズムと比較して、8ビット数で最大9倍、16ビット数で最大546倍の利得を得ることができた。
というわけで、こんな感じです。
ということで、問題なく動作しているようですが、すべての穴をテストしてください。
//微調整して、この方がすっきりします。変だな、スピード感がない。
2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) 共通時間 GreatestCommonDivisor(random(,random()))= 7656ms; // 10000000コール
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) 共通時間gcd(random(),random())= 5234ms; // 10000000コール
おかしいな、そんなに速くないのに。
2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) 共通時間 GreatestCommonDivisor(random(,random()))= 7656ms; // 10000000コール
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) 共通時間gcd(random(),random())= 5234ms; // 10000000コール
もっと大きな差があるんです。あなたのは3-4倍速いですが、C++ではその差は2-2.5倍に縮まるので、正直1.5倍速いということをお忘れなく。
もっと大きな差があるんです。あなたのは3〜4倍速いですね。
が、C++ではその差は2~2.5倍に縮まるので、素直に1.5倍で勝負していることを忘れてはいけない。
そして、見届ける。
今のところ、mql5で暫定版を作っています。バグを探す、フレンドリーなテスト。
構造体として作りました。
すべての操作を正規化あり、なしの2形態にしました。柔軟な体制を手に入れた。
オーバーフローの可能性を疑えば - 恐れずに正規化したバージョンを使用する - 時間を節約する(正規化は、泡が蓄積されたときに、後で行うことができます)。
アーカイブには簡単なテストがありますが、もっと難しいテストをすることが望まれます。
顔文字だけならまだしも、記事まで削除するのはどうかと思います。
そのことについては、アカデミック。 いわゆる「計算機」があるのは素晴らしいと思うのですが、はっきりさせたいのは、取引中に自動的に最適化できるのかどうかということです。
特にこのスレッドのために、最新のMT5テスターの結果を公開しました(次のアップデート後に誰でもテストを繰り返すことができるようになります)。
これはMetaTrader 5テスターができる ことであり、さらに完全なインフラストラクチャーレイアウト(レポート、チャート、結果、視覚化)を備えています。
特にこのスレッドのために、MT5テスターの最新の結果を公開しました(次のアップデート後に誰でもテストを繰り返すことができるようになります)。
それがMetaTrader 5のテスターでは、フルレイアウト(レポート、チャート、結果、視覚化)でも可能なのです。
7シンボル、すべてのティック、2000年以降、2つのパラメータ(バリアント200 * 200 ) - 40000パス、各シンボルのために一日あたり百順序を持つ。
どのくらいかかるの?
10年かかる - 356 * 10 * 100 * 7 = 25 000 000 ディール
1分間に約10ティック取ります
と10年 - 365 * 10 * 1440 * 10 = 52 000 000 ticks on one symbol.そして、正直に言えば、すべてのシンボルでカチカチになっている。 だから、素直に7を掛けるべきだろう。しかも、1分間に10回の刻みではありません。そして、時には300になることもあります。
どのくらいかかるの?