]> mj.ucw.cz Git - saga.git/blob - programs/n0.c
Added a program for computing the n0's.
[saga.git] / programs / n0.c
1 #include <stdio.h>
2
3 #define MAX 13
4
5 // Faktorial
6 int f(int n)
7 {
8   static int ff[MAX] = { 1 };
9   if (!ff[n])
10     ff[n] = n*f(n-1);
11   return ff[n];
12 }
13
14 // Satnarka
15 int s(int d)
16 {
17   int r = 0;
18   int sg = 1;
19   for (int k=0; k<=d; k++)
20     {
21       r += sg*f(d)/f(k);
22       sg = -sg;
23     }
24   return r;
25 }
26
27 // Castecne restrikce
28 int n0(int z, int d)
29 {
30   static int nn[MAX][MAX];
31   if (!nn[z][d])
32     {
33       if (!z)
34         nn[z][d] = f(d);
35       else if (z == d)
36         nn[z][d] = s(d);
37       else
38         nn[z][d] = z*n0(z-1,d-1) + (d-z)*n0(z,d-1);
39     }
40   return nn[z][d];
41 }
42
43 int main(void)
44 {
45   for (int i=0; i<MAX; i++)
46     printf("\t%d", i);
47   putchar('\n');
48   for (int i=0; i<MAX; i++)
49     {
50       printf("%d\t", i);
51       for (int j=0; j<MAX; j++)
52         {
53           if (j >= i)
54             printf("%d", n0(i, j));
55           putchar('\t');
56         }
57       putchar('\n');
58     }
59   putchar('\n');
60
61   for (int i=0; i<MAX; i++)
62     {
63       printf("%d\t", i);
64       for (int j=0; j<MAX; j++)
65         {
66           if (j >= i && i > 0)
67             {
68               double d = (double)(n0(i-1,j)-n0(i,j))/n0(i,j);
69               printf("%5.2f", 1/d);
70             }
71           putchar('\t');
72         }
73       putchar('\n');
74     }
75
76   return 0;
77 }