4
4
* Wikipedia: https://en.wikipedia.org/wiki/Catalan_number
5
5
*/
6
6
7
- using System ;
8
7
using System . Diagnostics ;
9
8
using System . Collections . Generic ;
9
+ using System . Numerics ;
10
10
11
11
namespace Algorithms . Numeric
12
12
{
@@ -16,23 +16,23 @@ public static class CatalanNumbers
16
16
/// Internal cache.
17
17
/// By default contains the first two catalan numbers for the ranks: 0, and 1.
18
18
/// </summary>
19
- private static Dictionary < uint , ulong > _catalanNumbers = new Dictionary < uint , ulong > ( ) { { 0 , 1 } , { 1 , 1 } } ;
19
+ private static readonly Dictionary < uint , BigInteger > _catalanNumbers = new Dictionary < uint , BigInteger > { { 0 , 1 } , { 1 , 1 } } ;
20
20
21
21
/// <summary>
22
22
/// Helper function.
23
23
/// </summary>
24
- private static ulong _recursiveHelper ( uint rank )
24
+ private static BigInteger _recursiveHelper ( uint rank )
25
25
{
26
26
if ( _catalanNumbers . ContainsKey ( rank ) )
27
27
return _catalanNumbers [ rank ] ;
28
28
29
- ulong number = 0 ;
30
- uint lastRank = rank - 1 ;
29
+ BigInteger number = 0 ;
30
+ var lastRank = rank - 1 ;
31
31
32
32
for ( uint i = 0 ; i <= lastRank ; ++ i )
33
33
{
34
- ulong firstPart = _recursiveHelper ( i ) ;
35
- ulong secondPart = _recursiveHelper ( lastRank - i ) ;
34
+ var firstPart = _recursiveHelper ( i ) ;
35
+ var secondPart = _recursiveHelper ( lastRank - i ) ;
36
36
37
37
if ( ! _catalanNumbers . ContainsKey ( i ) ) _catalanNumbers . Add ( i , firstPart ) ;
38
38
if ( ! _catalanNumbers . ContainsKey ( lastRank - i ) ) _catalanNumbers . Add ( lastRank - i , secondPart ) ;
@@ -46,7 +46,7 @@ private static ulong _recursiveHelper(uint rank)
46
46
/// <summary>
47
47
/// Public API
48
48
/// </summary>
49
- public static ulong GetNumber ( uint rank )
49
+ public static BigInteger GetNumber ( uint rank )
50
50
{
51
51
// Assert the cache is not empty.
52
52
Debug . Assert ( _catalanNumbers . Count >= 2 ) ;
@@ -57,31 +57,26 @@ public static ulong GetNumber(uint rank)
57
57
/// <summary>
58
58
/// Calculate the number using the Binomial Coefficients algorithm
59
59
/// </summary>
60
- public static ulong GetNumberByBinomialCoefficients ( uint rank )
60
+ public static BigInteger GetNumberByBinomialCoefficients ( uint rank )
61
61
{
62
- // Calculate value of 2nCn
63
- var catalanNumber = BinomialCoefficients . Calculate ( 2 * rank , rank ) ;
64
-
65
- // return 2nCn/(n+1)
66
- return Convert . ToUInt64 ( catalanNumber / ( rank + 1 ) ) ;
62
+ // Calculate by binomial coefficient.
63
+ return BinomialCoefficients . Calculate ( rank ) ;
67
64
}
68
65
69
66
/// <summary>
70
67
/// Return the list of catalan numbers between two ranks, inclusive.
71
68
/// </summary>
72
- public static List < ulong > GetRange ( uint fromRank , uint toRank )
69
+ public static List < BigInteger > GetRange ( uint fromRank , uint toRank )
73
70
{
74
- List < ulong > numbers = new List < ulong > ( ) ;
71
+ var numbers = new List < BigInteger > ( ) ;
75
72
76
73
if ( fromRank > toRank )
77
74
return null ;
78
75
79
- for ( uint i = fromRank ; i <= toRank ; ++ i )
76
+ for ( var i = fromRank ; i <= toRank ; ++ i )
80
77
numbers . Add ( GetNumber ( i ) ) ;
81
78
82
79
return numbers ;
83
80
}
84
-
85
81
}
86
-
87
82
}
0 commit comments