Biraz şaşırdım :) Retorik bir soru DEĞİL paylaşmaya ve sormaya karar verdim. - sayfa 23

 
Urain :

Birini (zorunlu olarak 2'nin katı değil) diğerine (zorunlu olarak 2'nin katı değil) bir bit kaydırma yoluyla bölecek misiniz?

Tamam, elimdekileri atacağım ve sonra ihtiyacın olup olmadığını kendin düşüneceğim.

Joseph Stein (1961):

gcd(n,0) = gcd(0, n) = n

gcd(n,n) = n

gcd(2n,2m) = 2gcd(n,m)

gcd(2n,2m + 1) = gcd(n, 2m + 1)

gcd(2n + 1, 2m) = gcd(2n + 1, m)

gcd(2n + 1, 2(n + k) + 1) = gcd(2(n + k) + 1, 2n + 1) = gcd(2n + 1, k)

--

Yandex'de STL yaratıcısı Alexander Stepanov tarafından iki ders

// GCD hesaplaması konusunda - ikinci ders. Ama ikisini de izlemenizi/dinlemenizi tavsiye ederim. Harika dersler, akıllı adam, sadece güzel. Evet ve kullanışlı.
Dosyalar:
gcd_ru.zip  365 kb
 
MetaDriver :
Bit kaymaları varsa - hadi. Modulo bölümü varsa, gerekli değildir.

Ardışık ofset ile bölme

makalenin sonundaki ilginç rakamlar:

Bu algoritma en kötü durumda (n-1)'de çalışacaktır! yinelemeler, burada n temettü bitlerinin sayısıdır. Sonuç olarak, sıralı toplama algoritmasına kıyasla bu algoritma 8 bitlik sayılar için 9 kata kadar, 16 bitlik sayılar için 546 kata kadar kazanç sağlar.

 

Değeri şöyle aldım:

 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);
}

düzgün çalışıyor gibi görünüyor. Tüm deliklerde test etmenizi rica ediyorum.

// düzeltildi, daha hoş.
Dosyalar:
gcd.zip  1 kb
 

İşin garibi, daha hızlı olmadı.

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) Ortak zaman GreatestCommonDivisor(random(),random()) = 7656ms; // 10000000 çağrı
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) Ortak zaman gcd(random(),random()) = 5234ms; // 10000000 çağrı

Dosyalar:
gcd.zip  2 kb
 
MetaDriver :

İşin garibi, daha hızlı olmadı.

2011.04.03 22:56:59 gcdSpeedTest (EURUSD,M20) Ortak zaman GreatestCommonDivisor(random(),random()) = 7656ms; // 10000000 çağrı
2011.04.03 22:56:51 gcdSpeedTest (EURUSD,M20) Ortak zaman gcd(random(),random()) = 5234ms; // 10000000 çağrı

Farkım daha fazla. Sizinki 3-4 kat daha hızlı, ancak C ++ 'da farkın 2-2,5 kat azalacağını unutmayın, bu yüzden dürüstçe 1,5 kat aştınız.

 void OnStart ()
  {
//---
   int total= 1000000 ;
   long x= 2 * 3 * 5 * 7 * 9 * 11 * 13 * 17 * 19 * 21 * 23 * 29 ;
   long m= 55 *x,n= 34 *x;
   uint start= GetTickCount ();
   for ( int i= 0 ;i<total;i++)x=gcd(m,n);      
   Print ( "MetaDriver gcd time=" , GetTickCount ()-start, " x=" ,x);
   start= GetTickCount ();
   for ( int i= 0 ;i<total;i++)x=GreatestCommonDivisor(m,n); 
   Print ( "Urain       GCD time=" , GetTickCount ()-start, " x=" ,x);
  }
 2011.04 . 03 22 : 35 : 41      Черновик 30 (EURUSD,M1) Urain       GCD time= 1313 x= 1222772020470
2011.04 . 03 22 : 35 : 40      Черновик 30 (EURUSD,M1) MetaDriver  gcd time= 312 x= 1222772020470
 
Urain :

Farkım daha fazla. Seninki 3-4 kat daha hızlı

ama unutmayın ki C++'da fark 2-2,5 kat azalacaktır, bu yüzden dürüstçe 1,5 kat aştınız.


Ve görelim.

Mql5'teki ön sürüm iken. Birlikte test ediyoruz, hata arıyoruz.

