00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #include <algebramix/permutation.hpp>
00014 
00016 
00017 namespace mmx {
00018 
00019 permutation
00020 transposition (nat i, nat j, nat n) {
00021   vector<nat> v= id_vector (n);
00022   v[i]= j;
00023   v[j]= i;
00024   return permutation (v);
00025 }
00026 
00027 permutation
00028 cycle (nat n, int plus) {
00029   if (plus >= 0) plus= ((nat) plus) % n;
00030   else plus= (n-1) - (((nat) (-1-plus)) % n);
00031   vector<nat> v= id_vector (n);
00032   for (nat i=0; i<n; i++)
00033     if (i + plus < n) v[i]= i + plus;
00034     else v[i]= i + plus - n;
00035   return permutation (v);
00036 }
00037 
00038 nat
00039 nr_transpositions (const permutation& p) {
00040   nat s= 0, n= N(p);
00041   for (nat i=0; i<n; i++)
00042     if (p (i) > i) s += p (i) - i;
00043   return s;
00044 }
00045 
00046 permutation
00047 operator * (const permutation& p1, const permutation& p2) {
00048   nat n= N(p1);
00049   ASSERT (N(p2) == n, "sizes do not match");
00050   vector<nat> v= fill<nat> (n);
00051   for (nat i=0; i<n; i++) v[i]= p1 (p2 (i));
00052   return permutation (v);
00053 }
00054 
00055 permutation
00056 invert (const permutation& p) {
00057   nat n= N(p);
00058   vector<nat> v= fill<nat> (n);
00059   for (nat i=0; i<n; i++) v[p(i)]= i;
00060   return permutation (v);
00061 }
00062 
00063 }