The reason you get out of range values is that although fetchXX
will produce a value in range, the + o
spoils this property. The XOR operation may sometimes bring it back in range, but not always.
So you should take the modulo of the value after + o
. The XOR operation will never bring it out of range, so that can stay as it is.
Secondly, to test whether no duplicates are generated, you would need to fix one of the two arguments passed to the buildXX
function and only vary the other. It seems more logical to me to freeze the second argument.
So this is what it would look like:
const fetch = (x, o) => {
if (x >= o) {
return x
} else {
const v = (x * x) % o
return (x <= o / 2) ? v : o - v
}
}
const fetch16 = (x) => fetch(x, 65519)
const fetch8 = (x) => fetch(x, 251)
// the last number can be anything.
const build16 = (x, o) => fetch16((fetch16(x) + o) % 65536 ^ 42703)
const build8 = (x, o) => fetch8((fetch8(x) + o) % 256 ^ 101)
const j = 115; // If you don't want duplicates, either i or j should stay fixed
let i = 0
let invalid = [];
let valid = new Set;
while (i <= 255) { // <-- small fix here!
let x = build8(i, j); // To test, you can swap i and j here, and run again.
if (x > 255) {
invalid.push([ i, j, x ]);
} else {
valid.add(x);
}
i++;
}
console.log("invalid:", JSON.stringify(invalid));
console.log("count of valid:", valid.size);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…