actually I was wrong about simplicity of M-H algorithm
public static double[][] getHarvilleMatrixFast(double[] x) {
double[][] p = new double[x.length][x.length];
double[] w = new double[(0x1 << (x.length))];
w[0] = 1;
double r, t;
for (int f = 1; f <= x.length; f++)
for (int ns = 1; ns < w.length; ns++)
if (Integer.bitCount(ns) == f) {
r = 0;
for (int i = 0; i < x.length; i++)
if (((0x1 << i) & ns) == 0) r += x[i];
for (int i = 0; i < x.length; i++)
if (((0x1 << i) & ns) != 0) {
t = x[i] / (x[i] + r) * w[ns ^ (0x1 << i)];
p[i][f - 1] += t;
w[ns] += t;
}
}
return p;
}
my understanding of it is quite different to these imo advanced operations
advanced enough that it makes me not to want to spend my time exploring it
by now it's enough that I understand how to use the result matrix
matrix[2][0] = the chance of the 3rd player (2+1) will finish first (0+1)
I contact with pioSolver creator
he gave me links to manuals
and I think that I have opportunity to get answers from him