That’s a really clear explanation 👌 — you’ve shown both why the construction avoids multiples of p and q, and why the mapping stays uniform. The note about % (p*q)
being reducible to a conditional subtraction is a nice touch too; exactly the kind of detail that matters if you’re tuning for performance.