]> mj.ucw.cz Git - saga.git/blobdiff - programs/n0.c
Corrected bugs reported by Koubek.
[saga.git] / programs / n0.c
index 36da613680bc94d39b42ab685fd776ca303da8ae..4327bd645d2e595ae5d4dc98fb3fde3e28203164 100644 (file)
@@ -11,6 +11,20 @@ int f(int n)
   return ff[n];
 }
 
   return ff[n];
 }
 
+// Kombinacni cislo
+int c(int n, int k)
+{
+  if (k > n/2)
+    k = n-k;
+  long long int r = 1;
+  for (int i=1; i<=k; i++)
+    {
+      r *= n--;
+      r /= i;
+    }
+  return r;
+}
+
 // Satnarka
 int s(int d)
 {
 // Satnarka
 int s(int d)
 {
@@ -40,8 +54,45 @@ int n0(int z, int d)
   return nn[z][d];
 }
 
   return nn[z][d];
 }
 
+// Vzorecek ze Stanleyho
+int s0(int z, int d)
+{
+  int r = 0;
+  int p = 1;
+  for (int k=0; k<=z; k++)
+    {
+      r += p * f(d-k) * c(z,k);
+      p = -p;
+    }
+  return r;
+}
+
+// Satnarciny pomerny
+double alpha(int n)
+{
+  double x = 1;
+  int sg = -1;
+  for (int i=1; i<=n; i++)
+    {
+      x += sg*(1. / f(i));
+      sg = -sg;
+    }
+  return x;
+}
+
 int main(void)
 {
 int main(void)
 {
+  printf("Satnarka obema zpusoby:\n");
+  for (int i=1; i<MAX; i++)
+    printf("%d\t%d\t%f\n", i, s(i), f(i)*alpha(i));
+  putchar('\n');
+
+  printf("n0(i-1,i) pomoci alpha(i) a s(i):\n");
+  for (int i=2; i<MAX; i++)
+    printf("%d\t%f\t%f\n", i, f(i-1) * (i*alpha(i-1) + alpha(i-2)), s(i)*(1+1./i));
+  putchar('\n');
+
+  printf("Rekurence pro n0 dava:\n");
   for (int i=0; i<MAX; i++)
     printf("\t%d", i);
   putchar('\n');
   for (int i=0; i<MAX; i++)
     printf("\t%d", i);
   putchar('\n');
@@ -58,6 +109,34 @@ int main(void)
     }
   putchar('\n');
 
     }
   putchar('\n');
 
+  printf("Totez podle vzorecku ze Stanleyho:\n");
+  for (int i=0; i<MAX; i++)
+    {
+      printf("%d\t", i);
+      for (int j=0; j<MAX; j++)
+       {
+         if (j >= i)
+           printf("%d", s0(i, j));
+         putchar('\t');
+       }
+      putchar('\n');
+    }
+  putchar('\n');
+
+  printf("Rozdily:\n");
+  for (int i=0; i<MAX; i++)
+    {
+      printf("%d\t", i);
+      for (int j=0; j<MAX; j++)
+       {
+         if (j >= i && i > 0)
+           printf("%d", n0(i-1,j)-n0(i,j));
+         putchar('\t');
+       }
+      putchar('\n');
+    }
+
+  printf("Pomery:\n");
   for (int i=0; i<MAX; i++)
     {
       printf("%d\t", i);
   for (int i=0; i<MAX; i++)
     {
       printf("%d\t", i);
@@ -65,8 +144,8 @@ int main(void)
        {
          if (j >= i && i > 0)
            {
        {
          if (j >= i && i > 0)
            {
-             double d = (double)(n0(i-1,j)-n0(i,j))/n0(i,j);
-             printf("%5.2f", 1/d);
+             double d = (double)n0(i-1,j)/(n0(i-1,j)-n0(i,j));
+             printf("%2.4f", d);
            }
          putchar('\t');
        }
            }
          putchar('\t');
        }