熱心なプログラミングを行っているときに、この問題に遭遇しました。問題は次のように表現できます。
マルチセット A について、P(A) が A のすべての可能な順列のセットを表すとします。P(A) は、等価関係が「循環シフトによって関連付けられる可能性がある」状態で、等価クラスである互いに素なサブセットに自然に分割されます。それぞれから正確に 1 つのメンバーを生成することにより、これらすべての等価クラスを列挙します。
たとえば、マルチセット {0, 1, 1, 2} を考えてみましょう。順列 "0112" と "1201" は一意の順列ですが、後者は前者を循環シフトすることで見つけることができ、逆も同様です。目的のアルゴリズムで両方を生成することはできません。
もちろん、強引なアプローチも可能です。循環重複に関係なく、任意のマルチセット置換アルゴリズムを使用して順列を生成し、以前の結果との比較によって見つかった重複を破棄するだけです。ただし、これは実際には非効率的である傾向があります。必要なアルゴリズムは、簿記がゼロではないにしても、最小限で済む必要があります。
この問題への洞察は深く感謝しています。