Yapı şeklinde yapılmıştır.

 struct Rational
  {
   long               n;
   long               m;
   void ErrDZ() { Print ( "Rational error: zero-denominator!" ); }
   void Neg() { n=-n; }
   void Norm() { long d=gcd(n,m); n/=d; m/=d; if (m< 0 ) { n=-n; m=-m; } }
   void Assign( long a, long b) { if (b== 0 ) { n= 0 ; m= 1 ; ErrDZ(); } if (b< 0 ) { n=-a; m=-b; } else { n=a; m=b; } }
   void nAssign( long a, long b) { Assign(a,b); Norm(); }
   void Assign( long a) { Assign(a, 1 ); }   // {n=a;m=1;}
   void Add(Rational &a) { if (m==a.m) n+=a.n; else { n*=a.m; n+=m*a.n; m*=a.m; } }
   void nAdd(Rational &a) { Add(a); Norm(); }
   void Add( long a) { n+=a*m; }
   void nAdd( long a) { Add(a); Norm(); }
   void Sub(Rational &a) { if (m==a.m) n-=a.n; else { n*=a.m; n-=m*a.n; m*=a.m; } }
   void nSub(Rational &a) { Sub(a); Norm(); }
   void Sub( long a) { n-=a*m; }
   void nSub( long a) { Sub(a); Norm(); }
   void Mul(Rational &a) { n*=a.n; m*=a.m; }
   void nMul(Rational &a) { Mul(a); Norm(); }
   void Mul( long a) { n*=a; }
   void nMul( long a) { Mul(a); Norm(); }
   void Div(Rational &a) { n*=a.m; m*=a.n; }
   void nDiv(Rational &a) { Div(a); Norm(); }
   void Div( long a) { m*=a; }
   void nDiv( long a) { Div(a); Norm(); }
   string ToString() { return "(" + IntegerToString (n)+ "/" + IntegerToString (m)+ ")" ;}
  };

Tüm işlemler iki şekilde gerçekleştirildi - müteakip normalleştirme ve olmadan. Esnek bir tasarıma sahiptir.

Taşma olasılığından şüpheleniyorsanız - normalleştirmeli sürümü kullanın, korkmayın - zamandan tasarruf edersiniz (daha sonra köpük biriktiğinde normalleşebilirsiniz).

Arşivde basit bir test var, ancak daha zor test edilmesi arzu edilir.

Dosyalar:
 
IgorM :

ATP en azından kabul edildi - ifadeleri kestiniz, ancak tüm gönderileri kim siler?

konuya göre, Akademik , sözde bir "sayacınız" olması harika, açıklığa kavuşturmak isterim, ancak ticaret sırasında otomatik optimizasyon imkanınız var mı?

Evet, bu sadece bir programdır - çalıştırırsanız çalışır ve size en uygun parametreleri verir.
 
EMAshka kontrolünde - en fazla olacak.
 

Özellikle bu konu için MT5 test cihazının en son sonuçlarını yayınladım (bir sonraki güncellemeden sonra herkes testleri tekrarlayabilecek).

MetaTrader 5 test cihazının yapabileceği şey budur ve hatta tam bir altyapı düzeniyle (raporlar, çizelgeler, sonuçlar, görselleştirme).

 
Renat :

Özellikle bu konu için MT5 test cihazının en son sonuçlarını yayınladım (bir sonraki güncellemeden sonra herkes testleri tekrarlayabilecek).

MetaTrader 5 test cihazının yapabileceği şey budur ve hatta tam bir altyapı düzeniyle (raporlar, çizelgeler, sonuçlar, görselleştirme).

7 sembol, tüm işaretler, 2000'den beri, iki parametre (200 * 200 seçenek) - 40.000 geçiş, her sembol için günde yüz sipariş.

Ne kadar sürer?

10 yıl sürer - 356 * 10 * 100 * 7 = 25.000.000 işlem

dakikada yaklaşık 10 kene alıyoruz

ve 10 yıl - 365 * 10 * 1440 * 10 = sembol başına 52.000.000 tik. Ve dürüst olmak gerekirse, her sembolü işaretlerler. Yani, dürüstçe 7 ile çarpmak gerekiyor ve dakikada 10 kene değil. Ve bazen 300.


Ne kadar sürer?

Neden: