90 líneas
1.9 KiB
C++
90 líneas
1.9 KiB
C++
/****************************************************************
|
|
|
|
This software is part of J.-S. Caux's C++ library.
|
|
|
|
Copyright (c) 2006.
|
|
|
|
-----------------------------------------------------------
|
|
|
|
Combinatorics.cc
|
|
|
|
Defines all class related to combinatorics.
|
|
|
|
LAST MODIFIED: 04/09/06
|
|
|
|
******************************************************************/
|
|
|
|
#include "JSC.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace JSC {
|
|
|
|
Choose_Table::Choose_Table ()
|
|
: Npower(0ULL), Npowerp1(1ULL), table(new unsigned long long int[1])
|
|
{
|
|
table[0] = 1ULL;
|
|
}
|
|
|
|
Choose_Table::Choose_Table (int Npower_ref)
|
|
: Npower(Npower_ref), Npowerp1(Npower_ref + 1ULL)
|
|
{
|
|
dim = Npowerp1 * Npowerp1;
|
|
|
|
// We can only go up to ULL_MAX:
|
|
if (log(DP(ULLONG_MAX)) < DP(Npowerp1) * log(2.0))
|
|
JSCerror("Choose_Table: too large to contruct.");
|
|
|
|
table = new unsigned long long int[dim];
|
|
|
|
(*this).Fill_table();
|
|
}
|
|
|
|
void Choose_Table::Fill_table()
|
|
{
|
|
table[0] = 1ULL;
|
|
int n,m;
|
|
for (n = 0; n <= Npower; ++n) {
|
|
table[Npowerp1 * n] = 1ULL;
|
|
for (m = 1; m < n; ++m) {
|
|
table[Npowerp1 * n + m] = table[Npowerp1 * (n-1) + m - 1] + table[Npowerp1 * (n-1) + m];
|
|
}
|
|
table[Npowerp1 * n + n] = 1ULL;
|
|
for (m = n+1; m <= Npower; ++m)
|
|
table[Npowerp1 * n + m] = 0ULL;
|
|
}
|
|
}
|
|
|
|
int Choose_Table::power()
|
|
{
|
|
return(Npower);
|
|
}
|
|
|
|
unsigned long long int Choose_Table::choose(int N, int M)
|
|
{
|
|
if (N < 0 || N > Npower) JSCerror("N out of bounds in choose(N,M).");
|
|
if (M < 0 || M > Npower) JSCerror("M out of bounds in choose(N,M).");
|
|
|
|
return(table[Npowerp1 * N + M]);
|
|
}
|
|
|
|
std::ostream& operator<< (std::ostream& s, Choose_Table& Ref_table)
|
|
{
|
|
s << endl;
|
|
for (int n = 0; n <= Ref_table.power(); ++n) {
|
|
for (int m = 0; m <= Ref_table.power(); ++m)
|
|
s << Ref_table.choose(n, m) << " ";
|
|
s << endl;
|
|
}
|
|
s << endl;
|
|
return(s);
|
|
}
|
|
|
|
Choose_Table::~Choose_Table()
|
|
{
|
|
delete[] table;
|
|
}
|
|
|
|
|
|
} // namespace JSC
|