Advertisement
techno-

p1.c

Jan 15th, 2023
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <sys/time.h>
  4.  
  5. /* obtiene la hora actual en microsegundos */
  6. double microsegundos() {
  7.     struct timeval t;
  8.     if (gettimeofday(&t, NULL) < 0 )
  9.         return 0.0;
  10.     return (t.tv_usec + t.tv_sec * 1000000.0);
  11. }
  12.  
  13.  
  14. int fib1(int n){
  15.     if(n<2){
  16.         return n;
  17.     }else{
  18.         return fib1(n-1) + fib1(n-2);
  19.     }
  20. }
  21.  
  22. int fib2(int n){
  23.     int i=1;
  24.     int j=0;
  25.     int k;
  26.     for(k=0;k!=n;k++){
  27.  
  28.         j=i+j;
  29.         i=j-i;
  30.     }
  31.     return j;
  32. }
  33.  
  34. int fib3(int n){
  35.     int i = 1;
  36.     int j = 0;
  37.     int k = 0;
  38.     int h = 1;
  39.     int t = 0;
  40.  
  41.     while (n>0){
  42.  
  43.         if(n%2 != 0){
  44.             t=j*h;
  45.             j=i*h + j*k + t;
  46.             i=i*k +t;
  47.         }
  48.         t=h*h;
  49.         h=2*k*h + t;
  50.         k=k*k +t;
  51.         n=n/2;
  52.     }
  53.     return j;
  54. }
  55.  
  56.  
  57. void test() {
  58.     int n;
  59.     printf("n\tfib1(n)\tfib2(n)\tfib3(n)\n");
  60.  
  61.     for (n=0;n<=10;n++){
  62.         printf("%d\t%d\t%d\t%d\n",n,fib1(n),fib2(n),fib3(n));
  63.     }
  64.  
  65. }
  66.  
  67. void imprimirFib1(){
  68.     int n, i;
  69.     int cont;
  70.     double t1, t2, t, x, y, z;
  71.  
  72.     printf("Fib 1\n           n           t(n)      t(n)/1,1^n      *t(n)/fi^n     t(n)/2^n\n");
  73.     for(cont=1;cont<=3;cont++) {
  74.         for (n = 2; n <= 32; n = n * 2) {
  75.             t1 = microsegundos();
  76.             fib1(n);
  77.             t2 = microsegundos();
  78.             t = t2 - t1;
  79.             if(t<500){
  80.                 t1 = microsegundos();
  81.                 for(i=0;i<1000;i++) {
  82.                     fib1(n);
  83.                 }
  84.                 t2=microsegundos();
  85.                 t=(t2-t1)/1000;
  86.             }
  87.             x = t / pow(1.1,n);
  88.             y = t / pow(((1+sqrt(5))/2), n);
  89.             z = t / pow(2, n);
  90.             printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
  91.         }
  92.         printf("\n");
  93.     }
  94.     printf("*fi=((1+sqrt(5))/2)\n");
  95. }
  96.  
  97. void imprimirFib2(){
  98.     int n, i;
  99.     int cont;
  100.     double t1, t2, t, x, y, z;
  101.     printf("\nFib 2\n           n           t(n)      t(n)/n^0,8       t(n)/n      t(n)/nlogn\n");
  102.     for(cont=1;cont<=3;cont++){
  103.         for(n=1000;n<=10000000; n=n*10){
  104.             t1 = microsegundos();
  105.             fib2(n);
  106.             t2 = microsegundos();
  107.             t = t2-t1;
  108.  
  109.             if(t<500){
  110.                 t1 = microsegundos();
  111.                 for(i=0;i<1000;i++) {
  112.                     fib2(n);
  113.                 }
  114.                 t2=microsegundos();
  115.                 t=(t2-t1)/1000;
  116.             }
  117.             x = t / pow(n,0.8);
  118.             y = t / n;
  119.             z = t / (n*log(n));
  120.             printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
  121.         }
  122.         printf("\n");
  123.     }
  124. }
  125.  
  126. void imprimirFib3(){
  127.     int n, i;
  128.     int cont;
  129.     double t1, t2, t, x, y, z;
  130.  
  131.     printf("\nFib 3\n           n           t(n)    t(n)/sqrt(logn)   t(n)/logn     t(n)/n^0,5\n");
  132.     for(cont=1;cont<=3;cont++){
  133.         for(n=1000;n<=10000000; n=n*10){
  134.             t1 = microsegundos();
  135.             fib3(n);
  136.             t2 = microsegundos();
  137.             t = t2-t1;
  138.             if(t<500){
  139.                 t1 = microsegundos();
  140.                 for(i=0;i<1000;i++) {
  141.                     fib3(n);
  142.                 }
  143.                 t2=microsegundos();
  144.                 t=(t2-t1)/1000;
  145.             }
  146.             x = t / sqrt(log(n));
  147.             y = t / log(n);
  148.             z = t / pow(n, 0.5);
  149.             printf("%12d%15.3f%15.6f%15.6f%15.6f\n", n, t, x, y, z);
  150.         }
  151.         printf("\n");
  152.     }
  153. }
  154. int main(){
  155.     imprimirFib1();
  156.     imprimirFib2();
  157.     imprimirFib3();
  158.     test();
  159.  
  160.     return 0;
  161. }
  162.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement