help-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-gsl] Why must k be less than n in a multiset?


From: Rhys Ulerich
Subject: Re: [Help-gsl] Why must k be less than n in a multiset?
Date: Fri, 9 Sep 2011 10:14:20 -0500

Hi Michael,

> I'm trying to create all multisets of length k=3 on sets of the form
> {1,...,n}, where n ranges from 1 to 9. So for n=1 I would expect to
> get only the multiset {{1,1,1}}; for n=2 I'd get {{1,1,1}}, {{1,1,2}},
> {{1,2,2}}, and {{2,2,2}}.

Quick aside, the returned values are in {0, ..., n-1} not {1, ..., n}.

> However, when I call gsl_multiset_calloc(n, 3) with n<3, I receive the 
> run-time error:
>> gsl: init.c:42: ERROR: multiset length k must be an integer less than or 
>> equal to n
> ...
> So my questions are (1) does anybody know why there is a check to
> ensure k<=n [in init.c at line 42] when this is not required of a multiset

It is a remnant of the code I modified to implement multisets.  I had
not needed anything further at the time and did not test the code for
k > n.  Sorry about that.

> (2) what is
> the best way to obtain the behaviour I'm after, hopefully without
> having to rewrite existing code that works for n=3 to 9 (and
> presumably higher)?

Just quickly, I've tried commenting out the following from init.c

if (k > n)
  {
    GSL_ERROR_VAL ("multiset length k must be an integer less than or
equal to n",
                      GSL_EDOM, 0);
  }

and running the following sample to accomplish the task you describe

#include <stdio.h>
#include <gsl/gsl_multiset.h>

int
main (void)
{
  gsl_multiset * c;
  size_t n;

  const int k = 3;
  for (n = 1; n <= 9; n++)
    {
      printf("n = %u\n", n);
      c = gsl_multiset_calloc (n, k);
      do
        {
          printf ("{");
          gsl_multiset_fprintf (stdout, c, " %u");
          printf (" }\n");
        }
      while (gsl_multiset_next (c) == GSL_SUCCESS);
      printf("\n");
      gsl_multiset_free (c);
    }

  return 0;
}

which appears to run just fine and gives the output following my
signature.  Would you please review that output to see that it matches
your expectations?  If it does, I will add this task as a test case to
multiset/test.c and will remove the overly restrictive check in
multiset/init.c.  In the meantime, you could just comment out the line
in your local copy of init.c and rebuild GSL.

- Rhys


Output from above code compiled against trunk with init.c lines commented out:

n = 1
{ 0 0 0 }

n = 2
{ 0 0 0 }
{ 0 0 1 }
{ 0 1 1 }
{ 1 1 1 }

n = 3
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 2 2 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 2 2 }
{ 2 2 2 }

n = 4
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 0 3 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 1 3 }
{ 0 2 2 }
{ 0 2 3 }
{ 0 3 3 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 1 3 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 3 3 }
{ 2 2 2 }
{ 2 2 3 }
{ 2 3 3 }
{ 3 3 3 }

n = 5
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 0 3 }
{ 0 0 4 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 1 3 }
{ 0 1 4 }
{ 0 2 2 }
{ 0 2 3 }
{ 0 2 4 }
{ 0 3 3 }
{ 0 3 4 }
{ 0 4 4 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 1 3 }
{ 1 1 4 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 2 4 }
{ 1 3 3 }
{ 1 3 4 }
{ 1 4 4 }
{ 2 2 2 }
{ 2 2 3 }
{ 2 2 4 }
{ 2 3 3 }
{ 2 3 4 }
{ 2 4 4 }
{ 3 3 3 }
{ 3 3 4 }
{ 3 4 4 }
{ 4 4 4 }

n = 6
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 0 3 }
{ 0 0 4 }
{ 0 0 5 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 1 3 }
{ 0 1 4 }
{ 0 1 5 }
{ 0 2 2 }
{ 0 2 3 }
{ 0 2 4 }
{ 0 2 5 }
{ 0 3 3 }
{ 0 3 4 }
{ 0 3 5 }
{ 0 4 4 }
{ 0 4 5 }
{ 0 5 5 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 1 3 }
{ 1 1 4 }
{ 1 1 5 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 2 4 }
{ 1 2 5 }
{ 1 3 3 }
{ 1 3 4 }
{ 1 3 5 }
{ 1 4 4 }
{ 1 4 5 }
{ 1 5 5 }
{ 2 2 2 }
{ 2 2 3 }
{ 2 2 4 }
{ 2 2 5 }
{ 2 3 3 }
{ 2 3 4 }
{ 2 3 5 }
{ 2 4 4 }
{ 2 4 5 }
{ 2 5 5 }
{ 3 3 3 }
{ 3 3 4 }
{ 3 3 5 }
{ 3 4 4 }
{ 3 4 5 }
{ 3 5 5 }
{ 4 4 4 }
{ 4 4 5 }
{ 4 5 5 }
{ 5 5 5 }

