Question spawned from this one. The problem can be formulated as follows:
Given two positive integers n and m, with m <= n, is there a way to find a suite of numbers, which cycles and covers all possible values from 0 to n?
As a basic example, if we take 3 as a number, for whatever number current between 0 and 3, we can compute the next value as:
next = (current+3) % 4
This will cycle. For instance: 1 -> 0 -> 3 -> 2 -> 1 etc. I found this solution by “chance” and it is even general ((i + n) % (n + 1) for any n), I cannot prove it mathematically. And it is a little too obvious.
Are there better ways to generate such a permutation?
I’m not sure what you intend
min the question to refer to, or how you’re defining “a suite of numbers”). However, one way of getting a cycle of number is to use a recursion (or iteration) of the form:for some function f. For example, linear congruential RNGs use the iteration:
They don’t always produce all values from 0 to m-1, but under certain circumstances they do:
(This is the Hull-Dobell theorem.)
Note that a, c == 1 satisfies the above criteria for any m. Futhermore, if m is prime, any values of a and c satisify the criteria, and if m is a power of 2, then the criteria are satisfied by any a, c such that a == 1 mod 4 and c == 1 mod 2. However, for certain values of m (eg. 6), the only value of a which will work is 1.
This might not qualify as “stateless”, but I don’t think that there is any strictly stateless solution; for example, you might look for some function
fsuch that:is a permutation of
so that you could generate the cycle by calling
f(i)for successive values ofi. But that’s still a state, since you have to remember the last value ofiyou used,