You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Combinatorics.cc 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /****************************************************************
  2. This software is part of J.-S. Caux's C++ library.
  3. Copyright (c) 2006.
  4. -----------------------------------------------------------
  5. Combinatorics.cc
  6. Defines all class related to combinatorics.
  7. LAST MODIFIED: 04/09/06
  8. ******************************************************************/
  9. #include "JSC.h"
  10. using namespace std;
  11. namespace JSC {
  12. Choose_Table::Choose_Table ()
  13. : Npower(0ULL), Npowerp1(1ULL), table(new unsigned long long int[1])
  14. {
  15. table[0] = 1ULL;
  16. }
  17. Choose_Table::Choose_Table (int Npower_ref)
  18. : Npower(Npower_ref), Npowerp1(Npower_ref + 1ULL)
  19. {
  20. dim = Npowerp1 * Npowerp1;
  21. // We can only go up to ULL_MAX:
  22. if (log(DP(ULLONG_MAX)) < DP(Npowerp1) * log(2.0))
  23. JSCerror("Choose_Table: too large to contruct.");
  24. table = new unsigned long long int[dim];
  25. (*this).Fill_table();
  26. }
  27. void Choose_Table::Fill_table()
  28. {
  29. table[0] = 1ULL;
  30. int n,m;
  31. for (n = 0; n <= Npower; ++n) {
  32. table[Npowerp1 * n] = 1ULL;
  33. for (m = 1; m < n; ++m) {
  34. table[Npowerp1 * n + m] = table[Npowerp1 * (n-1) + m - 1] + table[Npowerp1 * (n-1) + m];
  35. }
  36. table[Npowerp1 * n + n] = 1ULL;
  37. for (m = n+1; m <= Npower; ++m)
  38. table[Npowerp1 * n + m] = 0ULL;
  39. }
  40. }
  41. int Choose_Table::power()
  42. {
  43. return(Npower);
  44. }
  45. unsigned long long int Choose_Table::choose(int N, int M)
  46. {
  47. if (N < 0 || N > Npower) JSCerror("N out of bounds in choose(N,M).");
  48. if (M < 0 || M > Npower) JSCerror("M out of bounds in choose(N,M).");
  49. return(table[Npowerp1 * N + M]);
  50. }
  51. std::ostream& operator<< (std::ostream& s, Choose_Table& Ref_table)
  52. {
  53. s << endl;
  54. for (int n = 0; n <= Ref_table.power(); ++n) {
  55. for (int m = 0; m <= Ref_table.power(); ++m)
  56. s << Ref_table.choose(n, m) << " ";
  57. s << endl;
  58. }
  59. s << endl;
  60. return(s);
  61. }
  62. Choose_Table::~Choose_Table()
  63. {
  64. delete[] table;
  65. }
  66. } // namespace JSC