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