, - w!/((w-n)! * n!) , , , , .
:
", , , , , n .
...
, , n! , . , , . , , , n- .
, n- k-. - . , , n k 4 3. , 4 , (0, 1, 2, 3), n, 3, k. n!/((k! * (nk)!). k- (2, 1, 0). 1 k- (3, 1, 0), ..
, k-index . , k- .
. Tablizing the Binomial Coeffieicent.
#, , , . . :
k- N, K . K- .
k- . , , . , , Pascal Triangle, .
k-. , .
Mark Dominus , . . , int. , , .
.NET # , ( ), . bool, InitTable, , true, , . , . , 4 . .
, , . , , 2 , .
, :
public void Test10Choose5()
{
String S;
int Loop;
int N = 10;
int K = 5;
BinCoeff<int> BC = new BinCoeff<int>(N, K, false);
int NumCombos = BinCoeff<int>.GetBinCoeff(N, K);
int[] KIndexes = new int[K];
StringBuilder SB = new StringBuilder();
for (int Combo = 0; Combo < NumCombos; Combo++)
{
BC.GetKIndexes(Combo, KIndexes);
int Val = BC.GetIndex(true, KIndexes);
if (Val != Combo)
{
S = "Val of " + Val.ToString() + " != Combo Value of " + Combo.ToString();
Console.WriteLine(S);
}
SB.Remove(0, SB.Length);
for (Loop = 0; Loop < K; Loop++)
{
SB.Append(KIndexes[Loop].ToString());
if (Loop < K - 1)
SB.Append(" ");
}
S = "KIndexes = " + SB.ToString();
Console.WriteLine(S);
}
}
, . n n!/((K! (N - k)!). k , , 1. k, 32. , N, N, N 0 N 1, 1 32 0, 32 32 . 32 1, 32.
, 32, 16 ( 32 - 601 080 390 ), 32- , . 64- , 64- . , long, 18 446 744 073 709 551 616, 2 ^ 64. n k, n 64, 64 32. 64 32 - 1,832,624,140,942,590,534 - 64 k , , , , , - . # .NET BigInteger. , .
PRNG, , Mersenne Twister TinyMT . ++ #. , C.
, Fisher-Yates, , - :
ulong Card;
ulong SevenCardHand = 0;
for (int CardLoop = 0; CardLoop < 7; CardLoop++)
{
do
{
Card = (1UL << RandObj.Next(CardsInDeck));
} while ((SevenCardHand & Card) != 0);
SevenCardHand |= Card;
}
, ( , ), 7 52. 64- . .
As a side note, the best binomial coefficient calculator I found that works with very large numbers (he accurately calculated the case, which gave more than 15,000 digits as a result) can be found.