http://qs321.pair.com?node_id=1198531


in reply to Re: Faster alternative to Math::Combinatorics
in thread Faster alternative to Math::Combinatorics

I wrote my own Permutation module in this post .. but it looks like we may have different ideas about a permutation. Your example doesn't list all of the permutations of (0, 2, 3) in an array of four elements .. it just has arrays where the elements exist in ascending order. For example, (0, 0, 2, 0) isn't in your list, and I can't tell if that omission is intentional or not.

It's intentional — I'm only looking for unordered tuples. Think of it as simultaneously drawing w (e.g. 3) balls from an urn containing at least w balls each marked n for any element of the underlying list (e.g. (0, 2, 3)). Generating all possible permutations would be quite easy, otherwise.

I actually briefly entertained the thought of generating all possible tuples and then removing ones that are in the same equivalence class as previously-seen ones, but for larger w and longer lists, this would take a fair amount of time and memory. w won't go beyond 8, but the lists might be arbitrarily long, at least in theory.

(Without having checked I actually have a gut feeling that this is what Math::Combinatorics might be doing under the hood — it would explain why it's so slow, and why the first multisets I draw from it appear much faster than the later ones!)

In any case, I'd write code to do the deed myself, and perhaps benchmark it against the module you've chosen -- it could be that your code is faster because it has less overhead. If that quick test fails, you may have to put on your thinking cap and simplify the algorithm. Or allocate a couple of hours to generate the test cases.

Yeah, that's definitely an option. But I'm lazy (it's one of the chief virtues of a programmer!), and therefore prefer to, in order:

  1. Find CPAN modules that do what I want;
  2. Get the brothers and sister on Perlmonks to write code for me... oops, did I say that out loud? Of course, I actually mean:
  3. Get ideas, pointers to known standard algorithms etc. from Perlmonks;
  4. Solve the (mathematical) problem myself and then write my own code.

Thanks for taking the time to reply, BTW!

  • Comment on Re^2: Faster alternative to Math::Combinatorics

Replies are listed 'Best First'.
Re^3: Faster alternative to Math::Combinatorics
by Anonymous Monk on Sep 01, 2017 at 16:55 UTC
    I'm only looking for unordered tuples
    The mathematical terminology is kind of backwards from the computer science terminology here. You mean that the order of the tuple doesn't matter, and you've put your examples in numerically ascending sequence for neatness. A programmer looks at that and says, "those tuples are ordered."

      I know, it's a bit confusing. That's why I wrote:

      I'm trying to generate all multisets (bags) of a specific total "weight" (let's call it w), where each element comes from a given list (of numbers, in this case), and each list element may have multiplicity 0..w in each multiset.

      and:

      The order in which the multisets itself are generated isn't important to me either, BTW. I've only listed them in order for the sake of readability.

      I'm sure there's standard terms for these, too, terms that I simply don't know.

        If I understand you well, I think a selection of items from a set where the selection order is irrelevant is called a combination. See https://en.wikipedia.org/wiki/Combination. Note that combinations can be with or without repetitions.

        Perhaps using this term might help you searching the Internet for algorithms.