Оптимизация кода

Тема в разделе "WASM.BEGINNERS", создана пользователем y(x), 8 ноя 2006.

  1. y(x)

    y(x) New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    6
    Написал код вычисления коэф. ньютона-котэса но при i>8 начинает долго тормозить :dntknw:
    помогите с оптимизацией
    Код (Text):
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <math.h>
    4. #define MAX 100
    5.  
    6. struct drob {long long c;long long z;};
    7. drob H;
    8.  
    9. void head()
    10. {
    11. //  clrscr();
    12.   printf("Vychislenie koefficintov newtona kotesa\n\n");
    13.   return;
    14. }
    15.  
    16. long long fact(long long n)
    17. {
    18.   long long res;
    19.   res=1;
    20.   while(n>1)res*=n--;
    21.   return res;
    22. }
    23.  
    24. void printd(drob d)
    25. {
    26.   printf("%d/",d.c);
    27. //  printf("---\n");
    28.   printf("%d\n",d.z);
    29. }
    30.  
    31. drob koef(int i,int n)
    32. {
    33.   drob k;
    34.   k.c=1;
    35.   if((i-n)%2)k.c=-1;
    36.   k.z=(n*fact(i)*fact(n-i));
    37.   return k;
    38. }
    39.  
    40. drob sokr(drob v)
    41. {
    42.   long long i;
    43.   i=(v.c<v.z?v.c:v.z);
    44. //  printf("min=%d",i);
    45.   while(i>1)
    46.   {
    47.     if ((v.c%i==0)&&(v.z%i==0))
    48.     {
    49.       v.c/=i;
    50.       v.z/=i;
    51.     }
    52.     i--;
    53.   }
    54.   return v;
    55. }
    56.  
    57. long long mypow(int x,int y)
    58. {
    59.   long long res;
    60.   int i;
    61.   res=1;
    62.   for(i=1;i<=y;i++)res*=x;
    63.   return res;
    64. }
    65.  
    66.  
    67. drob integral(int i,int n)
    68. {
    69.   drob c[MAX],d[MAX];
    70.   int k,j;long long nod;drob in;int q;
    71.   q=n;
    72. //  c[0]=d[0]=0;
    73.   for (j=0;j<MAX;j++) {c[j].c=0;c[j].z=1;d[j].c=0;d[j].z=1;}
    74. //ishem koefficienty
    75.   d[1].c=1;
    76.   for (j=1;j<=n;j++)
    77.   {
    78.     d[j+1].c=d[j].c*j*(-1);
    79.     if (j>1) for (k=j;k>=2;k--) d[k].c=d[k].c+d[k-1].c*j*(-1);
    80.   }
    81.   c[1].c=d[1].c;
    82. //delim na q-i
    83.   for (j=1;j<=n+1;j++)
    84.   {
    85.     c[j].c=i*c[j-1].c+d[j].c;
    86.   }
    87. /*
    88.   for (j=1;j<=n+1;j++)
    89.   {
    90.     if(c[j].c>=0&&j>1) printf("+");
    91.     printf("%dq",c[j].c);
    92.     printf("^%d",n-j+2);
    93.   }
    94.   printf("\n");
    95.   for (j=1;j<=n+1;j++)
    96.   {
    97.     printf("---- ");
    98.   }
    99.   printf("\n");
    100.   for (j=1;j<=n+1;j++)
    101.   {
    102.     printf("%4d ",n-j+2);
    103.   }*/
    104.   //////////////////////////////////////////
    105.   //vych nod
    106.   nod=1;
    107.   for (j=1;j<=n+1;j++) nod*=j;
    108.          /*
    109.   printf("\n");
    110.   for (j=1;j<=n+1;j++)
    111.   {
    112.     if(c[j].c>=0&&j>1) printf("+");
    113.     printf("%dq",c[j].c*nod/(n-j+2));
    114.     printf("^%d",n-j+2);
    115.   }
    116.   printf("\n");
    117.   for (j=1;j<=n+1;j++)
    118.   {
    119.     printf("---- ");
    120.   }
    121.   printf("\n");
    122.   for (j=1;j<=n+1;j++)
    123.   {
    124.     printf("%4d ",nod);
    125.   }
    126.   printf("\n");*/
    127.   in.c=0;
    128.   in.z=nod;long long dd;
    129.   //vych integral
    130.   for (j=1;j<=n+1;j++)
    131.   {
    132.     //in.c=in.c+((c[j].c)*nod/(n-j+2))*exp((n-j+2)*log(q));printf("[%d]",in.c);}
    133. //      in.c=exp((n-j+2)*log(q))+1;
    134. //      dd=exp((n-j+2)*log(q));//(q+1)%2;
    135.       dd=mypow(q,n-j+2);
    136. //      printf("[%d]",dd);
    137.       dd*=((c[j].c)*nod/(n-j+2));
    138.       in.c+=dd;
    139.  
    140. //      dd=(c[j].c)*nod/(n-j+2);
    141. //      printf("<%d>",dd);
    142.  
    143. //      printf("<%d>",in.c);
    144.   }
    145.  
    146.  
    147. //  in.z=nod;
    148. //  printf("nod=%d\n",nod);
    149. //   printd(in);
    150.   in=sokr(in);
    151.   return in;
    152. }
    153.  
    154.  
    155. drob Hk(int i,int n)
    156. {
    157.   drob res;
    158.   drob k, in;
    159.   k=koef(i,n);
    160.   in=integral(i,n);
    161.   res.c=k.c*in.c;
    162.   res.z=k.z*in.z;
    163.   res=sokr(res);
    164.   return res;
    165. }
    166.  
    167. void debug()
    168. {
    169.   drob in;
    170.   int i,j;
    171.   for(i=1;i<20;i++)
    172.     for(j=0;j<=i;j++)
    173.     {
    174.       in=Hk(j,i);
    175.       printf("H(i=%d,n=%d)=",j,i);
    176.       printd(in);
    177.     }/*
    178.   in=Hk(1,6);
    179.   printd(in);/*
    180.   in=koef(0,1);
    181.   printd(in);*/
    182. }
    183.  
    184. int main()
    185. {
    186.   head();
    187.   debug();
    188.   getch();
    189.   return 0;
    190. }
     
  2. y(x)

    y(x) New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    6
    забыл сказать компилятор gcc под win ;)
     
  3. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    y(x)

    Процедуры вычисления коэффициентов в Newton-Cotes есть в библиотеке DIVDIF, в том числе и на С++. Посмотри, будут ли они тормозить, если нет, то можешь сравнить их код со своим. Кстати сказать, порядки выше 4-5 практического значения не имеют.
     
  4. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    y(x)
    Тыб хоть закоментированые строки убрал. А то получилась туча коду, сидите оптимизируйте.
     
  5. y(x)

    y(x) New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    6
    Stiver спасибо, но я хочу свой код
    [PaCHER], извини но очень торопился
    All, всем спасибо я разобрался. торможения были в функции сокращения дробей
     
  6. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Еще можно факториалы таблицей сделать...