n = 7
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 0 3 }
{ 0 0 4 }
{ 0 0 5 }
{ 0 0 6 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 1 3 }
{ 0 1 4 }
{ 0 1 5 }
{ 0 1 6 }
{ 0 2 2 }
{ 0 2 3 }
{ 0 2 4 }
{ 0 2 5 }
{ 0 2 6 }
{ 0 3 3 }
{ 0 3 4 }
{ 0 3 5 }
{ 0 3 6 }
{ 0 4 4 }
{ 0 4 5 }
{ 0 4 6 }
{ 0 5 5 }
{ 0 5 6 }
{ 0 6 6 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 1 3 }
{ 1 1 4 }
{ 1 1 5 }
{ 1 1 6 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 2 4 }
{ 1 2 5 }
{ 1 2 6 }
{ 1 3 3 }
{ 1 3 4 }
{ 1 3 5 }
{ 1 3 6 }
{ 1 4 4 }
{ 1 4 5 }
{ 1 4 6 }
{ 1 5 5 }
{ 1 5 6 }
{ 1 6 6 }
{ 2 2 2 }
{ 2 2 3 }
{ 2 2 4 }
{ 2 2 5 }
{ 2 2 6 }
{ 2 3 3 }
{ 2 3 4 }
{ 2 3 5 }
{ 2 3 6 }
{ 2 4 4 }
{ 2 4 5 }
{ 2 4 6 }
{ 2 5 5 }
{ 2 5 6 }
{ 2 6 6 }
{ 3 3 3 }
{ 3 3 4 }
{ 3 3 5 }
{ 3 3 6 }
{ 3 4 4 }
{ 3 4 5 }
{ 3 4 6 }
{ 3 5 5 }
{ 3 5 6 }
{ 3 6 6 }
{ 4 4 4 }
{ 4 4 5 }
{ 4 4 6 }
{ 4 5 5 }
{ 4 5 6 }
{ 4 6 6 }
{ 5 5 5 }
{ 5 5 6 }
{ 5 6 6 }
{ 6 6 6 }

n = 8
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 0 3 }
{ 0 0 4 }
{ 0 0 5 }
{ 0 0 6 }
{ 0 0 7 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 1 3 }
{ 0 1 4 }
{ 0 1 5 }
{ 0 1 6 }
{ 0 1 7 }
{ 0 2 2 }
{ 0 2 3 }
{ 0 2 4 }
{ 0 2 5 }
{ 0 2 6 }
{ 0 2 7 }
{ 0 3 3 }
{ 0 3 4 }
{ 0 3 5 }
{ 0 3 6 }
{ 0 3 7 }
{ 0 4 4 }
{ 0 4 5 }
{ 0 4 6 }
{ 0 4 7 }
{ 0 5 5 }
{ 0 5 6 }
{ 0 5 7 }
{ 0 6 6 }
{ 0 6 7 }
{ 0 7 7 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 1 3 }
{ 1 1 4 }
{ 1 1 5 }
{ 1 1 6 }
{ 1 1 7 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 2 4 }
{ 1 2 5 }
{ 1 2 6 }
{ 1 2 7 }
{ 1 3 3 }
{ 1 3 4 }
{ 1 3 5 }
{ 1 3 6 }
{ 1 3 7 }
{ 1 4 4 }
{ 1 4 5 }
{ 1 4 6 }
{ 1 4 7 }
{ 1 5 5 }
{ 1 5 6 }
{ 1 5 7 }
{ 1 6 6 }
{ 1 6 7 }
{ 1 7 7 }
{ 2 2 2 }
{ 2 2 3 }
{ 2 2 4 }
{ 2 2 5 }
{ 2 2 6 }
{ 2 2 7 }
{ 2 3 3 }
{ 2 3 4 }
{ 2 3 5 }
{ 2 3 6 }
{ 2 3 7 }
{ 2 4 4 }
{ 2 4 5 }
{ 2 4 6 }
{ 2 4 7 }
{ 2 5 5 }
{ 2 5 6 }
{ 2 5 7 }
{ 2 6 6 }
{ 2 6 7 }
{ 2 7 7 }
{ 3 3 3 }
{ 3 3 4 }
{ 3 3 5 }
{ 3 3 6 }
{ 3 3 7 }
{ 3 4 4 }
{ 3 4 5 }
{ 3 4 6 }
{ 3 4 7 }
{ 3 5 5 }
{ 3 5 6 }
{ 3 5 7 }
{ 3 6 6 }
{ 3 6 7 }
{ 3 7 7 }
{ 4 4 4 }
{ 4 4 5 }
{ 4 4 6 }
{ 4 4 7 }
{ 4 5 5 }
{ 4 5 6 }
{ 4 5 7 }
{ 4 6 6 }
{ 4 6 7 }
{ 4 7 7 }
{ 5 5 5 }
{ 5 5 6 }
{ 5 5 7 }
{ 5 6 6 }
{ 5 6 7 }
{ 5 7 7 }
{ 6 6 6 }
{ 6 6 7 }
{ 6 7 7 }
{ 7 7 7 }

