Générer des permutations qui ne sont pas des miroirs les uns des autres

Je veux générer des permutations de n nombres, où il n’y a pas deux permutations qui sont des inversions (le premier lu du dernier caractère au premier est identique au second). Par exemple, n = 3, je veux générer:

1 2 3 //but not 3 2 1 1 3 2 //but not 2 3 1 2 1 3 //but not 3 1 2 

Je me fiche de savoir lequel des deux sera généré. L’algorithme devrait être applicable pour n grand (> 20). Existe-t-il un tel algorithme ou un moyen de vérifier si les permutations générées sont un miroir de celles précédemment générées?

Utilisez std::next_permutation et ignorez les permutations dont le premier élément est plus grand que le dernier.

Non, par le matériel et les logiciels habituels jusqu’à nos jours, vous ne pouvez pas le faire, car le nombre de telles permutations est de 20! / 2> 10 ^ 10 * 2 ^ 20, il faut donc plusieurs années pour les générer.