1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- /****************************************************************
-
- 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
|