srecord noeq FindAllLSFRTriplets(int bits) { // Try triplets that are actually just pairs or even a single xorshift // (these will be indicated by a, b or c being 0) settable bool tryDegenerateTriplets = true; event testingTriplet(int[] triplet, CheckLSFRTriplet checker); event tripletFound(int[] triplet); event tripletRejected(int[] triplet, CheckLSFRTriplet checker); ItIt> iterator; long steps; int cycleLength() { ret (1 << bits)-1; } void init { iterator if null = outerProduct(repF(3, -> virtualCountList(tryDegenerateTriplets ? 0 : 1, bits))); } long expectedSteps() { long n = tryDegenerateTriplets ? bits : bits-1; ret n*n*n; } // return next working triplet or null if end of search int[] next() { init(); for (L t : iterator) { int[] triplet = new int[] {t.get(0), t.get(1), t.get(2)}; ++steps; CheckLSFRTriplet checker = new(bits, triplet); testingTriplet(triplet, checker); if (checker!) { tripletFound(triplet); ret triplet; } else tripletRejected(triplet, checker); } null; } L getAll() { new L workingTriplets; int[] triplet; while ((triplet = next()) != null) workingTriplets.add(triplet); ret workingTriplets; } }