]> www.ginac.de Git - ginac.git/blobdiff - ginac/inifcns.cpp
- permutation_sign() and shaker_sort() are no longer inlined
[ginac.git] / ginac / inifcns.cpp
index 2667215416129be392b21891aa2d16ed6bf89139..03acbc7f2f42d4c221905652a39b21cdd3e041e2 100644 (file)
@@ -533,31 +533,23 @@ static ex symm(const ex & e, exvector::const_iterator first, exvector::const_ite
 
        // Sort object vector, transform it into a list, and make a copy so we
        // will know which objects get substituted for which
-       exvector iv(first, last);
-       sort(iv.begin(), iv.end(), ex_is_less());
        exlist iv_lst;
-       iv_lst.insert(iv_lst.begin(), iv.begin(), iv.end());
+       iv_lst.insert(iv_lst.begin(), first, last);
+       shaker_sort(iv_lst.begin(), iv_lst.end(), ex_is_less());
        lst orig_lst(iv_lst);
 
-       // With n objects there are n! possible permutations
-       int num_perms = factorial(numeric(num)).to_int();
-
        // Loop over all permutations (the first permutation, which is the
        // identity, is unrolled)
        ex sum = e;
-       int i = 1;
-       do {
-               next_permutation(iv_lst.begin(), iv_lst.end(), ex_is_less());
+       while (next_permutation(iv_lst.begin(), iv_lst.end(), ex_is_less())) {
                ex term = e.subs(orig_lst, lst(iv_lst));
                if (asymmetric) {
                        exlist test_lst = iv_lst;
                        term *= permutation_sign(test_lst.begin(), test_lst.end(), ex_is_less());
                }
                sum += term;
-               i++;
-       } while (i < num_perms);
-
-       return sum / num_perms;
+       }
+       return sum / factorial(numeric(num));
 }
 
 ex symmetrize(const ex & e, exvector::const_iterator first, exvector::const_iterator last)