Binomial transform: Difference between revisions
Content added Content deleted
(Added Go) |
(Added C) |
||
Line 55: | Line 55: | ||
;* [[oeis:A034943|OEIS:A034943 - Binomial transform of Padovan sequence]] |
;* [[oeis:A034943|OEIS:A034943 - Binomial transform of Padovan sequence]] |
||
;* [[oeis:A144413|OEIS:A144413 - a(n) = Sum_{k=0..n} (-1)^k * binomial(n, k) * A000931(n-k+4) (Inverse binomial transform of Padovan sequence)]] |
;* [[oeis:A144413|OEIS:A144413 - a(n) = Sum_{k=0..n} (-1)^k * binomial(n, k) * A000931(n-k+4) (Inverse binomial transform of Padovan sequence)]] |
||
=={{header|C}}== |
|||
<syntaxhighlight lang="c">#include <stdio.h> |
|||
#include <stdint.h> |
|||
uint64_t factorial(int n) { |
|||
if (n > 20) return 0; // too big for uint64_t |
|||
if (n < 2) return 1; |
|||
uint64_t fact = 1; |
|||
int i = 2; |
|||
for (i = 2; i <= n; ++i) fact *= i; |
|||
return fact; |
|||
} |
|||
uint64_t binomial(int n, int k) { |
|||
return factorial(n) / factorial(n-k) / factorial(k); |
|||
} |
|||
void btForward(int64_t b[], const int64_t a[], size_t c) { |
|||
int n, k; |
|||
for (n = 0; n < c; ++n) { |
|||
b[n] = 0; |
|||
for (k = 0; k <= n; ++k) { |
|||
b[n] += (int64_t)binomial(n, k) * a[k]; |
|||
} |
|||
} |
|||
} |
|||
void btInverse(int64_t a[], const int64_t b[], size_t c) { |
|||
int n, k, sign; |
|||
for (n = 0; n < c; ++n) { |
|||
a[n] = 0; |
|||
for (k = 0; k <= n; ++k) { |
|||
sign = (n-k) & 1 ? -1 : 1; |
|||
a[n] += (int64_t)binomial(n, k) * b[k] * sign; |
|||
} |
|||
} |
|||
} |
|||
int main() { |
|||
int i, j; |
|||
int64_t fwd[20], res[20], seqs[4][20] = { |
|||
{1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190}, |
|||
{0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0}, |
|||
{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181}, |
|||
{1, 0, 0, 1, 0, 1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37} |
|||
}; |
|||
const char *names[4] = { |
|||
"Catalan number sequence:", |
|||
"Prime flip-flop sequence:", |
|||
"Fibonacci number sequence:", |
|||
"Padovan number sequence:" |
|||
}; |
|||
for (i = 0; i < 4; ++i) { |
|||
printf("%s\n", names[i]); |
|||
for (j = 0; j < 20; ++j) printf("%ld ", seqs[i][j]); |
|||
printf("\nForward binomial transform:\n"); |
|||
btForward(fwd, seqs[i], 20); |
|||
for (j = 0; j < 20; ++j) printf("%ld ", fwd[j]); |
|||
printf("\nInverse binomial transform:\n"); |
|||
btInverse(res, seqs[i], 20); |
|||
for (j = 0; j < 20; ++j) printf("%ld ", res[j]); |
|||
printf("\nRound trip:\n"); |
|||
btInverse(res, fwd, 20); |
|||
for (j = 0; j < 20; ++j) printf("%ld ", res[j]); |
|||
if (i < 3) printf("\n\n"); else printf("\n"); |
|||
} |
|||
return 0; |
|||
}</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
Catalan number sequence: |
|||
1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845 35357670 129644790 477638700 1767263190 |
|||
Forward binomial transform: |
|||
1 2 5 15 51 188 731 2950 12235 51822 223191 974427 4302645 19181100 86211885 390248055 1777495635 8140539950 37463689775 173164232965 |
|||
Inverse binomial transform: |
|||
1 0 1 1 3 6 15 36 91 232 603 1585 4213 11298 30537 83097 227475 625992 1730787 4805595 |
|||
Round trip: |
|||
1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845 35357670 129644790 477638700 1767263190 |
|||
Prime flip-flop sequence: |
|||
0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 |
|||
Forward binomial transform: |
|||
0 1 3 6 11 20 37 70 134 255 476 869 1564 2821 5201 9948 19793 40562 84271 174952 |
|||
Inverse binomial transform: |
|||
0 1 -1 0 3 -10 25 -56 118 -237 456 -847 1540 -2795 5173 -9918 19761 -40528 84235 -174914 |
|||
Round trip: |
|||
0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 |
|||
Fibonacci number sequence: |
|||
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 |
|||
Forward binomial transform: |
|||
0 1 3 8 21 55 144 377 987 2584 6765 17711 46368 121393 317811 832040 2178309 5702887 14930352 39088169 |
|||
Inverse binomial transform: |
|||
0 1 -1 2 -3 5 -8 13 -21 34 -55 89 -144 233 -377 610 -987 1597 -2584 4181 |
|||
Round trip: |
|||
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 |
|||
Padovan number sequence: |
|||
1 0 0 1 0 1 1 1 2 2 3 4 5 7 9 12 16 21 28 37 |
|||
Forward binomial transform: |
|||
1 1 1 2 5 12 28 65 151 351 816 1897 4410 10252 23833 55405 128801 299426 696081 1618192 |
|||
Inverse binomial transform: |
|||
1 -1 1 0 -3 10 -24 49 -89 145 -208 245 -174 -176 1121 -3185 7137 -13920 24301 -37926 |
|||
Round trip: |
|||
1 0 0 1 0 1 1 1 2 2 3 4 5 7 9 12 16 21 28 37 |
|||
</pre> |
|||
=={{header|Go}}== |
=={{header|Go}}== |