It should include GCD (banks, step); your argument that this is correct.
Try this for several different steps and see what happens for the number of banks = b = 8 .
# generated with the calc(1) function define f(s) { print s, " | ", lcm(s,8), " | ", gcd(s,8), " | ", 8/lcm(s,8), " | ", 8/gcd(s,8) }` stride | LCM(s,b) | GCF(s,b) | b/LCM(s,b) | b/GCF(s,b) 1 | 8 | 1 | 1 | 8
b / LCM (s, b) is always <= 1, so it always predicts conflicts.
I think that GCF (aka GCD) looks right for the step values โโthat I have looked so far. You have a problem only if the step does not distribute the circulation among all banks and that is indicated by b / GCF (s, b).
Stride = 8 must be the worst using the same pot every time. gcd (8,8) = lcm (8,8) = 8. Thus, both expressions give 8/8 = 1, which is less than the time of bank occupation / recovery, which allows you to correctly predict conflicts.
Stride = 1, of course, the best case (no conflicts, if there are enough banks to hide the busy time). gcd (8,1) = 1 does not correctly predict conflicts: (8/1 = 8, which is at least 6). lcm (8,1) = 8. ( 8/8 < 6 true) incorrectly predicts conflicts.