11import { Tree , buchheim } from './Tree' ;
2- export function getTree ( n , algo = 0 ) {
2+ export function getTree ( n , algo = 0 , r = 0 ) {
33 if ( algo === 0 )
44 return buchheim ( fib ( n ) ) ;
55 else if ( algo === 1 )
6- return buchheim ( sib ( n ) ) ;
6+ return buchheim ( NcR ( n , r ) ) ;
7+ else if ( algo === 2 )
8+ return buchheim ( derangement ( n ) ) ;
9+ else if ( algo === 3 )
10+ return buchheim ( bigmod ( n , r ) ) ;
11+ else if ( algo === 4 )
12+ return buchheim ( stirling2 ( n , r ) ) ;
713}
814
915function fib ( n ) {
10- let tree = new Tree ( n , [ ] ) ;
16+ let tree = new Tree ( n , [ ] , n + "" ) ;
1117 if ( n < 2 ) return tree ;
1218 tree . children . push ( fib ( n - 1 ) ) ;
1319 tree . children . push ( fib ( n - 2 ) ) ;
@@ -22,4 +28,61 @@ function sib(n){
2228 tree . children . push ( sib ( n - 3 ) ) ;
2329 tree . node = tree . children [ 0 ] . node + tree . children [ 1 ] . node ;
2430 return tree ;
31+ }
32+
33+ function NcR ( n , r ) {
34+ if ( r > n )
35+ return new Tree ( - 1 , [ ] , "(" + n + "," + r + ")" ) ;
36+
37+ if ( n === r )
38+ return new Tree ( 1 , [ ] , "(" + n + "," + r + ")" ) ;
39+
40+ if ( r === 0 )
41+ return new Tree ( 1 , [ ] , "(" + n + "," + r + ")" ) ; ;
42+
43+ // nCr(n, r) = nCr(n - 1, r - 1) + nCr(n - 1, r)
44+ let tree = new Tree ( 0 , [ ] , "(" + n + "," + r + ")" ) ;
45+ tree . children . push ( NcR ( n - 1 , r - 1 ) ) ;
46+ tree . children . push ( NcR ( n - 1 , r ) ) ;
47+ tree . node = tree . children [ 0 ] . node + tree . children [ 1 ] . node ;
48+ return tree ;
49+ }
50+
51+ function derangement ( n ) {
52+ if ( n == 0 ) return new Tree ( 1 , [ ] , n + "" ) ;
53+ if ( n == 1 ) return new Tree ( 0 , [ ] , n + "" ) ;
54+ let tree = new Tree ( 0 , [ ] , n + "" ) ;
55+ tree . children . push ( derangement ( n - 1 ) ) ;
56+ tree . children . push ( derangement ( n - 2 ) ) ;
57+ tree . node = ( n - 1 ) * ( tree . children [ 0 ] . node + tree . children [ 1 ] . node ) ;
58+ return tree ;
59+ }
60+
61+ function bigmod ( n , r ) {
62+ if ( r === 0 ) return new Tree ( 1 , [ ] , "(" + n + "," + r + ")" ) ;
63+ if ( r === 1 ) return new Tree ( n , [ ] , "(" + n + "," + r + ")" ) ;
64+ let tree = new Tree ( 1 , [ ] , "(" + n + "," + r + ")" ) ;
65+ if ( r % 2 === 1 ) {
66+ tree . children . push ( bigmod ( n , ( r - 1 ) / 2 ) ) ;
67+ tree . children . push ( bigmod ( n , ( r - 1 ) / 2 ) ) ;
68+ tree . children . push ( bigmod ( n , 1 ) ) ;
69+ } else {
70+ tree . children . push ( bigmod ( n , r / 2 ) ) ;
71+ tree . children . push ( bigmod ( n , r / 2 ) ) ;
72+ }
73+ for ( let i = 0 ; i < tree . children . length ; i ++ ) {
74+ tree . node *= tree . children [ i ] . node ;
75+ }
76+ return tree ;
77+ }
78+
79+ function stirling2 ( n , r ) {
80+ if ( n === r ) return new Tree ( 1 , [ ] , "(" + n + "," + r + ")" ) ;
81+ if ( r === 0 ) return new Tree ( 0 , [ ] , "(" + n + "," + r + ")" ) ;
82+
83+ let tree = new Tree ( 0 , [ ] , "(" + n + "," + r + ")" ) ;
84+ tree . children . push ( stirling2 ( n - 1 , r ) ) ;
85+ tree . children . push ( stirling2 ( n - 1 , r - 1 ) ) ;
86+ tree . node = tree . children [ 0 ] . node * r + tree . children [ 1 ] . node ;
87+ return tree ;
2588}
0 commit comments