1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 01:03:09 +00:00

Retire subfactor()

Directly lookup in Binomial[] table.
This commit is contained in:
Marco Costalba 2016-04-27 09:16:12 +02:00
parent 145c9d943b
commit f83a6f54e4

View file

@ -751,22 +751,6 @@ uint64_t encode_pawn(uint8_t pawns[], uint8_t *norm, Square *pos, int *factor, i
return idx; return idx;
} }
// place k like pieces on n squares
int subfactor(int k, int n)
{
assert(n > 0 && k > 0 && k <= n);
int numerator = n;
int denominator = 1;
for (int i = 1; i < k; ++i) {
numerator *= n - i;
denominator *= i + 1;
}
return numerator / denominator;
}
template<typename T> template<typename T>
uint64_t set_factors(T& p, int num, int order) uint64_t set_factors(T& p, int num, int order)
{ {
@ -779,7 +763,7 @@ uint64_t set_factors(T& p, int num, int order)
result *= p.hasUniquePieces ? 31332 : 462; result *= p.hasUniquePieces ? 31332 : 462;
} else { } else {
p.factor[i] = (int)result; p.factor[i] = (int)result;
result *= subfactor(p.norm[i], n); result *= Binomial[p.norm[i] - 1][n];
n -= p.norm[i]; n -= p.norm[i];
i += p.norm[i]; i += p.norm[i];
} }
@ -806,10 +790,10 @@ uint64_t calc_factors_pawn(int *factor, int num, int order, int order2, uint8_t
result *= Pfactor[norm[0] - 1][f]; result *= Pfactor[norm[0] - 1][f];
} else if (k == order2) { } else if (k == order2) {
factor[norm[0]] = (int)result; factor[norm[0]] = (int)result;
result *= subfactor(norm[norm[0]], 48 - norm[0]); result *= Binomial[norm[norm[0]] - 1][48 - norm[0]];
} else { } else {
factor[i] = (int)result; factor[i] = (int)result;
result *= subfactor(norm[i], n); result *= Binomial[norm[i] - 1][n];
n -= norm[i]; n -= norm[i];
i += norm[i]; i += norm[i];
} }