n = 9
{ 0 0 0 }
{ 0 0 1 }
{ 0 0 2 }
{ 0 0 3 }
{ 0 0 4 }
{ 0 0 5 }
{ 0 0 6 }
{ 0 0 7 }
{ 0 0 8 }
{ 0 1 1 }
{ 0 1 2 }
{ 0 1 3 }
{ 0 1 4 }
{ 0 1 5 }
{ 0 1 6 }
{ 0 1 7 }
{ 0 1 8 }
{ 0 2 2 }
{ 0 2 3 }
{ 0 2 4 }
{ 0 2 5 }
{ 0 2 6 }
{ 0 2 7 }
{ 0 2 8 }
{ 0 3 3 }
{ 0 3 4 }
{ 0 3 5 }
{ 0 3 6 }
{ 0 3 7 }
{ 0 3 8 }
{ 0 4 4 }
{ 0 4 5 }
{ 0 4 6 }
{ 0 4 7 }
{ 0 4 8 }
{ 0 5 5 }
{ 0 5 6 }
{ 0 5 7 }
{ 0 5 8 }
{ 0 6 6 }
{ 0 6 7 }
{ 0 6 8 }
{ 0 7 7 }
{ 0 7 8 }
{ 0 8 8 }
{ 1 1 1 }
{ 1 1 2 }
{ 1 1 3 }
{ 1 1 4 }
{ 1 1 5 }
{ 1 1 6 }
{ 1 1 7 }
{ 1 1 8 }
{ 1 2 2 }
{ 1 2 3 }
{ 1 2 4 }
{ 1 2 5 }
{ 1 2 6 }
{ 1 2 7 }
{ 1 2 8 }
{ 1 3 3 }
{ 1 3 4 }
{ 1 3 5 }
{ 1 3 6 }
{ 1 3 7 }
{ 1 3 8 }
{ 1 4 4 }
{ 1 4 5 }
{ 1 4 6 }
{ 1 4 7 }
{ 1 4 8 }
{ 1 5 5 }
{ 1 5 6 }
{ 1 5 7 }
{ 1 5 8 }
{ 1 6 6 }
{ 1 6 7 }
{ 1 6 8 }
{ 1 7 7 }
{ 1 7 8 }
{ 1 8 8 }
{ 2 2 2 }
{ 2 2 3 }
{ 2 2 4 }
{ 2 2 5 }
{ 2 2 6 }
{ 2 2 7 }
{ 2 2 8 }
{ 2 3 3 }
{ 2 3 4 }
{ 2 3 5 }
{ 2 3 6 }
{ 2 3 7 }
{ 2 3 8 }
{ 2 4 4 }
{ 2 4 5 }
{ 2 4 6 }
{ 2 4 7 }
{ 2 4 8 }
{ 2 5 5 }
{ 2 5 6 }
{ 2 5 7 }
{ 2 5 8 }
{ 2 6 6 }
{ 2 6 7 }
{ 2 6 8 }
{ 2 7 7 }
{ 2 7 8 }
{ 2 8 8 }
{ 3 3 3 }
{ 3 3 4 }
{ 3 3 5 }
{ 3 3 6 }
{ 3 3 7 }
{ 3 3 8 }
{ 3 4 4 }
{ 3 4 5 }
{ 3 4 6 }
{ 3 4 7 }
{ 3 4 8 }
{ 3 5 5 }
{ 3 5 6 }
{ 3 5 7 }
{ 3 5 8 }
{ 3 6 6 }
{ 3 6 7 }
{ 3 6 8 }
{ 3 7 7 }
{ 3 7 8 }
{ 3 8 8 }
{ 4 4 4 }
{ 4 4 5 }
{ 4 4 6 }
{ 4 4 7 }
{ 4 4 8 }
{ 4 5 5 }
{ 4 5 6 }
{ 4 5 7 }
{ 4 5 8 }
{ 4 6 6 }
{ 4 6 7 }
{ 4 6 8 }
{ 4 7 7 }
{ 4 7 8 }
{ 4 8 8 }
{ 5 5 5 }
{ 5 5 6 }
{ 5 5 7 }
{ 5 5 8 }
{ 5 6 6 }
{ 5 6 7 }
{ 5 6 8 }
{ 5 7 7 }
{ 5 7 8 }
{ 5 8 8 }
{ 6 6 6 }
{ 6 6 7 }
{ 6 6 8 }
{ 6 7 7 }
{ 6 7 8 }
{ 6 8 8 }
{ 7 7 7 }
{ 7 7 8 }
{ 7 8 8 }
{ 8 8 8 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]