Consider 2 positive integers $n>0$ and $m>0$ (that can be arbitrarily large).
Is there a mathematical method or an algorithm (no brute force) to find the first positive solution $k >0$ of the equation : $$(n+1 - k)\mod (n+1) =k\mod (m +1) $$ For example:
- if $n = 2$ and $m = 10$, $k = 13$ because : $(3 - 13) \mod 4 = 2 = 13 \mod 11$
- if $n = 10$ and $m = 2$, $k = 10$ because : $(11 - 10) \mod 11 = 1 = 10 \mod 3$
- if $n = 7$ and $m = 9$, $k = 4$ because : $(8 - 4) \mod 8 = 4 = 4 \mod 9$
For now, I have tried to consider the equation : $$f(n+1-x,n+1)=f(x,m+1)$$ where $f(x,k)=x-k\left\lfloor \frac{x}{k} \right\rfloor$
But it didn't lead to something interessant. I finally got a relatively efficient algorithm and now wonder if there is a closed formula or an improved algorithm :
def f(n, m):
if n == m:
return (n + 1) // 2 if n % 2 else n + 1
if n % 2 and m >= (n + 1) // 2:
return (n + 1) // 2
if n < m:
a, b = 0, n + 1
while 1:
k = (a + b) // 2
if (n + 1 - k) % (n + 1) == k % (m + 1):
return k
b += n + 1
if b > a + 2 * (n + 1):
a += m + 1
b = (a // (n + 1)) * (n + 1)
while b < a:
b += n + 1
else:
a, b = ((n + 1) // (m + 1)) * (m + 1), n + 1
while b - (a - (m + 1)) <= 2 * (m + 1):
a -= m + 1
while 1:
k = (a + b) // 2
if (n + 1 - k) % (n + 1) == k % (m + 1):
return k
if a + m + 1 < b:
a += m + 1
else:
b += n + 1
a = (b // (m + 1)) * (m + 1)
while b - (a - (m + 1)) <= 2 * (m + 1):
a -= m + 1
return 0