Немного удивлен :) Решил поделиться и задать НЕ риторический вопрос. - страница 23

 
Urain:

Ты собираешься одно ( не обязательно кратное 2 число ) делить на другое ( не обязательно кратное 2 число ) через битовый сдвиг?

Ладно кину что у меня есть, а там сам думай нужно или нет.

Иосиф Штейн (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)

--

Две лекции создателя STL Александра Степанова в Яндексе

//  По теме вычисления НОД - вторая лекция. Но советую посмотреть/послушать обе. Классные лекции, вумный мужчинка, просто приятно. Да и полезно.
Файлы:
gcd_ru.zip  365 kb
 
MetaDriver:
Если с битовыми сдвигами - давай. Если с делением по модулю, то не надо.

Деление последовательным смещением

интересные цифры к конце статьи:

Данный алгоритм будет выполняться в худшем случае за (n-1)! итераций, где n – разрядность делимого в битах. В итоге, по сравнению с алгоритмом последовательного сложения, данный алгоритм дает выигрыш до 9 раз для 8-битных чисел и до 546 раз для 16-битных.

 

Значица у меня получилось так:

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

вроде работает справно. прошу тестить во все дыры.

// подправил, так приятнее.
Файлы:
gcd.zip  1 kb
 

Странно, не шибко быстрее получилось.

2011.04.03 22:56:59    gcdSpeedTest (EURUSD,M20)    Common time GreatestCommonDivisor(random(),random()) = 7656ms; // 10000000 calls
2011.04.03 22:56:51    gcdSpeedTest (EURUSD,M20)    Common time gcd(random(),random()) = 5234ms; // 10000000 calls

Файлы:
gcd.zip  2 kb
 
MetaDriver:

Странно, не шибко быстрее получилось.

2011.04.03 22:56:59    gcdSpeedTest (EURUSD,M20)    Common time GreatestCommonDivisor(random(),random()) = 7656ms; // 10000000 calls
2011.04.03 22:56:51    gcdSpeedTest (EURUSD,M20)    Common time gcd(random(),random()) = 5234ms; // 10000000 calls

У меня побольше разница. Твой быстрее в 3-4 раза, но не забывай что на С++ разница поубавится раза в 2-2,5, так что ты по честному обогнал в 1,5 раза.

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:

У меня побольше разница. Твой быстрее в 3-4 раза,

но не забывай что на С++ разница поубавится раза в 2-2,5, так что ты по честному обогнал в 1,5 раза.


А посмотрим.

Пока предварительная версия на mql5. Дружно тестим, ищем баги.

Сделал в виде структуры.

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

Все операции сделал в двух формах - с последующей нормализацией и без. Получилась гибкая конструкция.

Если подозреваешь возможность переполнения - используешь версию с нормализацией, не опасаешься - экономишь время (нормализовать можно и попозже, когда накопится пена).

В архиве простенький тест есть, но желательно пожёстче потестить.

Файлы:
 
IgorM:

спс хоть признались - Вы смайлы режете, но кто целые посты удаляет?

по сабжу, Academic, то, что у Вас есть так называемая "считалка" - это отлично, хотелось бы уточнить, а есть у Вас возможность автоматической оптимизации в ходе торговли?

Да это просто программа - если ее запустить то она отработает и выдаст оптимальные параметры. 
 
На ЕМАшке проверить -- самое то будет.
 

Специально для этой темы опубликовал последние результаты МТ5 тестера (любой сможет повторить тесты после очередного обновления).

Вот что может делать тестер МетаТрейдер 5, да еще и с полной инфраструктурной выкладкой (отчеты, графики, результаты, визуализация).

 
Renat:

Специально для этой темы опубликовал последние результаты МТ5 тестера (любой сможет повторить тесты после очередного обновления).

Вот что может делать тестер МетаТрейдер 5, да еще и с полной инфраструктурной выкладкой (отчеты, графики, результаты, визуализация).

7 символов, все тики, с 2000 года, два параметра ( вариантов 200 * 200 )- 40000 проходов, с сотней ордеров в день по каждому символу.

Сколько занимает времени?

берем 10 лет - 356 * 10 * 100 * 7 = 25 000 000 сделок

берем примерно 10 тиков в минуту

и 10 лет - 365 * 10 * 1440 *10 = 52 000 000 тиков на одном символе. А если по честному то тики они на каждом символе тикают.  То есть надо по честному умножить еще на 7. Да и не по 10 тиков в минуту. А бывает и 300.


Сколько времени занимает?

Причина обращения: