1 
2 
3 #include "comb/fact2perm.h"
4 // demo-include "comb/fact2perm-rot.cc"
5 #include "perm/perminvert.h"  // make_inverse()
6 // demo-include "perm/perminvert.cc"
7 #include "comb/mixedradix.h"
8 
9 //#include "perm/printcycles.h"
10 
11 #include "comb/mixedradix-modular-gray.h"
12 #include "comb/mixedradix-gslex.h"
13 #include "comb/mixedradix-gslex-alt.h"
14 #include "comb/mixedradix-gray.h"
15 #include "comb/mixedradix-endo.h"
16 #include "comb/mixedradix-endo-gray.h"
17 #include "comb/mixedradix-subset-lex.h"
18 #include "comb/mixedradix-sl-gray.h"
19 
20 #include "comb/comb-print.h"
21 
22 #include "comb/check-permgen.h"
23 #include "jjassert.h"
24 
25 #include "fxttypes.h"
26 #include "nextarg.h"  // NXARG()
27 #include "fxtio.h"
28 
29 
30 //% Generate all permutations from mixed radix (factorial) numbers.
31 
32 
33 int
main(int argc,char ** argv)34 main(int argc, char **argv)
35 {
36     ulong n = 4;
37     NXARG(n, "Number of elements to permute");
38     bool rq = 0;
39     NXARG(rq, "Whether to use rising factorial base.");
40     const bool dfz = true;  // whether to print dots for zeros
41     const ulong n1 = n - 1;
42 
43     mixedradix M(n1, rq);  // default
44 //    mixedradix_gray M(n1, rq);
45 //    mixedradix_subset_lex M(n1, rq);
46 //    mixedradix_sl_gray M(n1, rq);
47 //    mixedradix_modular_gray M(n1, rq);
48 //    mixedradix_gslex M(n1, rq);
49 //    mixedradix_gslex_alt M(n1, rq);
50 //    mixedradix_endo M(n1, rq);
51 //    mixedradix_endo_gray M(n1, rq);
52     M.print_nines(" Nines: ");  cout << endl;
53 
54     const ulong *a = M.data();  // factorial number
55     ulong *ia = new ulong[n1];  // factorial number for inverse permutation
56 
57     ulong *p = new ulong[n];  // permutation
58     ulong *ip = new ulong[n];  // inverse permutation
59 
60     ulong *t = new ulong[n1];  // aux for testing
61 
62     check_permgen C(n);  C.first(p);
63 
64     ulong ct = 0;
65     do
66     {
67         cout << " " << setw(3) << ct << ":";
68 
69         print_mixedradix("    ", a, n1, dfz);
70 
71         if ( rq )  rfact2perm_rot(a, n, p);
72         else       ffact2perm_rot(a, n, p);
73         print_perm("    ", p, n, dfz);
74 //        print_cycles("    ", p, n);
75 
76         cout << "      ";
77 
78         make_inverse(p, ip, n);
79         print_perm("    ", ip, n, dfz);
80 //        print_cycles("    ", ip, n);
81 
82 //        if ( rq ) perm2rfact_rot(ip, n, ia);
83 //        else      perm2ffact_rot(ip, n, ia);
84 //        print_mixedradix("    ", ia, n1, dfz);
85 
86 #if 1  // Testing that Xfact2perm() is inverse of perm2Xfact():
87         if ( rq )  perm2rfact_rot(p, n, t);
88         else       perm2ffact_rot(p, n, t);
89 //        print_mixedradix("   :: ", t, n1, dfz);
90         for (ulong j=0; j<n1; ++j)  { jjassert( t[j]==a[j] ); }
91 #endif
92 
93         ++ct;
94         cout << endl;
95 
96 //        if ( ct>6 ) return 0;
97 
98         jjassert( ! C.is_repeat() );
99     }
100     while ( M.next() );
101 
102     delete [] ia;
103     delete [] p;
104     delete [] ip;
105     delete [] t;
106 
107     return 0;
108 }
109 // -------------------------
110 
111 
112 
113 /// Emacs:
114 /// Local Variables:
115 /// MyRelDir: "demo/comb"
116 /// makefile-dir: "../../"
117 /// make-target: "1demo DSRC=demo/comb/fact2perm-rot-demo.cc"
118 /// make-target2: "1demo DSRC=demo/comb/fact2perm-rot-demo.cc DEMOFLAGS=-DTIMING"
119 /// End:
120 
121