Next: , Previous: Permutations in cyclic form, Up: Permutations


9.9 Examples

The example program below creates a random permutation (by shuffling the elements of the identity) and finds its inverse.

     #include <stdio.h>
     #include <gsl/gsl_rng.h>
     #include <gsl/gsl_randist.h>
     #include <gsl/gsl_permutation.h>
     
     int
     main (void) 
     {
       const size_t N = 10;
       const gsl_rng_type * T;
       gsl_rng * r;
     
       gsl_permutation * p = gsl_permutation_alloc (N);
       gsl_permutation * q = gsl_permutation_alloc (N);
     
       gsl_rng_env_setup();
       T = gsl_rng_default;
       r = gsl_rng_alloc (T);
     
       printf ("initial permutation:");  
       gsl_permutation_init (p);
       gsl_permutation_fprintf (stdout, p, " %u");
       printf ("\n");
     
       printf (" random permutation:");  
       gsl_ran_shuffle (r, p->data, N, sizeof(size_t));
       gsl_permutation_fprintf (stdout, p, " %u");
       printf ("\n");
     
       printf ("inverse permutation:");  
       gsl_permutation_inverse (q, p);
       gsl_permutation_fprintf (stdout, q, " %u");
       printf ("\n");
     
       gsl_permutation_free (p);
       gsl_permutation_free (q);
       gsl_rng_free (r);
     
       return 0;
     }

Here is the output from the program,

     $ ./a.out
     initial permutation: 0 1 2 3 4 5 6 7 8 9
      random permutation: 1 3 5 2 7 6 0 4 9 8
     inverse permutation: 6 0 3 1 7 2 5 4 9 8

The random permutation p[i] and its inverse q[i] are related through the identity p[q[i]] = i, which can be verified from the output.

The next example program steps forwards through all possible third order permutations, starting from the identity,

     #include <stdio.h>
     #include <gsl/gsl_permutation.h>
     
     int
     main (void) 
     {
       gsl_permutation * p = gsl_permutation_alloc (3);
     
       gsl_permutation_init (p);
     
       do 
        {
           gsl_permutation_fprintf (stdout, p, " %u");
           printf ("\n");
        }
       while (gsl_permutation_next(p) == GSL_SUCCESS);
     
       gsl_permutation_free (p);
     
       return 0;
     }

Here is the output from the program,

     $ ./a.out
      0 1 2
      0 2 1
      1 0 2
      1 2 0
      2 0 1
      2 1 0

The permutations are generated in lexicographic order. To reverse the sequence, begin with the final permutation (which is the reverse of the identity) and replace gsl_permutation_next with gsl_permutation_prev.