permutation maths
parent
87c023094b
commit
32a01e6bfd
|
@ -0,0 +1,67 @@
|
||||||
|
|
||||||
|
// Utilities for generating sets of coordinates based on
|
||||||
|
// permutations, even permutations and changes of sign.
|
||||||
|
// Based on https://www.qfbox.info/epermute
|
||||||
|
|
||||||
|
|
||||||
|
function pandita(a) {
|
||||||
|
const n = a.length;
|
||||||
|
for( let k = n - 2; k >= 0; k-- ) {
|
||||||
|
if( a[k] < a[k + 1] ) {
|
||||||
|
for( let l = n - 1; l >= 0; l-- ) {
|
||||||
|
if( a[k] < a[l] ) {
|
||||||
|
const tmp = a[k];
|
||||||
|
a[k] = a[l];
|
||||||
|
a[l] = tmp;
|
||||||
|
const revtail = a.slice(k + 1);
|
||||||
|
revtail.reverse();
|
||||||
|
for( let i = 0; i < revtail.length; i++ ) {
|
||||||
|
a[k + 1 + i] = revtail[i];
|
||||||
|
}
|
||||||
|
return Math.floor(revtail.length / 2) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("Shouldn't get here");
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function permutations(a) {
|
||||||
|
a.sort();
|
||||||
|
const ps = [ [...a] ];
|
||||||
|
while( pandita(a) ) {
|
||||||
|
ps.push([...a]);
|
||||||
|
}
|
||||||
|
return ps;
|
||||||
|
}
|
||||||
|
|
||||||
|
function permutations_even(a) {
|
||||||
|
a.sort();
|
||||||
|
let parity = 'even';
|
||||||
|
const ps = [ [...a] ];
|
||||||
|
let running = true;
|
||||||
|
while( running ) {
|
||||||
|
const s = pandita(a);
|
||||||
|
if( s ) {
|
||||||
|
if( parity === 'even' ) {
|
||||||
|
if( s % 2 === 1 ) {
|
||||||
|
parity = 'odd';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if( s % 2 === 1 ) {
|
||||||
|
parity = 'even';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( parity === 'even' ) {
|
||||||
|
ps.push([...a]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ps;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue