GNU Scientific Library – Reference Manual: Permutation Examples

Next: Permutation References and Further Reading, Previous: Permutations in cyclic form, Up: Permutations [Index]

### 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`.

Next: Permutation References and Further Reading, Previous: Permutations in cyclic form, Up: Permutations [Index]