Tutorial illustrating the use of TMath::Permute can be run with:
root > .x permute.C
root > .x permute.C+ with ACLIC
TMath::Permute simple test
==========================
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba
Found 24 permutations = 4!
TMath::Permute simple test with repetition
==========================================
aabbc
aabcb
aacbb
ababc
abacb
abbac
abbca
abcab
abcba
acabb
acbab
acbba
baabc
baacb
babac
babca
bacab
bacba
bbaac
bbaca
bbcaa
bcaab
bcaba
bcbaa
caabb
cabab
cabba
cbaab
cbaba
cbbaa
Found 30 permutations = 5!/(2! 2!)
TMath::Permute fancy test
=========================
This is a program to calculate the solution to the following problem
Find the equivalence between letters and numbers so that
NINE*THREE = NEUF*TROIS
Solution found!
T=1 N=9 E=6 S=7 F=8 H=3 R=2 I=0 O=5 U=4
NINE=9096 THREE=13266 NEUF=9648 TROIS=12507
NINE*THREE = NEUF*TROIS = 120667536
int permuteSimple1 ()
{
printf("\nTMath::Permute simple test\n");
printf("==========================\n");
char aa='a';
for(i=0; i<4; i++)
a[i]=i;
do {
icount++;
for(
Int_t i=0;i<4;printf(
"%c",
static_cast<char>(aa+
a[i++])));
printf("\n");
printf("Found %d permutations = 4!\n",icount);
return 0;
}
int permuteSimple2 ()
{
printf("\nTMath::Permute simple test with repetition\n");
printf("==========================================\n");
char aa='a'-1;
for(i=0; i<6; i++)
a[i]=(i+2)/2;
do {
icount++;
for(
Int_t i=0;i<5;printf(
"%c",
static_cast<char>(aa+
a[i++])));
printf("\n");
printf("Found %d permutations = 5!/(2! 2!)\n",icount);
return 0;
}
{
Int_t nine, three, neuf, trois;
printf("\nTMath::Permute fancy test\n");
printf("=========================\n");
printf("This is a program to calculate the solution to the following problem\n");
printf("Find the equivalence between letters and numbers so that\n\n");
printf(" NINE*THREE = NEUF*TROIS\n\n");
for(
Int_t ii=0; ii<10; ii++)
a[ii]=ii;
do {
nine=((
n*10+i)*10+
n)*10+
e;
neuf=((
n*10+
e)*10+u)*10+
f;
three=(((t*10+
h)*10+
r)*10+
e)*10+
e;
trois=(((t*10+
r)*10+o)*10+i)*10+
s;
if(nine*three==neuf*trois) {
printf("Solution found!\n\n");
printf(
"T=%d N=%d E=%d S=%d F=%d H=%d R=%d I=%d O=%d U=%d\n",t,
n,
e,
s,
f,
h,
r,i,o,u);
printf("NINE=%d THREE=%d NEUF=%d TROIS=%d\n",nine,three,neuf,trois);
printf("NINE*THREE = NEUF*TROIS = %d\n",neuf*trois);
return 0;
}
printf("No solutions found -- something is wrong here!\n");
return 0;
}
void permute() {
permuteSimple1();
permuteSimple2();
permuteFancy();
}
static constexpr double s
Bool_t Permute(Int_t n, Int_t *a)
Simple recursive algorithm to find the permutations of n natural numbers, not necessarily all distinc...
- Author
- Federico Carminati
Definition in file permute.C.